wisp
Version:
Homoiconic JS with clojure syntax, s-expressions & macros
779 lines • 137 kB
JavaScript
{
var _ns_ = {
id: 'wisp.expander',
doc: 'wisp syntax and macro expander module'
};
var wisp_ast = require('./ast');
var meta = wisp_ast.meta;
var withMeta = wisp_ast.withMeta;
var isSymbol = wisp_ast.isSymbol;
var isKeyword = wisp_ast.isKeyword;
var keyword = wisp_ast.keyword;
var isQuote = wisp_ast.isQuote;
var symbol = wisp_ast.symbol;
var namespace = wisp_ast.namespace;
var name = wisp_ast.name;
var gensym = wisp_ast.gensym;
var isUnquote = wisp_ast.isUnquote;
var isUnquoteSplicing = wisp_ast.isUnquoteSplicing;
var wisp_sequence = require('./sequence');
var isList = wisp_sequence.isList;
var list = wisp_sequence.list;
var conj = wisp_sequence.conj;
var partition = wisp_sequence.partition;
var seq = wisp_sequence.seq;
var repeatedly = wisp_sequence.repeatedly;
var isEmpty = wisp_sequence.isEmpty;
var map = wisp_sequence.map;
var mapv = wisp_sequence.mapv;
var vec = wisp_sequence.vec;
var set = wisp_sequence.set;
var isEvery = wisp_sequence.isEvery;
var concat = wisp_sequence.concat;
var first = wisp_sequence.first;
var second = wisp_sequence.second;
var third = wisp_sequence.third;
var rest = wisp_sequence.rest;
var last = wisp_sequence.last;
var mapcat = wisp_sequence.mapcat;
var nth = wisp_sequence.nth;
var butlast = wisp_sequence.butlast;
var interleave = wisp_sequence.interleave;
var cons = wisp_sequence.cons;
var count = wisp_sequence.count;
var take = wisp_sequence.take;
var dissoc = wisp_sequence.dissoc;
var some = wisp_sequence.some;
var assoc = wisp_sequence.assoc;
var reduce = wisp_sequence.reduce;
var filter = wisp_sequence.filter;
var isSeq = wisp_sequence.isSeq;
var zipmap = wisp_sequence.zipmap;
var drop = wisp_sequence.drop;
var lazySeq = wisp_sequence.lazySeq;
var range = wisp_sequence.range;
var reverse = wisp_sequence.reverse;
var dorun = wisp_sequence.dorun;
var mapIndexed = wisp_sequence.mapIndexed;
var wisp_runtime = require('./runtime');
var isNil = wisp_runtime.isNil;
var isDictionary = wisp_runtime.isDictionary;
var isVector = wisp_runtime.isVector;
var keys = wisp_runtime.keys;
var get = wisp_runtime.get;
var vals = wisp_runtime.vals;
var isString = wisp_runtime.isString;
var isNumber = wisp_runtime.isNumber;
var isBoolean = wisp_runtime.isBoolean;
var isDate = wisp_runtime.isDate;
var isRePattern = wisp_runtime.isRePattern;
var isEven = wisp_runtime.isEven;
var isOdd = wisp_runtime.isOdd;
var isEqual = wisp_runtime.isEqual;
var max = wisp_runtime.max;
var inc = wisp_runtime.inc;
var dec = wisp_runtime.dec;
var dictionary = wisp_runtime.dictionary;
var merge = wisp_runtime.merge;
var subs = wisp_runtime.subs;
var wisp_string = require('./string');
var split = wisp_string.split;
var join = wisp_string.join;
var capitalize = wisp_string.capitalize;
}
var __macros__ = exports.__macros__ = {};
var expand = function expand(expander, form, env) {
return function () {
var metadataø1 = meta(form) || {};
var parmasø1 = rest(form);
var implicitø1 = map(function ($1) {
return isEqual('&form', $1) ? form : isEqual('&env', $1) ? env : 'else' ? $1 : void 0;
}, (meta(expander) || 0)['implicit'] || []);
var paramsø1 = vec(concat(implicitø1, vec(rest(form))));
var expansionø1 = expander.apply(void 0, paramsø1);
return expansionø1 ? withMeta(expansionø1, conj(metadataø1, meta(expansionø1))) : expansionø1;
}.call(this);
};
var installMacro = exports.installMacro = function installMacro(op, expander) {
return (__macros__ || 0)[name(op)] = expander;
};
var macro = function macro(op) {
return isSymbol(op) && (__macros__ || 0)[name(op)];
};
var isDotSyntax = exports.isDotSyntax = function isDotSyntax(op) {
return isSymbol(op) && '.' === name(op);
};
var isMethodSyntax = exports.isMethodSyntax = function isMethodSyntax(op) {
return function () {
var idø1 = isSymbol(op) && name(op);
return idø1 && '.' === first(idø1) && !('-' === second(idø1)) && !('.' === idø1);
}.call(this);
};
var isFieldSyntax = exports.isFieldSyntax = function isFieldSyntax(op) {
return function () {
var idø1 = isSymbol(op) && name(op);
return idø1 && '.' === first(idø1) && '-' === second(idø1);
}.call(this);
};
var isNewSyntax = exports.isNewSyntax = function isNewSyntax(op) {
return function () {
var idø1 = isSymbol(op) && name(op);
return idø1 && '.' === last(idø1) && !('.' === idø1);
}.call(this);
};
var methodSyntax = exports.methodSyntax = function methodSyntax(op, target) {
var params = Array.prototype.slice.call(arguments, 2);
return function () {
var opMetaø1 = meta(op);
var formStartø1 = (opMetaø1 || 0)['start'];
var targetMetaø1 = meta(target);
var memberø1 = withMeta(symbol(subs(name(op), 1)), conj(opMetaø1, {
'start': {
'line': (formStartø1 || 0)['line'],
'column': inc((formStartø1 || 0)['column'])
}
}));
var agetø1 = withMeta(symbol(void 0, 'aget'), conj(opMetaø1, {
'end': {
'line': (formStartø1 || 0)['line'],
'column': inc((formStartø1 || 0)['column'])
}
}));
var methodø1 = withMeta(list.apply(void 0, [agetø1].concat([target], [list.apply(void 0, [symbol(void 0, 'quote')].concat([memberø1]))])), conj(opMetaø1, { 'end': (meta(target) || 0)['end'] }));
return isNil(target) ? (function () {
throw Error('Malformed method expression, expecting (.method object ...)');
})() : list.apply(void 0, [methodø1].concat(vec(params)));
}.call(this);
};
var fieldSyntax = exports.fieldSyntax = function fieldSyntax(field, target) {
var more = Array.prototype.slice.call(arguments, 2);
return function () {
var metadataø1 = meta(field);
var startø1 = (metadataø1 || 0)['start'];
var endø1 = (metadataø1 || 0)['end'];
var memberø1 = withMeta(symbol(subs(name(field), 2)), conj(metadataø1, {
'start': {
'line': (startø1 || 0)['line'],
'column': (startø1 || 0)['column'] + 2
}
}));
return isNil(target) || count(more) ? (function () {
throw Error('Malformed member expression, expecting (.-member target)');
})() : list.apply(void 0, [symbol(void 0, 'aget')].concat([target], [list.apply(void 0, [symbol(void 0, 'quote')].concat([memberø1]))]));
}.call(this);
};
var dotSyntax = exports.dotSyntax = function dotSyntax(op, target, field) {
var params = Array.prototype.slice.call(arguments, 3);
!isSymbol(field) ? (function () {
throw Error('Malformed . form');
})() : void 0;
return function () {
var _fieldø1 = name(field);
return ('-' === first(_fieldø1) ? fieldSyntax : methodSyntax).apply(void 0, [
symbol('' + '.' + _fieldø1),
target
].concat(params));
}.call(this);
};
var newSyntax = exports.newSyntax = function newSyntax(op) {
var params = Array.prototype.slice.call(arguments, 1);
return function () {
var idø1 = name(op);
var idMetaø1 = (idø1 || 0)['meta'];
var renameø1 = subs(idø1, 0, dec(count(idø1)));
var constructorø1 = withMeta(symbol(renameø1), conj(idMetaø1, {
'end': {
'line': ((idMetaø1 || 0)['end'] || 0)['line'],
'column': dec(((idMetaø1 || 0)['end'] || 0)['column'])
}
}));
var operatorø1 = withMeta(symbol(void 0, 'new'), conj(idMetaø1, {
'start': {
'line': ((idMetaø1 || 0)['end'] || 0)['line'],
'column': dec(((idMetaø1 || 0)['end'] || 0)['column'])
}
}));
return list.apply(void 0, [symbol(void 0, 'new')].concat([constructorø1], vec(params)));
}.call(this);
};
var keywordInvoke = exports.keywordInvoke = function keywordInvoke() {
switch (arguments.length) {
case 2:
var keyword = arguments[0];
var target = arguments[1];
return list.apply(void 0, [symbol(void 0, 'get')].concat([target], [keyword]));
case 3:
var keyword = arguments[0];
var target = arguments[1];
var default_ = arguments[2];
return list.apply(void 0, [symbol(void 0, 'get')].concat([target], [keyword], [default_]));
default:
throw RangeError('Wrong number of arguments passed');
}
};
var desugar = function desugar(expander, form) {
return function () {
var desugaredø1 = expander.apply(void 0, vec(form));
var metadataø1 = conj({}, meta(form), meta(desugaredø1));
return withMeta(desugaredø1, metadataø1);
}.call(this);
};
var macroexpand1 = exports.macroexpand1 = function macroexpand1(form, env) {
return function () {
var opø1 = isList(form) && first(form);
var expanderø1 = macro(opø1);
return expanderø1 ? expand(expanderø1, form, env) : isKeyword(opø1) ? desugar(keywordInvoke, form) : isDotSyntax(opø1) ? desugar(dotSyntax, form) : isFieldSyntax(opø1) ? desugar(fieldSyntax, form) : isMethodSyntax(opø1) ? desugar(methodSyntax, form) : isNewSyntax(opø1) ? desugar(newSyntax, form) : 'else' ? form : void 0;
}.call(this);
};
var macroexpand = exports.macroexpand = function macroexpand(form, env) {
return function loop() {
var recur = loop;
var originalø1 = form;
var expandedø1 = macroexpand1(form, env);
do {
recur = originalø1 === expandedø1 ? originalø1 : (loop[0] = expandedø1, loop[1] = macroexpand1(expandedø1, env), loop);
} while (originalø1 = loop[0], expandedø1 = loop[1], recur === loop);
return recur;
}.call(this);
};
var syntaxQuote = exports.syntaxQuote = function syntaxQuote(form) {
return isSymbol(form) ? list(symbol(void 0, 'quote'), form) : isKeyword(form) ? list(symbol(void 0, 'quote'), form) : isNumber(form) || isString(form) || isBoolean(form) || isNil(form) || isRePattern(form) ? form : isUnquote(form) ? second(form) : isUnquoteSplicing(form) ? readerError('Illegal use of `~@` expression, can only be present in a list') : isEmpty(form) ? form : isDictionary(form) ? list(symbol(void 0, 'apply'), symbol(void 0, 'dictionary'), cons(symbol(void 0, '.concat'), sequenceExpand(concat.apply(void 0, seq(form))))) : isVector(form) ? cons(symbol(void 0, '.concat'), sequenceExpand(form)) : isList(form) ? isEmpty(form) ? cons(symbol(void 0, 'list'), void 0) : list(symbol(void 0, 'apply'), symbol(void 0, 'list'), cons(symbol(void 0, '.concat'), sequenceExpand(form))) : 'else' ? readerError('Unknown Collection type') : void 0;
};
var syntaxQuoteExpand = exports.syntaxQuoteExpand = syntaxQuote;
var unquoteSplicingExpand = exports.unquoteSplicingExpand = function unquoteSplicingExpand(form) {
return isVector(form) ? form : list(symbol(void 0, 'vec'), form);
};
var sequenceExpand = exports.sequenceExpand = function sequenceExpand(forms) {
return map(function (form) {
return isUnquote(form) ? [second(form)] : isUnquoteSplicing(form) ? unquoteSplicingExpand(second(form)) : 'else' ? [syntaxQuoteExpand(form)] : void 0;
}, forms);
};
installMacro('syntax-quote', syntaxQuoteExpand);
var expandNotEqual = exports.expandNotEqual = function expandNotEqual() {
var body = Array.prototype.slice.call(arguments, 0);
return list.apply(void 0, [symbol(void 0, 'not')].concat([list.apply(void 0, [symbol(void 0, '=')].concat(vec(body)))]));
};
installMacro('not=', expandNotEqual);
var expandIfNot = exports.expandIfNot = function expandIfNot(condition, truthy, alternative) {
return list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'not')].concat([condition]))], [truthy], [alternative]));
};
installMacro('if-not', expandIfNot);
var expandComment = exports.expandComment = function expandComment() {
var body = Array.prototype.slice.call(arguments, 0);
return void 0;
};
installMacro('comment', expandComment);
var expandThreadFirst = exports.expandThreadFirst = function expandThreadFirst() {
var operations = Array.prototype.slice.call(arguments, 0);
return reduce(function (form, operation) {
return cons(first(operation), cons(form, rest(operation)));
}, first(operations), map(function ($1) {
return isList($1) ? $1 : list.apply(void 0, [$1].concat());
}, rest(operations)));
};
installMacro('->', expandThreadFirst);
var expandThreadLast = exports.expandThreadLast = function expandThreadLast() {
var operations = Array.prototype.slice.call(arguments, 0);
return reduce(function (form, operation) {
return concat(operation, [form]);
}, first(operations), map(function ($1) {
return isList($1) ? $1 : list.apply(void 0, [$1].concat());
}, rest(operations)));
};
installMacro('->>', expandThreadLast);
var expandDots = exports.expandDots = function expandDots(x) {
var forms = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, '->')].concat([x], vec(map(function ($1) {
return isList($1) ? cons(symbol(void 0, '.'), $1) : list(symbol(void 0, '.'), $1);
}, forms))));
};
installMacro('..', expandDots);
var expandThreadAs = exports.expandThreadAs = function expandThreadAs(expr, name) {
var forms = Array.prototype.slice.call(arguments, 2);
return list.apply(void 0, [symbol(void 0, 'let')].concat([[name].concat([expr], vec(mapcat(function (form) {
return [
name,
form
];
}, forms)))], [name]));
};
installMacro('as->', expandThreadAs);
var expandCond = exports.expandCond = function expandCond() {
var clauses = Array.prototype.slice.call(arguments, 0);
return !isEmpty(clauses) ? list(symbol(void 0, 'if'), first(clauses), isEmpty(rest(clauses)) ? (function () {
throw Error('cond requires an even number of forms');
})() : second(clauses), cons(symbol(void 0, 'cond'), rest(rest(clauses)))) : void 0;
};
installMacro('cond', expandCond);
var expandCase = exports.expandCase = function expandCase(e) {
var clauses = Array.prototype.slice.call(arguments, 1);
return function () {
var symø1 = isSymbol(e) ? e : gensym('case-binding');
var pairsø1 = partition(2, clauses);
var eq_ø1 = function (c) {
return list.apply(void 0, [symbol(void 0, '=')].concat([symø1], [list.apply(void 0, [symbol(void 0, 'quote')].concat([c]))]));
};
var tailø1 = isOdd(count(clauses)) ? last(clauses) : list.apply(void 0, [symbol(void 0, 'throw')].concat([list.apply(void 0, [symbol(void 0, 'Error')].concat([list.apply(void 0, [symbol(void 0, 'str')].concat(['No matching clause: '], [symø1]))]))]));
return function loop() {
var recur = loop;
var pairsø2 = pairsø1;
var condsø1 = [];
do {
recur = isEmpty(pairsø2) ? function () {
var resultø1 = list.apply(void 0, [symbol(void 0, 'cond')].concat(vec(condsø1), ['\uA789else'], [tailø1]));
return isEqual(e, symø1) ? resultø1 : list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([e])], [resultø1]));
}.call(this) : function () {
var xø1 = first(pairsø2);
var xsø1 = rest(pairsø2);
var constsø1 = first(xø1);
var resø1 = second(xø1);
return loop[0] = xsø1, loop[1] = conj(condsø1, !isList(constsø1) ? eq_ø1(constsø1) : list.apply(void 0, [symbol(void 0, 'or')].concat(vec(map(eq_ø1, constsø1)))), resø1), loop;
}.call(this);
} while (pairsø2 = loop[0], condsø1 = loop[1], recur === loop);
return recur;
}.call(this);
}.call(this);
};
installMacro('case', expandCase);
var expandCondp = exports.expandCondp = function expandCondp(pred, expr) {
var clauses = Array.prototype.slice.call(arguments, 2);
return function () {
var sym_ø1 = gensym('condp-binding');
var symø1 = isSymbol(expr) ? expr : sym_ø1;
var compareø1 = function (x) {
return list.apply(void 0, [pred].concat([x], [symø1]));
};
var splitsø1 = function splits(xs) {
return isEmpty(xs) ? list.apply(void 0, [symbol(void 0, 'throw')].concat([list.apply(void 0, [symbol(void 0, 'Error')].concat([list.apply(void 0, [symbol(void 0, 'str')].concat(['No matching clause: '], [symø1]))]))])) : isEqual(1, count(xs)) ? first(xs) : isEqual('\uA789>>', second(xs)) ? list.apply(void 0, [symbol(void 0, 'if-let')].concat([[sym_ø1].concat([compareø1(first(xs))])], [list.apply(void 0, [third(xs)].concat([sym_ø1]))], [splits(drop(3, xs))])) : 'else' ? list.apply(void 0, [symbol(void 0, 'if')].concat([compareø1(first(xs))], [second(xs)], [splits(drop(2, xs))])) : void 0;
};
return isEqual(symø1, expr) ? splitsø1(clauses) : list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([expr])], [splitsø1(clauses)]));
}.call(this);
};
installMacro('condp', expandCondp);
var _thread = function _thread(insert, sym, test, form) {
return function () {
var formø2 = isList(form) ? form : list(form);
return list.apply(void 0, [symbol(void 0, 'if')].concat([test], [sym], [insert(sym, formø2)]));
}.call(this);
};
var _condThread = function _condThread(expr, clauses, insert) {
return function () {
var symø1 = gensym('cond-thread-binding');
return list.apply(void 0, [symbol(void 0, 'as->')].concat([expr], [symø1], vec(map(function ($1) {
return _thread(insert, symø1, list.apply(void 0, [symbol(void 0, 'not')].concat([first($1)])), second($1));
}, partition(2, clauses)))));
}.call(this);
};
var expandCondThreadFirst = exports.expandCondThreadFirst = function expandCondThreadFirst(expr) {
var clauses = Array.prototype.slice.call(arguments, 1);
return _condThread(expr, clauses, function (sym, form) {
return list.apply(void 0, [
first(form),
sym
].concat(vec(rest(form))));
});
};
installMacro('cond->', expandCondThreadFirst);
var expandCondThreadLast = exports.expandCondThreadLast = function expandCondThreadLast(expr) {
var clauses = Array.prototype.slice.call(arguments, 1);
return _condThread(expr, clauses, function (sym, form) {
return list.apply(void 0, vec(concat(form, [sym])));
});
};
installMacro('cond->>', expandCondThreadLast);
var _someThread = function _someThread(expr, forms, insert) {
return function () {
var symø1 = gensym('some-thread-binding');
return list.apply(void 0, [symbol(void 0, 'as->')].concat([expr], [symø1], vec(map(function ($1) {
return _thread(insert, symø1, list.apply(void 0, [symbol(void 0, 'nil?')].concat([symø1])), $1);
}, forms))));
}.call(this);
};
var expandSomeThreadFirst = exports.expandSomeThreadFirst = function expandSomeThreadFirst(expr) {
var forms = Array.prototype.slice.call(arguments, 1);
return _someThread(expr, forms, function (sym, form) {
return list.apply(void 0, [
first(form),
sym
].concat(vec(rest(form))));
});
};
installMacro('some->', expandSomeThreadFirst);
var expandSomeThreadLast = exports.expandSomeThreadLast = function expandSomeThreadLast(expr) {
var forms = Array.prototype.slice.call(arguments, 1);
return _someThread(expr, forms, function (sym, form) {
return list.apply(void 0, vec(concat(form, [sym])));
});
};
installMacro('some->>', expandSomeThreadLast);
var expandDefn = exports.expandDefn = function expandDefn(_andForm, name) {
var docPlusMetaPlusBody = Array.prototype.slice.call(arguments, 2);
return function () {
var docø1 = isString(first(docPlusMetaPlusBody)) ? first(docPlusMetaPlusBody) : void 0;
var metaPlusBodyø1 = docø1 ? rest(docPlusMetaPlusBody) : docPlusMetaPlusBody;
var metadataø1 = isDictionary(first(metaPlusBodyø1)) ? conj({ 'doc': docø1 }, first(metaPlusBodyø1)) : void 0;
var bodyø1 = metadataø1 ? rest(metaPlusBodyø1) : metaPlusBodyø1;
var idø1 = withMeta(name, conj(meta(name) || {}, metadataø1));
var fnø1 = withMeta(list.apply(void 0, [symbol(void 0, 'fn')].concat([idø1], vec(bodyø1))), meta(_andForm));
return list.apply(void 0, [symbol(void 0, 'def')].concat([idø1], [fnø1]));
}.call(this);
};
installMacro('defn', withMeta(expandDefn, { 'implicit': ['&form'] }));
var expandPrivateDefn = exports.expandPrivateDefn = function expandPrivateDefn(name) {
var body = Array.prototype.slice.call(arguments, 1);
return function () {
var metadataø1 = conj(meta(name) || {}, { 'private': true });
var idø1 = withMeta(name, metadataø1);
return list.apply(void 0, [symbol(void 0, 'defn')].concat([idø1], vec(body)));
}.call(this);
};
installMacro('defn-', expandPrivateDefn);
var expandLazySeq = exports.expandLazySeq = function expandLazySeq() {
var body = Array.prototype.slice.call(arguments, 0);
return list.apply(void 0, [symbol(void 0, '.call')].concat([symbol(void 0, 'lazy-seq')], [void 0], [false], [list.apply(void 0, [symbol(void 0, 'fn')].concat([[]], vec(body)))]));
};
installMacro('lazy-seq', expandLazySeq);
var expandWhen = exports.expandWhen = function expandWhen(test) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'if')].concat([test], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))]));
};
installMacro('when', expandWhen);
var expandWhenNot = exports.expandWhenNot = function expandWhenNot(test) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'when')].concat([list.apply(void 0, [symbol(void 0, 'not')].concat([test]))], vec(body)));
};
installMacro('when-not', expandWhenNot);
var expandIfLet = exports.expandIfLet = function expandIfLet(bindings, then, else_) {
return function () {
var nameø1 = first(bindings);
var testø1 = second(bindings);
var symø1 = gensym('if-let-binding');
return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([testø1])], [list.apply(void 0, [symbol(void 0, 'if')].concat([symø1], [list.apply(void 0, [symbol(void 0, 'let')].concat([[nameø1].concat([symø1])], [then]))], [else_]))]));
}.call(this);
};
installMacro('if-let', expandIfLet);
var expandWhenLet = exports.expandWhenLet = function expandWhenLet(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'if-let')].concat([bindings], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))]));
};
installMacro('when-let', expandWhenLet);
var expandIfSome = exports.expandIfSome = function expandIfSome(bindings, then, else_) {
return function () {
var nameø1 = first(bindings);
var testø1 = second(bindings);
var symø1 = isSymbol(nameø1) ? nameø1 : gensym('if-some-binding');
return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([testø1])], [list.apply(void 0, [symbol(void 0, 'if-not')].concat([list.apply(void 0, [symbol(void 0, 'nil?')].concat([symø1]))], [list.apply(void 0, [symbol(void 0, 'let')].concat([[nameø1].concat([symø1])], [then]))], [else_]))]));
}.call(this);
};
installMacro('if-some', expandIfSome);
var expandWhenSome = exports.expandWhenSome = function expandWhenSome(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'if-some')].concat([bindings], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body)))]));
};
installMacro('when-some', expandWhenSome);
var expandWhenFirst = exports.expandWhenFirst = function expandWhenFirst(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return function () {
var nameø1 = first(bindings);
var testø1 = second(bindings);
return list.apply(void 0, [symbol(void 0, 'when-let')].concat([[[nameø1].concat()].concat([list.apply(void 0, [symbol(void 0, 'seq*')].concat([testø1]))])], vec(body)));
}.call(this);
};
installMacro('when-first', expandWhenFirst);
var expandWhile = exports.expandWhile = function expandWhile(test) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'loop')].concat([[]], [list.apply(void 0, [symbol(void 0, 'when')].concat([test], vec(body), [list.apply(void 0, [symbol(void 0, 'recur')].concat())]))]));
};
installMacro('while', expandWhile);
var expandDoto = exports.expandDoto = function expandDoto(x) {
var forms = Array.prototype.slice.call(arguments, 1);
return function () {
var symø1 = gensym('doto-binding');
return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([x])], vec(map(function ($1) {
return concat([
first($1),
symø1
], rest($1));
}, forms)), [symø1]));
}.call(this);
};
installMacro('doto', expandDoto);
var expandDotimes = exports.expandDotimes = function expandDotimes(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return function () {
var nameø1 = first(bindings);
var nø1 = second(bindings);
var symø1 = gensym('dotimes-binding');
return list.apply(void 0, [symbol(void 0, 'let')].concat([[symø1].concat([nø1])], [list.apply(void 0, [symbol(void 0, 'loop')].concat([[nameø1].concat([0])], [list.apply(void 0, [symbol(void 0, 'when')].concat([list.apply(void 0, [symbol(void 0, '<')].concat([nameø1], [symø1]))], vec(body), [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'inc')].concat([nameø1]))]))]))]))]));
}.call(this);
};
installMacro('dotimes', expandDotimes);
var forStep = function forStep(context, loop) {
var modifiers = Array.prototype.slice.call(arguments, 2);
return function () {
var iterø1 = (context || 0)['iter'];
var collø1 = (context || 0)['coll'];
var bodyø1 = (context || 0)['body'];
var subseqø1 = (context || 0)['subseq'];
var body_ø1 = !subseqø1 ? bodyø1 : list.apply(void 0, [symbol(void 0, 'let')].concat([[subseqø1].concat([bodyø1])], [list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'empty?')].concat([subseqø1]))], [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))], [list.apply(void 0, [symbol(void 0, 'lazy-concat')].concat([subseqø1], [list.apply(void 0, [iterø1].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))]))]))]));
var nextø1 = function loop() {
var recur = loop;
var modsø1 = reverse(modifiers);
var bodyø2 = body_ø1;
do {
recur = isEmpty(modsø1) ? bodyø2 : function () {
var mø1 = first(modsø1);
var itemø1 = first(mø1);
var argø1 = second(mø1);
return loop[0] = rest(modsø1), loop[1] = isEqual(itemø1, '\uA789let') ? list.apply(void 0, [symbol(void 0, 'let')].concat([argø1], [bodyø2])) : isEqual(itemø1, '\uA789while') ? list.apply(void 0, [symbol(void 0, 'if')].concat([argø1], [bodyø2])) : isEqual(itemø1, '\uA789when') ? list.apply(void 0, [symbol(void 0, 'if')].concat([argø1], [bodyø2], [list.apply(void 0, [symbol(void 0, 'recur')].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))])) : void 0, loop;
}.call(this);
} while (modsø1 = loop[0], bodyø2 = loop[1], recur === loop);
return recur;
}.call(this);
return merge(context, {
'subseq': gensym('for-subseq'),
'body': list.apply(void 0, [list.apply(void 0, [symbol(void 0, 'fn')].concat([iterø1], [[collø1].concat()], [list.apply(void 0, [symbol(void 0, 'lazy-seq')].concat([list.apply(void 0, [symbol(void 0, 'loop')].concat([[collø1].concat([collø1])], [list.apply(void 0, [symbol(void 0, 'if-not')].concat([list.apply(void 0, [symbol(void 0, 'empty?')].concat([collø1]))], [list.apply(void 0, [symbol(void 0, 'let')].concat([[first(loop)].concat([list.apply(void 0, [symbol(void 0, 'first')].concat([collø1]))])], [nextø1]))]))]))]))]))].concat([second(loop)]))
});
}.call(this);
};
var forModifiers = set('\uA789let', '\uA789while', '\uA789when');
var forParts = function forParts(seqExprPairs) {
return function () {
var nø1 = count(seqExprPairs);
var indicesø1 = filter(function ($1) {
return !forModifiers(first(seqExprPairs[$1]));
}, range(nø1));
var segmentsø1 = partition(2, 1, conj(indicesø1, nø1));
return map(function ($1) {
return seqExprPairs.slice(first($1), second($1));
}, segmentsø1);
}.call(this);
};
var expandFor = exports.expandFor = function expandFor(seqExprs, bodyExpr) {
return function () {
var iterø1 = gensym('for-iter');
var collø1 = gensym('for-coll');
var partsø1 = forParts(partition(2, seqExprs));
return (reduce(function ($1, $2) {
return forStep.apply(void 0, [$1].concat($2));
}, {
'iter': iterø1,
'coll': collø1,
'body': list.apply(void 0, [symbol(void 0, 'cons')].concat([bodyExpr], [list.apply(void 0, [iterø1].concat([list.apply(void 0, [symbol(void 0, 'rest')].concat([collø1]))]))]))
}, reverse(partsø1)) || 0)['body'];
}.call(this);
};
installMacro('for', expandFor);
var expandDoseq = exports.expandDoseq = function expandDoseq(seqExprs) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'dorun')].concat([list.apply(void 0, [symbol(void 0, 'for')].concat([seqExprs], [list.apply(void 0, [symbol(void 0, 'do')].concat(vec(body), [void 0]))]))]));
};
installMacro('doseq', expandDoseq);
var sym_ = function sym_(string) {
return function () {
var wordsø1 = split(name(string), /-/);
return join(cons(first(wordsø1), map(capitalize, rest(wordsø1))));
}.call(this);
};
var bindSym_ = function bindSym_(s, b) {
!isSymbol(s) ? (function () {
throw Error('' + 'Assert failed: ' + 'Expected a symbol here!' + '(symbol? s)');
})() : void 0;
return [
s,
b
];
};
var conjSyms_ = function conjSyms_(get_, result, k, v, f, quote) {
return function () {
var kNsø1 = namespace(k);
var gø1 = function ($1) {
return f(kNsø1, name($1));
};
return vec(concat(result, mapcat(function ($1) {
return bindSym_($1, get_($1, gø1($1), quote));
}, v)));
}.call(this);
};
var dictGet_ = function dictGet_(dictName, defaults) {
return function (binding, key, quote) {
return function () {
var sø1 = name(key);
var kø1 = keyword(namespace(key), isSymbol(key) ? sym_(sø1) : sø1);
return list.apply(void 0, [symbol(void 0, 'get')].concat([dictName], [!quote ? kø1 : list.apply(void 0, [symbol(void 0, 'quote')].concat([kø1]))], [binding && defaults[binding]]));
}.call(this);
};
};
var destructureDict = exports.destructureDict = function destructureDict(binding, from) {
return function () {
var dictNameø1 = binding['\uA789as'] || gensym('destructure-bind');
var dictBindø1 = list.apply(void 0, [symbol(void 0, 'if')].concat([list.apply(void 0, [symbol(void 0, 'dictionary?')].concat([dictNameø1]))], [dictNameø1], [list.apply(void 0, [symbol(void 0, 'apply')].concat([symbol(void 0, 'dictionary')], [list.apply(void 0, [symbol(void 0, 'vec')].concat([dictNameø1]))]))]));
var get_ø1 = dictGet_(dictNameø1, get.apply(void 0, [
binding,
'\uA789or',
{}
]));
return function loop() {
var recur = loop;
var ksø1 = keys(dissoc(binding, '\uA789as', '\uA789or'));
var resultø1 = [
dictNameø1,
from,
dictNameø1,
dictBindø1
];
do {
recur = isEmpty(ksø1) ? resultø1 : function () {
var kø1 = first(ksø1);
var vø1 = (binding || 0)[kø1];
var k_ø1 = isKeyword(kø1) && name(kø1);
!(isSymbol(kø1) || k_ø1 && set('keys', 'strs', 'syms')(k_ø1)) ? (function () {
throw Error('' + 'Assert failed: ' + ('' + 'Invalid destructure key ' + kø1) + '(or (symbol? k) (and k* ((set :keys :strs :syms) k*)))');
})() : void 0;
return loop[0] = rest(ksø1), loop[1] = isEqual(k_ø1, 'strs') ? conjSyms_(get_ø1, resultø1, kø1, vø1, keyword) : isEqual(k_ø1, 'syms') ? conjSyms_(get_ø1, resultø1, kø1, vø1, function ($1, $2) {
return symbol($1, sym_($2));
}) : isEqual(k_ø1, 'keys') ? conjSyms_(get_ø1, resultø1, kø1, vø1, keyword, 'quote') : isNumber(vø1) ? conj(resultø1, kø1, get_ø1(kø1, symbol('' + vø1))) : 'else' ? conj(resultø1, kø1, get_ø1(kø1, vø1)) : void 0, loop;
}.call(this);
} while (ksø1 = loop[0], resultø1 = loop[1], recur === loop);
return recur;
}.call(this);
}.call(this);
};
var destructureSeq = exports.destructureSeq = function destructureSeq(binding, from) {
return function () {
var asø1 = binding.findIndex(function ($1) {
return isEqual($1, '\uA789as');
});
var seqNameø1 = asø1 < 0 ? gensym('destructure-bind') : nth(binding, inc(asø1));
var binding1ø1 = asø1 < 0 ? binding : take(asø1, binding);
var moreø1 = binding1ø1.findIndex(function ($1) {
return isEqual($1, symbol(void 0, '&'));
});
var tailø1 = moreø1 >= 0 ? nth(binding1ø1, inc(moreø1)) : void 0;
var binding2ø1 = moreø1 < 0 ? binding1ø1 : take(moreø1, binding);
!(asø1 < 0 || isEqual(asø1, count(binding) - 2)) ? (function () {
throw Error('' + 'Assert failed: ' + 'invalid :as in seq-destructuring' + '(or (< as 0) (= as (- (count binding) 2)))');
})() : void 0;
!(moreø1 < 0 || isEqual(moreø1, count(binding1ø1) - 2)) ? (function () {
throw Error('' + 'Assert failed: ' + 'invalid & in seq-destructuring' + '(or (< more 0) (= more (- (count binding1) 2)))');
})() : void 0;
return function loop() {
var recur = loop;
var xsø1 = binding2ø1;
var iø1 = 0;
var resultø1 = [
seqNameø1,
from
];
do {
recur = function () {
var xø1 = first(xsø1);
return isEmpty(xsø1) ? !tailø1 ? resultø1 : conj(resultø1, tailø1, list.apply(void 0, [symbol(void 0, 'drop')].concat([moreø1], [seqNameø1]))) : isEqual(xø1, symbol(void 0, '_')) ? (loop[0] = rest(xsø1), loop[1] = inc(iø1), loop[2] = resultø1, loop) : 'else' ? (loop[0] = rest(xsø1), loop[1] = inc(iø1), loop[2] = conj(resultø1, xø1, list.apply(void 0, [symbol(void 0, 'nth')].concat([seqNameø1], [iø1]))), loop) : void 0;
}.call(this);
} while (xsø1 = loop[0], iø1 = loop[1], resultø1 = loop[2], recur === loop);
return recur;
}.call(this);
}.call(this);
};
var destructure = exports.destructure = function destructure(bindings) {
return function () {
var pairsø1 = partition(2, bindings);
return isEvery(function ($1) {
return isSymbol(first($1));
}, pairsø1) ? bindings : destructure(vec(mapcat(function ($1) {
return isVector(first($1)) ? destructureSeq.apply(void 0, $1) : isDictionary(first($1)) ? destructureDict.apply(void 0, $1) : isSymbol(first($1)) ? $1 : 'else' ? (function () {
throw 'Invalid binding';
})() : void 0;
}, pairsø1)));
}.call(this);
};
var bindNames_ = function bindNames_(keys) {
return zipmap(keys, repeatedly(count(keys), function () {
return gensym('destructure-bind');
}));
};
var bindIndices_ = function bindIndices_(names) {
return filter(function ($1) {
return !isSymbol(nth(names, $1));
}, range(count(names)));
};
var expandLet = exports.expandLet = function expandLet(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return list.apply(void 0, [symbol(void 0, 'let*')].concat([destructure(bindings)], vec(body)));
};
installMacro('let', expandLet);
var expandFn = exports.expandFn = function expandFn() {
var args = Array.prototype.slice.call(arguments, 0);
return function () {
var nameø1 = isSymbol(first(args)) ? first(args) : void 0;
var defsø1 = nameø1 ? rest(args) : args;
var mkfnø1 = function ($1) {
return nameø1 ? list.apply(void 0, [symbol(void 0, 'fn*')].concat([nameø1], vec($1))) : list.apply(void 0, [symbol(void 0, 'fn*')].concat(vec($1)));
};
var def_ø1 = function (args) {
var body = Array.prototype.slice.call(arguments, 1);
return function () {
var indicesø1 = bindIndices_(args);
var namesø1 = bindNames_(indicesø1);
return isEmpty(namesø1) ? cons(args, body) : list.apply(void 0, [vec(mapIndexed(function ($1, $2) {
return get.apply(void 0, [
namesø1,
$1,
$2
]);
}, args))].concat([list.apply(void 0, [symbol(void 0, 'let')].concat([vec(mapcat(function (i) {
return [
args[i],
namesø1[i]
];
}, indicesø1))], vec(body)))]));
}.call(this);
};
return isVector(first(defsø1)) ? mkfnø1(def_ø1.apply(void 0, defsø1)) : mkfnø1(map(function ($1) {
return def_ø1.apply(void 0, vec($1));
}, defsø1));
}.call(this);
};
installMacro('fn', expandFn);
var expandLoop = exports.expandLoop = function expandLoop(bindings) {
var body = Array.prototype.slice.call(arguments, 1);
return function () {
var pairsø1 = partition(2, bindings);
var indicesø1 = bindIndices_(mapv(first, pairsø1));
var namesø1 = bindNames_(indicesø1);
var get_ø1 = function ($1, $2) {
return function () {
var ifLetBinding1ø1 = namesø1[$1];
return ifLetBinding1ø1 ? function () {
var xø1 = ifLetBinding1ø1;
return [
xø1,
second($2),
first($2),
xø1
];
}.call(this) : $2;
}.call(this);
};
return isEmpty(namesø1) ? list.apply(void 0, [symbol(void 0, 'loop*')].concat([bindings], vec(body))) : list.apply(void 0, [symbol(void 0, 'let')].concat([vec(concat.apply(void 0, mapIndexed(get_ø1, pairsø1)))], [list.apply(void 0, [symbol(void 0, 'loop*')].concat([vec(concat.apply(void 0, mapIndexed(function ($1, $2) {
return function () {
var xø1 = get.apply(void 0, [
namesø1,
$1,
first($2)
]);
return [
xø1,
xø1
];
}.call(this);
}, pairsø1)))], [list.apply(void 0, [symbol(void 0, 'let')].concat([vec(mapcat(function (i) {
return [
first(pairsø1[i]),
namesø1[i]
];
}, indicesø1))], vec(body)))]))]));
}.call(this);
};
installMacro('loop', expandLoop);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsIm1ldGEiLCJ3aXRoTWV0YSIsImlzU3ltYm9sIiwiaXNLZXl3b3JkIiwia2V5d29yZCIsImlzUXVvdGUiLCJzeW1ib2wiLCJuYW1lc3BhY2UiLCJuYW1lIiwiZ2Vuc3ltIiwiaXNVbnF1b3RlIiwiaXNVbnF1b3RlU3BsaWNpbmciLCJpc0xpc3QiLCJsaXN0IiwiY29uaiIsInBhcnRpdGlvbiIsInNlcSIsInJlcGVhdGVkbHkiLCJpc0VtcHR5IiwibWFwIiwibWFwdiIsInZlYyIsInNldCIsImlzRXZlcnkiLCJjb25jYXQiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwicmVzdCIsImxhc3QiLCJtYXBjYXQiLCJudGgiLCJidXRsYXN0IiwiaW50ZXJsZWF2ZSIsImNvbnMiLCJjb3VudCIsInRha2UiLCJkaXNzb2MiLCJzb21lIiwiYXNzb2MiLCJyZWR1Y2UiLCJmaWx0ZXIiLCJpc1NlcSIsInppcG1hcCIsImRyb3AiLCJsYXp5U2VxIiwicmFuZ2UiLCJyZXZlcnNlIiwiZG9ydW4iLCJtYXBJbmRleGVkIiwiaXNOaWwiLCJpc0RpY3Rpb25hcnkiLCJpc1ZlY3RvciIsImtleXMiLCJnZXQiLCJ2YWxzIiwiaXNTdHJpbmciLCJpc051bWJlciIsImlzQm9vbGVhbiIsImlzRGF0ZSIsImlzUmVQYXR0ZXJuIiwiaXNFdmVuIiwiaXNPZGQiLCJpc0VxdWFsIiwibWF4IiwiaW5jIiwiZGVjIiwiZGljdGlvbmFyeSIsIm1lcmdlIiwic3VicyIsInNwbGl0Iiwiam9pbiIsImNhcGl0YWxpemUiLCJfX21hY3Jvc19fIiwiZXhwb3J0cyIsImV4cGFuZCIsImV4cGFuZGVyIiwiZm9ybSIsImVudiIsIm1ldGFkYXRhw7gxIiwicGFybWFzw7gxIiwiaW1wbGljaXTDuDEiLCIkMSIsInBhcmFtc8O4MSIsImV4cGFuc2lvbsO4MSIsImluc3RhbGxNYWNybyIsIm9wIiwibWFjcm8iLCJpc0RvdFN5bnRheCIsImlzTWV0aG9kU3ludGF4IiwiaWTDuDEiLCJpc0ZpZWxkU3ludGF4IiwiaXNOZXdTeW50YXgiLCJtZXRob2RTeW50YXgiLCJ0YXJnZXQiLCJwYXJhbXMiLCJvcE1ldGHDuDEiLCJmb3JtU3RhcnTDuDEiLCJ0YXJnZXRNZXRhw7gxIiwibWVtYmVyw7gxIiwiYWdldMO4MSIsIm1ldGhvZMO4MSIsIkVycm9yIiwiZmllbGRTeW50YXgiLCJmaWVsZCIsIm1vcmUiLCJzdGFydMO4MSIsImVuZMO4MSIsImRvdFN5bnRheCIsIl9maWVsZMO4MSIsIm5ld1N5bnRheCIsImlkTWV0YcO4MSIsInJlbmFtZcO4MSIsImNvbnN0cnVjdG9yw7gxIiwib3BlcmF0b3LDuDEiLCJrZXl3b3JkSW52b2tlIiwiZGVmYXVsdF8iLCJkZXN1Z2FyIiwiZGVzdWdhcmVkw7gxIiwibWFjcm9leHBhbmQxIiwib3DDuDEiLCJleHBhbmRlcsO4MSIsIm1hY3JvZXhwYW5kIiwib3JpZ2luYWzDuDEiLCJleHBhbmRlZMO4MSIsInN5bnRheFF1b3RlIiwicmVhZGVyRXJyb3IiLCJzZXF1ZW5jZUV4cGFuZCIsInN5bnRheFF1b3RlRXhwYW5kIiwidW5xdW90ZVNwbGljaW5nRXhwYW5kIiwiZm9ybXMiLCJleHBhbmROb3RFcXVhbCIsImJvZHkiLCJleHBhbmRJZk5vdCIsImNvbmRpdGlvbiIsInRydXRoeSIsImFsdGVybmF0aXZlIiwiZXhwYW5kQ29tbWVudCIsImV4cGFuZFRocmVhZEZpcnN0Iiwib3BlcmF0aW9ucyIsIm9wZXJhdGlvbiIsImV4cGFuZFRocmVhZExhc3QiLCJleHBhbmREb3RzIiwieCIsImV4cGFuZFRocmVhZEFzIiwiZXhwciIsImV4cGFuZENvbmQiLCJjbGF1c2VzIiwiZXhwYW5kQ2FzZSIsImUiLCJzeW3DuDEiLCJwYWlyc8O4MSIsImVxX8O4MSIsImMiLCJ0YWlsw7gxIiwicGFpcnPDuDIiLCJjb25kc8O4MSIsInJlc3VsdMO4MSIsInjDuDEiLCJ4c8O4MSIsImNvbnN0c8O4MSIsInJlc8O4MSIsImV4cGFuZENvbmRwIiwicHJlZCIsInN5bV/DuDEiLCJjb21wYXJlw7gxIiwic3BsaXRzw7gxIiwic3BsaXRzIiwieHMiLCJfdGhyZWFkIiwiaW5zZXJ0Iiwic3ltIiwidGVzdCIsImZvcm3DuDIiLCJfY29uZFRocmVhZCIsImV4cGFuZENvbmRUaHJlYWRGaXJzdCIsImV4cGFuZENvbmRUaHJlYWRMYXN0IiwiX3NvbWVUaHJlYWQiLCJleHBhbmRTb21lVGhyZWFkRmlyc3QiLCJleHBhbmRTb21lVGhyZWFkTGFzdCIsImV4cGFuZERlZm4iLCJfYW5kRm9ybSIsImRvY1BsdXNNZXRhUGx1c0JvZHkiLCJkb2PDuDEiLCJtZXRhUGx1c0JvZHnDuDEiLCJib2R5w7gxIiwiZm7DuDEiLCJleHBhbmRQcml2YXRlRGVmbiIsImV4cGFuZExhenlTZXEiLCJleHBhbmRXaGVuIiwiZXhwYW5kV2hlbk5vdCIsImV4cGFuZElmTGV0IiwiYmluZGluZ3MiLCJ0aGVuIiwiZWxzZV8iLCJuYW1lw7gxIiwidGVzdMO4MSIsImV4cGFuZFdoZW5MZXQiLCJleHBhbmRJZlNvbWUiLCJleHBhbmRXaGVuU29tZSIsImV4cGFuZFdoZW5GaXJzdCIsImV4cGFuZFdoaWxlIiwiZXhwYW5kRG90byIsImV4cGFuZERvdGltZXMiLCJuw7gxIiwiZm9yU3RlcCIsImNvbnRleHQiLCJsb29wIiwibW9kaWZpZXJzIiwiaXRlcsO4MSIsImNvbGzDuDEiLCJzdWJzZXHDuDEiLCJib2R5X8O4MSIsIm5leHTDuDEiLCJtb2Rzw7gxIiwiYm9kecO4MiIsIm3DuDEiLCJpdGVtw7gxIiwiYXJnw7gxIiwiZm9yTW9kaWZpZXJzIiwiZm9yUGFydHMiLCJzZXFFeHByUGFpcnMiLCJpbmRpY2Vzw7gxIiwic2VnbWVudHPDuDEiLCJzbGljZSIsImV4cGFuZEZvciIsInNlcUV4cHJzIiwiYm9keUV4cHIiLCJwYXJ0c8O4MSIsIiQyIiwiZXhwYW5kRG9zZXEiLCJzeW1fIiwic3RyaW5nIiwid29yZHPDuDEiLCJiaW5kU3ltXyIsInMiLCJiIiwiY29ualN5bXNfIiwiZ2V0XyIsInJlc3VsdCIsImsiLCJ2IiwiZiIsInF1b3RlIiwia05zw7gxIiwiZ8O4MSIsImRpY3RHZXRfIiwiZGljdE5hbWUiLCJkZWZhdWx0cyIsImJpbmRpbmciLCJrZXkiLCJzw7gxIiwia8O4MSIsImRlc3RydWN0dXJlRGljdCIsImZyb20iLCJkaWN0TmFtZcO4MSIsImRpY3RCaW5kw7gxIiwiZ2V0X8O4MSIsImtzw7gxIiwidsO4MSIsImtfw7gxIiwiZGVzdHJ1Y3R1cmVTZXEiLCJhc8O4MSIsImZpbmRJbmRleCIsInNlcU5hbWXDuDEiLCJiaW5kaW5nMcO4MSIsIm1vcmXDuDEiLCJiaW5kaW5nMsO4MSIsImnDuDEiLCJkZXN0cnVjdHVyZSIsImJpbmROYW1lc18iLCJiaW5kSW5kaWNlc18iLCJuYW1lcyIsImV4cGFuZExldCIsImV4cGFuZEZuIiwiYXJncyIsImRlZnPDuDEiLCJta2Zuw7gxIiwiZGVmX8O4MSIsIm5hbWVzw7gxIiwiaSIsImV4cGFuZExvb3AiXSwibWFwcGluZ3MiOiI7SUFBQSxJQUFDQSxJLEdBQUQ7QUFBQSxZQUFBQyxFLEVBQUksZUFBSjtBQUFBLFlBQUFDLEcsRUFDRSx1Q0FERjtBQUFBLFU7O1FBRThCQyxJQUFBLEcsU0FBQUEsSTtRQUFLQyxRQUFBLEcsU0FBQUEsUTtRQUFVQyxRQUFBLEcsU0FBQUEsUTtRQUFRQyxTQUFBLEcsU0FBQUEsUztRQUFTQyxPQUFBLEcsU0FBQUEsTztRQUNoQ0MsT0FBQSxHLFNBQUFBLE87UUFBT0MsTUFBQSxHLFNBQUFBLE07UUFBT0MsU0FBQSxHLFNBQUFBLFM7UUFBVUMsSUFBQSxHLFNBQUFBLEk7UUFBS0MsTUFBQSxHLFNBQUFBLE07UUFDN0JDLFNBQUEsRyxTQUFBQSxTO1FBQVNDLGlCQUFBLEcsU0FBQUEsaUI7O1FBQ0pDLE1BQUEsRyxjQUFBQSxNO1FBQU1DLElBQUEsRyxjQUFBQSxJO1FBQUtDLElBQUEsRyxjQUFBQSxJO1FBQUtDLFNBQUEsRyxjQUFBQSxTO1FBQVVDLEdBQUEsRyxjQUFBQSxHO1FBQUlDLFVBQUEsRyxjQUFBQSxVO1FB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