Skip to content

Instantly share code, notes, and snippets.

@MoOx
Created September 11, 2017 04:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MoOx/3feede6e8cc19e061589bdc2f6634bef to your computer and use it in GitHub Desktop.
Save MoOx/3feede6e8cc19e061589bdc2f6634bef to your computer and use it in GitHub Desktop.
requirebin sketch
var unified = require('unified');
var markdown = require('remark-parse');
var remark2rehype = require('remark-rehype');
var slug = require('rehype-slug');
var link = require('rehype-autolink-headings');
var raw = require('rehype-raw');
var stringify = require('rehype-stringify');
const input = `## Test
[link](href)
\`\`\`js
console.log(window)
\`\`\`
<button>Random Html</button>
<Button>Random react like stuff</Button>
`;
unified()
.use(markdown)
.use(remark2rehype, {allowDangerousHTML: true})
.use(slug)
.use(link)
.use(raw)
.use(stringify)
.processSync(input);
This file has been truncated, but you can view the full file.
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
} else if (last === '..') {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
return splitPathRe.exec(filename).slice(1);
};
// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : process.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};
// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === '/';
// Normalize the path
path = normalizeArray(filter(path.split('/'), function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
};
// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === '/';
};
// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== 'string') {
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};
// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
};
exports.sep = '/';
exports.delimiter = ':';
exports.dirname = function(path) {
var result = splitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
};
exports.basename = function(path, ext) {
var f = splitPath(path)[2];
// TODO: make this comparison case-insensitive on windows?
if (ext && f.substr(-1 * ext.length) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
};
exports.extname = function(path) {
return splitPath(path)[3];
};
function filter (xs, f) {
if (xs.filter) return xs.filter(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
if (f(xs[i], i, xs)) res.push(xs[i]);
}
return res;
}
// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
? function (str, start, len) { return str.substr(start, len) }
: function (str, start, len) {
if (start < 0) start = str.length + start;
return str.substr(start, len);
}
;
}).call(this,require('_process'))
},{"_process":2}],2:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
// cached from whatever global is present so that test runners that stub it
// don't break things. But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals. It's inside a
// function because try/catches deoptimize in certain engines.
var cachedSetTimeout;
var cachedClearTimeout;
function defaultSetTimout() {
throw new Error('setTimeout has not been defined');
}
function defaultClearTimeout () {
throw new Error('clearTimeout has not been defined');
}
(function () {
try {
if (typeof setTimeout === 'function') {
cachedSetTimeout = setTimeout;
} else {
cachedSetTimeout = defaultSetTimout;
}
} catch (e) {
cachedSetTimeout = defaultSetTimout;
}
try {
if (typeof clearTimeout === 'function') {
cachedClearTimeout = clearTimeout;
} else {
cachedClearTimeout = defaultClearTimeout;
}
} catch (e) {
cachedClearTimeout = defaultClearTimeout;
}
} ())
function runTimeout(fun) {
if (cachedSetTimeout === setTimeout) {
//normal enviroments in sane situations
return setTimeout(fun, 0);
}
// if setTimeout wasn't available but was latter defined
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
cachedSetTimeout = setTimeout;
return setTimeout(fun, 0);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedSetTimeout(fun, 0);
} catch(e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedSetTimeout.call(null, fun, 0);
} catch(e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
return cachedSetTimeout.call(this, fun, 0);
}
}
}
function runClearTimeout(marker) {
if (cachedClearTimeout === clearTimeout) {
//normal enviroments in sane situations
return clearTimeout(marker);
}
// if clearTimeout wasn't available but was latter defined
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
cachedClearTimeout = clearTimeout;
return clearTimeout(marker);
}
try {
// when when somebody has screwed with setTimeout but no I.E. maddness
return cachedClearTimeout(marker);
} catch (e){
try {
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
return cachedClearTimeout.call(null, marker);
} catch (e){
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
// Some versions of I.E. have different rules for clearTimeout vs setTimeout
return cachedClearTimeout.call(this, marker);
}
}
}
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
if (!draining || !currentQueue) {
return;
}
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
} else {
queueIndex = -1;
}
if (queue.length) {
drainQueue();
}
}
function drainQueue() {
if (draining) {
return;
}
var timeout = runTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
while(len) {
currentQueue = queue;
queue = [];
while (++queueIndex < len) {
if (currentQueue) {
currentQueue[queueIndex].run();
}
}
queueIndex = -1;
len = queue.length;
}
currentQueue = null;
draining = false;
runClearTimeout(timeout);
}
process.nextTick = function (fun) {
var args = new Array(arguments.length - 1);
if (arguments.length > 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
},{}],3:[function(require,module,exports){
'use strict';
module.exports = bail;
function bail(err) {
if (err) {
throw err;
}
}
},{}],4:[function(require,module,exports){
'use strict';
var hasOwn = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var isArray = function isArray(arr) {
if (typeof Array.isArray === 'function') {
return Array.isArray(arr);
}
return toStr.call(arr) === '[object Array]';
};
var isPlainObject = function isPlainObject(obj) {
if (!obj || toStr.call(obj) !== '[object Object]') {
return false;
}
var hasOwnConstructor = hasOwn.call(obj, 'constructor');
var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
// Not own constructor property must be Object
if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for (key in obj) { /**/ }
return typeof key === 'undefined' || hasOwn.call(obj, key);
};
module.exports = function extend() {
var options, name, src, copy, copyIsArray, clone;
var target = arguments[0];
var i = 1;
var length = arguments.length;
var deep = false;
// Handle a deep copy situation
if (typeof target === 'boolean') {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {
target = {};
}
for (; i < length; ++i) {
options = arguments[i];
// Only deal with non-null/undefined values
if (options != null) {
// Extend the base object
for (name in options) {
src = target[name];
copy = options[name];
// Prevent never-ending loop
if (target !== copy) {
// Recurse if we're merging plain objects or arrays
if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && isArray(src) ? src : [];
} else {
clone = src && isPlainObject(src) ? src : {};
}
// Never move original objects, clone them
target[name] = extend(deep, clone, copy);
// Don't bring in undefined values
} else if (typeof copy !== 'undefined') {
target[name] = copy;
}
}
}
}
}
// Return the modified object
return target;
};
},{}],5:[function(require,module,exports){
'use strict';
var toString = Object.prototype.toString;
module.exports = function (x) {
var prototype;
return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({}));
};
},{}],6:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = trough;
/* Methods. */
var slice = [].slice;
/* Create new middleware. */
function trough() {
var fns = [];
var middleware = {};
middleware.run = run;
middleware.use = use;
return middleware;
/* Run `fns`. Last argument must be
* a completion handler. */
function run() {
var index = -1;
var input = slice.call(arguments, 0, -1);
var done = arguments[arguments.length - 1];
if (typeof done !== 'function') {
throw new Error('Expected function as last argument, not ' + done);
}
next.apply(null, [null].concat(input));
/* Run the next `fn`, if any. */
function next(err) {
var fn = fns[++index];
var params = slice.call(arguments, 0);
var values = params.slice(1);
var length = input.length;
var pos = -1;
if (err) {
done(err);
return;
}
/* Copy non-nully input into values. */
while (++pos < length) {
if (values[pos] === null || values[pos] === undefined) {
values[pos] = input[pos];
}
}
input = values;
/* Next or done. */
if (fn) {
wrap(fn, next).apply(null, input);
} else {
done.apply(null, [null].concat(input));
}
}
}
/* Add `fn` to the list. */
function use(fn) {
if (typeof fn !== 'function') {
throw new Error('Expected `fn` to be a function, not ' + fn);
}
fns.push(fn);
return middleware;
}
}
/* Wrap `fn`. Can be sync or async; return a promise,
* receive a completion handler, return new values and
* errors. */
function wrap(fn, next) {
var invoked;
return wrapped;
function wrapped() {
var params = slice.call(arguments, 0);
var callback = fn.length > params.length;
var result;
if (callback) {
params.push(done);
}
try {
result = fn.apply(null, params);
} catch (err) {
/* Well, this is quite the pickle. `fn` received
* a callback and invoked it (thus continuing the
* pipeline), but later also threw an error.
* We’re not about to restart the pipeline again,
* so the only thing left to do is to throw the
* thing instea. */
if (callback && invoked) {
throw err;
}
return done(err);
}
if (!callback) {
if (result && typeof result.then === 'function') {
result.then(then, done);
} else if (result instanceof Error) {
done(result);
} else {
then(result);
}
}
}
/* Invoke `next`, only once. */
function done() {
if (!invoked) {
invoked = true;
next.apply(null, arguments);
}
}
/* Invoke `done` with one value.
* Tracks if an error is passed, too. */
function then(value) {
done(null, value);
}
}
},{}],7:[function(require,module,exports){
(function (process){
'use strict';
var path = require('path');
var replace = require('replace-ext');
var stringify = require('unist-util-stringify-position');
var buffer = require('is-buffer');
module.exports = VFile;
var own = {}.hasOwnProperty;
var proto = VFile.prototype;
proto.toString = toString;
proto.message = message;
proto.info = info;
proto.fail = fail;
/* Slight backwards compatibility. Remove in the future. */
proto.warn = message;
/* Order of setting (least specific to most), we need this because
* otherwise `{stem: 'a', path: '~/b.js'}` would throw, as a path
* is needed before a stem can be set. */
var order = [
'history',
'path',
'basename',
'stem',
'extname',
'dirname'
];
/* Construct a new file. */
function VFile(options) {
var prop;
var index;
var length;
if (!options) {
options = {};
} else if (typeof options === 'string' || buffer(options)) {
options = {contents: options};
} else if ('message' in options && 'messages' in options) {
return options;
}
if (!(this instanceof VFile)) {
return new VFile(options);
}
this.data = {};
this.messages = [];
this.history = [];
this.cwd = process.cwd();
/* Set path related properties in the correct order. */
index = -1;
length = order.length;
while (++index < length) {
prop = order[index];
if (own.call(options, prop)) {
this[prop] = options[prop];
}
}
/* Set non-path related properties. */
for (prop in options) {
if (order.indexOf(prop) === -1) {
this[prop] = options[prop];
}
}
}
/* Access full path (`~/index.min.js`). */
Object.defineProperty(proto, 'path', {
get: function () {
return this.history[this.history.length - 1];
},
set: function (path) {
assertNonEmpty(path, 'path');
if (path !== this.path) {
this.history.push(path);
}
}
});
/* Access parent path (`~`). */
Object.defineProperty(proto, 'dirname', {
get: function () {
return typeof this.path === 'string' ? path.dirname(this.path) : undefined;
},
set: function (dirname) {
assertPath(this.path, 'dirname');
this.path = path.join(dirname || '', this.basename);
}
});
/* Access basename (`index.min.js`). */
Object.defineProperty(proto, 'basename', {
get: function () {
return typeof this.path === 'string' ? path.basename(this.path) : undefined;
},
set: function (basename) {
assertNonEmpty(basename, 'basename');
assertPart(basename, 'basename');
this.path = path.join(this.dirname || '', basename);
}
});
/* Access extname (`.js`). */
Object.defineProperty(proto, 'extname', {
get: function () {
return typeof this.path === 'string' ? path.extname(this.path) : undefined;
},
set: function (extname) {
var ext = extname || '';
assertPart(ext, 'extname');
assertPath(this.path, 'extname');
if (ext) {
if (ext.charAt(0) !== '.') {
throw new Error('`extname` must start with `.`');
}
if (ext.indexOf('.', 1) !== -1) {
throw new Error('`extname` cannot contain multiple dots');
}
}
this.path = replace(this.path, ext);
}
});
/* Access stem (`index.min`). */
Object.defineProperty(proto, 'stem', {
get: function () {
return typeof this.path === 'string' ? path.basename(this.path, this.extname) : undefined;
},
set: function (stem) {
assertNonEmpty(stem, 'stem');
assertPart(stem, 'stem');
this.path = path.join(this.dirname || '', stem + (this.extname || ''));
}
});
/* Get the value of the file. */
function toString(encoding) {
var value = this.contents || '';
return buffer(value) ? value.toString(encoding) : String(value);
}
/* Create a message with `reason` at `position`.
* When an error is passed in as `reason`, copies the stack. */
function message(reason, position, ruleId) {
var filePath = this.path;
var range = stringify(position) || '1:1';
var location;
var err;
location = {
start: {line: null, column: null},
end: {line: null, column: null}
};
if (position && position.position) {
position = position.position;
}
if (position) {
/* Location. */
if (position.start) {
location = position;
position = position.start;
} else {
/* Position. */
location.start = position;
}
}
err = new VMessage(reason.message || reason);
err.name = (filePath ? filePath + ':' : '') + range;
err.file = filePath || '';
err.reason = reason.message || reason;
err.line = position ? position.line : null;
err.column = position ? position.column : null;
err.location = location;
err.ruleId = ruleId || null;
err.source = null;
err.fatal = false;
if (reason.stack) {
err.stack = reason.stack;
}
this.messages.push(err);
return err;
}
/* Fail. Creates a vmessage, associates it with the file,
* and throws it. */
function fail() {
var message = this.message.apply(this, arguments);
message.fatal = true;
throw message;
}
/* Info. Creates a vmessage, associates it with the file,
* and marks the fatality as null. */
function info() {
var message = this.message.apply(this, arguments);
message.fatal = null;
return message;
}
/* Inherit from `Error#`. */
function VMessagePrototype() {}
VMessagePrototype.prototype = Error.prototype;
VMessage.prototype = new VMessagePrototype();
/* Message properties. */
proto = VMessage.prototype;
proto.file = '';
proto.name = '';
proto.reason = '';
proto.message = '';
proto.stack = '';
proto.fatal = null;
proto.column = null;
proto.line = null;
/* Construct a new file message.
*
* Note: We cannot invoke `Error` on the created context,
* as that adds readonly `line` and `column` attributes on
* Safari 9, thus throwing and failing the data. */
function VMessage(reason) {
this.message = reason;
}
/* Assert that `part` is not a path (i.e., does
* not contain `path.sep`). */
function assertPart(part, name) {
if (part.indexOf(path.sep) !== -1) {
throw new Error('`' + name + '` cannot be a path: did not expect `' + path.sep + '`');
}
}
/* Assert that `part` is not empty. */
function assertNonEmpty(part, name) {
if (!part) {
throw new Error('`' + name + '` cannot be empty');
}
}
/* Assert `path` exists. */
function assertPath(path, name) {
if (!path) {
throw new Error('Setting `' + name + '` requires `path` to be set too');
}
}
}).call(this,require('_process'))
},{"_process":2,"is-buffer":8,"path":1,"replace-ext":9,"unist-util-stringify-position":10}],8:[function(require,module,exports){
/*!
* Determine if an object is a Buffer
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/
// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
}
function isBuffer (obj) {
return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
}
// For Node v0.10 support. Remove this eventually.
function isSlowBuffer (obj) {
return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
}
},{}],9:[function(require,module,exports){
'use strict';
var path = require('path');
function replaceExt(npath, ext) {
if (typeof npath !== 'string') {
return npath;
}
if (npath.length === 0) {
return npath;
}
var nFileName = path.basename(npath, path.extname(npath)) + ext;
return path.join(path.dirname(npath), nFileName);
}
module.exports = replaceExt;
},{"path":1}],10:[function(require,module,exports){
'use strict';
var own = {}.hasOwnProperty;
module.exports = stringify;
function stringify(value) {
/* Nothing. */
if (!value || typeof value !== 'object') {
return null;
}
/* Node. */
if (own.call(value, 'position') || own.call(value, 'type')) {
return location(value.position);
}
/* Location. */
if (own.call(value, 'start') || own.call(value, 'end')) {
return location(value);
}
/* Position. */
if (own.call(value, 'line') || own.call(value, 'column')) {
return position(value);
}
/* ? */
return null;
}
function position(pos) {
if (!pos || typeof pos !== 'object') {
pos = {};
}
return index(pos.line) + ':' + index(pos.column);
}
function location(loc) {
if (!loc || typeof loc !== 'object') {
loc = {};
}
return position(loc.start) + '-' + position(loc.end);
}
function index(value) {
return value && typeof value === 'number' ? value : 1;
}
},{}],11:[function(require,module,exports){
module.exports = function isFunction (fn) {
return Object.prototype.toString.call(fn) === '[object Function]'
}
},{}],12:[function(require,module,exports){
var toString = Object.prototype.toString
module.exports = isString
function isString(obj) {
return toString.call(obj) === "[object String]"
}
},{}],"unified":[function(require,module,exports){
'use strict';
/* Dependencies. */
var extend = require('extend');
var bail = require('bail');
var vfile = require('vfile');
var trough = require('trough');
var string = require('x-is-string');
var func = require('x-is-function');
var plain = require('is-plain-obj');
/* Expose a frozen processor. */
module.exports = unified().freeze();
var slice = [].slice;
var own = {}.hasOwnProperty;
/* Process pipeline. */
var pipeline = trough().use(pipelineParse).use(pipelineRun).use(pipelineStringify);
function pipelineParse(p, ctx) {
ctx.tree = p.parse(ctx.file);
}
function pipelineRun(p, ctx, next) {
p.run(ctx.tree, ctx.file, done);
function done(err, tree, file) {
if (err) {
next(err);
} else {
ctx.tree = tree;
ctx.file = file;
next();
}
}
}
function pipelineStringify(p, ctx) {
ctx.file.contents = p.stringify(ctx.tree, ctx.file);
}
/* Function to create the first processor. */
function unified() {
var attachers = [];
var transformers = trough();
var namespace = {};
var frozen = false;
var freezeIndex = -1;
/* Data management. */
processor.data = data;
/* Lock. */
processor.freeze = freeze;
/* Plug-ins. */
processor.attachers = attachers;
processor.use = use;
/* API. */
processor.parse = parse;
processor.stringify = stringify;
processor.run = run;
processor.runSync = runSync;
processor.process = process;
processor.processSync = processSync;
/* Expose. */
return processor;
/* Create a new processor based on the processor
* in the current scope. */
function processor() {
var destination = unified();
var length = attachers.length;
var index = -1;
while (++index < length) {
destination.use.apply(null, attachers[index]);
}
destination.data(extend(true, {}, namespace));
return destination;
}
/* Freeze: used to signal a processor that has finished
* configuration.
*
* For example, take unified itself. It’s frozen.
* Plug-ins should not be added to it. Rather, it should
* be extended, by invoking it, before modifying it.
*
* In essence, always invoke this when exporting a
* processor. */
function freeze() {
var values;
var plugin;
var options;
var transformer;
if (frozen) {
return processor;
}
while (++freezeIndex < attachers.length) {
values = attachers[freezeIndex];
plugin = values[0];
options = values[1];
transformer = null;
if (options === false) {
continue;
}
if (options === true) {
values[1] = undefined;
}
transformer = plugin.apply(processor, values.slice(1));
if (func(transformer)) {
transformers.use(transformer);
}
}
frozen = true;
freezeIndex = Infinity;
return processor;
}
/* Data management.
* Getter / setter for processor-specific informtion. */
function data(key, value) {
if (string(key)) {
/* Set `key`. */
if (arguments.length === 2) {
assertUnfrozen('data', frozen);
namespace[key] = value;
return processor;
}
/* Get `key`. */
return (own.call(namespace, key) && namespace[key]) || null;
}
/* Set space. */
if (key) {
assertUnfrozen('data', frozen);
namespace = key;
return processor;
}
/* Get space. */
return namespace;
}
/* Plug-in management.
*
* Pass it:
* * an attacher and options,
* * a preset,
* * a list of presets, attachers, and arguments (list
* of attachers and options). */
function use(value) {
var settings;
assertUnfrozen('use', frozen);
if (value === null || value === undefined) {
/* Empty */
} else if (func(value)) {
addPlugin.apply(null, arguments);
} else if (typeof value === 'object') {
if ('length' in value) {
addList(value);
} else {
addPreset(value);
}
} else {
throw new Error('Expected usable value, not `' + value + '`');
}
if (settings) {
namespace.settings = extend(namespace.settings || {}, settings);
}
return processor;
function addPreset(result) {
addList(result.plugins);
if (result.settings) {
settings = extend(settings || {}, result.settings);
}
}
function add(value) {
if (func(value)) {
addPlugin(value);
} else if (typeof value === 'object') {
if ('length' in value) {
addPlugin.apply(null, value);
} else {
addPreset(value);
}
} else {
throw new Error('Expected usable value, not `' + value + '`');
}
}
function addList(plugins) {
var length;
var index;
if (plugins === null || plugins === undefined) {
/* Empty */
} else if (typeof plugins === 'object' && 'length' in plugins) {
length = plugins.length;
index = -1;
while (++index < length) {
add(plugins[index]);
}
} else {
throw new Error('Expected a list of plugins, not `' + plugins + '`');
}
}
function addPlugin(plugin, value) {
var entry = find(plugin);
if (entry) {
if (plain(entry[1]) && plain(value)) {
value = extend(entry[1], value);
}
entry[1] = value;
} else {
attachers.push(slice.call(arguments));
}
}
}
function find(plugin) {
var length = attachers.length;
var index = -1;
var entry;
while (++index < length) {
entry = attachers[index];
if (entry[0] === plugin) {
return entry;
}
}
}
/* Parse a file (in string or VFile representation)
* into a Unist node using the `Parser` on the
* processor. */
function parse(doc) {
var file = vfile(doc);
var Parser;
freeze();
Parser = processor.Parser;
assertParser('parse', Parser);
if (newable(Parser)) {
return new Parser(String(file), file).parse();
}
return Parser(String(file), file); // eslint-disable-line new-cap
}
/* Run transforms on a Unist node representation of a file
* (in string or VFile representation), async. */
function run(node, file, cb) {
assertNode(node);
freeze();
if (!cb && func(file)) {
cb = file;
file = null;
}
if (!cb) {
return new Promise(executor);
}
executor(null, cb);
function executor(resolve, reject) {
transformers.run(node, vfile(file), done);
function done(err, tree, file) {
tree = tree || node;
if (err) {
reject(err);
} else if (resolve) {
resolve(tree);
} else {
cb(null, tree, file);
}
}
}
}
/* Run transforms on a Unist node representation of a file
* (in string or VFile representation), sync. */
function runSync(node, file) {
var complete = false;
var result;
run(node, file, done);
assertDone('runSync', 'run', complete);
return result;
function done(err, tree) {
complete = true;
bail(err);
result = tree;
}
}
/* Stringify a Unist node representation of a file
* (in string or VFile representation) into a string
* using the `Compiler` on the processor. */
function stringify(node, doc) {
var file = vfile(doc);
var Compiler;
freeze();
Compiler = processor.Compiler;
assertCompiler('stringify', Compiler);
assertNode(node);
if (newable(Compiler)) {
return new Compiler(node, file).compile();
}
return Compiler(node, file); // eslint-disable-line new-cap
}
/* Parse a file (in string or VFile representation)
* into a Unist node using the `Parser` on the processor,
* then run transforms on that node, and compile the
* resulting node using the `Compiler` on the processor,
* and store that result on the VFile. */
function process(doc, cb) {
freeze();
assertParser('process', processor.Parser);
assertCompiler('process', processor.Compiler);
if (!cb) {
return new Promise(executor);
}
executor(null, cb);
function executor(resolve, reject) {
var file = vfile(doc);
pipeline.run(processor, {file: file}, done);
function done(err) {
if (err) {
reject(err);
} else if (resolve) {
resolve(file);
} else {
cb(null, file);
}
}
}
}
/* Process the given document (in string or VFile
* representation), sync. */
function processSync(doc) {
var complete = false;
var file;
freeze();
assertParser('processSync', processor.Parser);
assertCompiler('processSync', processor.Compiler);
file = vfile(doc);
process(file, done);
assertDone('processSync', 'process', complete);
return file;
function done(err) {
complete = true;
bail(err);
}
}
}
/* Check if `func` is a constructor. */
function newable(value) {
return func(value) && keys(value.prototype);
}
/* Check if `value` is an object with keys. */
function keys(value) {
var key;
for (key in value) {
return true;
}
return false;
}
/* Assert a parser is available. */
function assertParser(name, Parser) {
if (!func(Parser)) {
throw new Error('Cannot `' + name + '` without `Parser`');
}
}
/* Assert a compiler is available. */
function assertCompiler(name, Compiler) {
if (!func(Compiler)) {
throw new Error('Cannot `' + name + '` without `Compiler`');
}
}
/* Assert the processor is not frozen. */
function assertUnfrozen(name, frozen) {
if (frozen) {
throw new Error(
'Cannot invoke `' + name + '` on a frozen processor.\n' +
'Create a new processor first, by invoking it: ' +
'use `processor()` instead of `processor`.'
);
}
}
/* Assert `node` is a Unist node. */
function assertNode(node) {
if (!node || !string(node.type)) {
throw new Error('Expected node, got `' + node + '`');
}
}
/* Assert that `complete` is `true`. */
function assertDone(name, asyncName, complete) {
if (!complete) {
throw new Error('`' + name + '` finished async. Use `' + asyncName + '` instead');
}
}
},{"bail":3,"extend":4,"is-plain-obj":5,"trough":6,"vfile":7,"x-is-function":11,"x-is-string":12}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9iYWlsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V4dGVuZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmovaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJvdWdoL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmZpbGUvbm9kZV9tb2R1bGVzL3JlcGxhY2UtZXh0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZmaWxlL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXN0cmluZ2lmeS1wb3NpdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94LWlzLWZ1bmN0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3gtaXMtc3RyaW5nL2luZGV4LmpzIiwidW5pZmllZCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNySUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9RQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBiYWlsO1xuXG5mdW5jdGlvbiBiYWlsKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIGlzQXJyYXkgPSBmdW5jdGlvbiBpc0FycmF5KGFycikge1xuXHRpZiAodHlwZW9mIEFycmF5LmlzQXJyYXkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpO1xuXHR9XG5cblx0cmV0dXJuIHRvU3RyLmNhbGwoYXJyKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcblx0aWYgKCFvYmogfHwgdG9TdHIuY2FsbChvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHZhciBoYXNPd25Db25zdHJ1Y3RvciA9IGhhc093bi5jYWxsKG9iaiwgJ2NvbnN0cnVjdG9yJyk7XG5cdHZhciBoYXNJc1Byb3RvdHlwZU9mID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiYgaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgJ2lzUHJvdG90eXBlT2YnKTtcblx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFoYXNPd25Db25zdHJ1Y3RvciAmJiAhaGFzSXNQcm90b3R5cGVPZikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHQvLyBpZiBsYXN0IG9uZSBpcyBvd24sIHRoZW4gYWxsIHByb3BlcnRpZXMgYXJlIG93bi5cblx0dmFyIGtleTtcblx0Zm9yIChrZXkgaW4gb2JqKSB7IC8qKi8gfVxuXG5cdHJldHVybiB0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJyB8fCBoYXNPd24uY2FsbChvYmosIGtleSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4dGVuZCgpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lO1xuXHR2YXIgdGFyZ2V0ID0gYXJndW1lbnRzWzBdO1xuXHR2YXIgaSA9IDE7XG5cdHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuXHR2YXIgZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcblx0XHRpID0gMjtcblx0fVxuXHRpZiAodGFyZ2V0ID09IG51bGwgfHwgKHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicpKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1tpXTtcblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yIChuYW1lIGluIG9wdGlvbnMpIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0W25hbWVdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1tuYW1lXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICh0YXJnZXQgIT09IGNvcHkpIHtcblx0XHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0XHRpZiAoZGVlcCAmJiBjb3B5ICYmIChpc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGlzQXJyYXkoY29weSkpKSkge1xuXHRcdFx0XHRcdFx0aWYgKGNvcHlJc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcblxuXHRcdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb3B5ICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gY29weTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHgpIHtcblx0dmFyIHByb3RvdHlwZTtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmIChwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCksIHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB0cm91Z2g7XG5cbi8qIE1ldGhvZHMuICovXG52YXIgc2xpY2UgPSBbXS5zbGljZTtcblxuLyogQ3JlYXRlIG5ldyBtaWRkbGV3YXJlLiAqL1xuZnVuY3Rpb24gdHJvdWdoKCkge1xuICB2YXIgZm5zID0gW107XG4gIHZhciBtaWRkbGV3YXJlID0ge307XG5cbiAgbWlkZGxld2FyZS5ydW4gPSBydW47XG4gIG1pZGRsZXdhcmUudXNlID0gdXNlO1xuXG4gIHJldHVybiBtaWRkbGV3YXJlO1xuXG4gIC8qIFJ1biBgZm5zYC4gIExhc3QgYXJndW1lbnQgbXVzdCBiZVxuICAgKiBhIGNvbXBsZXRpb24gaGFuZGxlci4gKi9cbiAgZnVuY3Rpb24gcnVuKCkge1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBpbnB1dCA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7XG4gICAgdmFyIGRvbmUgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKHR5cGVvZiBkb25lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGZ1bmN0aW9uIGFzIGxhc3QgYXJndW1lbnQsIG5vdCAnICsgZG9uZSk7XG4gICAgfVxuXG4gICAgbmV4dC5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG5cbiAgICAvKiBSdW4gdGhlIG5leHQgYGZuYCwgaWYgYW55LiAqL1xuICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICB2YXIgZm4gPSBmbnNbKytpbmRleF07XG4gICAgICB2YXIgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgdmFyIHZhbHVlcyA9IHBhcmFtcy5zbGljZSgxKTtcbiAgICAgIHZhciBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICB2YXIgcG9zID0gLTE7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZG9uZShlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIENvcHkgbm9uLW51bGx5IGlucHV0IGludG8gdmFsdWVzLiAqL1xuICAgICAgd2hpbGUgKCsrcG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmICh2YWx1ZXNbcG9zXSA9PT0gbnVsbCB8fCB2YWx1ZXNbcG9zXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVzW3Bvc10gPSBpbnB1dFtwb3NdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlucHV0ID0gdmFsdWVzO1xuXG4gICAgICAvKiBOZXh0IG9yIGRvbmUuICovXG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgd3JhcChmbiwgbmV4dCkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZS5hcHBseShudWxsLCBbbnVsbF0uY29uY2F0KGlucHV0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogQWRkIGBmbmAgdG8gdGhlIGxpc3QuICovXG4gIGZ1bmN0aW9uIHVzZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYGZuYCB0byBiZSBhIGZ1bmN0aW9uLCBub3QgJyArIGZuKTtcbiAgICB9XG5cbiAgICBmbnMucHVzaChmbik7XG5cbiAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgfVxufVxuXG4vKiBXcmFwIGBmbmAuICBDYW4gYmUgc3luYyBvciBhc3luYzsgcmV0dXJuIGEgcHJvbWlzZSxcbiAqIHJlY2VpdmUgYSBjb21wbGV0aW9uIGhhbmRsZXIsIHJldHVybiBuZXcgdmFsdWVzIGFuZFxuICogZXJyb3JzLiAqL1xuZnVuY3Rpb24gd3JhcChmbiwgbmV4dCkge1xuICB2YXIgaW52b2tlZDtcblxuICByZXR1cm4gd3JhcHBlZDtcblxuICBmdW5jdGlvbiB3cmFwcGVkKCkge1xuICAgIHZhciBwYXJhbXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdmFyIGNhbGxiYWNrID0gZm4ubGVuZ3RoID4gcGFyYW1zLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBwYXJhbXMucHVzaChkb25lKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgcGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIFdlbGwsIHRoaXMgaXMgcXVpdGUgdGhlIHBpY2tsZS4gIGBmbmAgcmVjZWl2ZWRcbiAgICAgICAqIGEgY2FsbGJhY2sgYW5kIGludm9rZWQgaXQgKHRodXMgY29udGludWluZyB0aGVcbiAgICAgICAqIHBpcGVsaW5lKSwgYnV0IGxhdGVyIGFsc28gdGhyZXcgYW4gZXJyb3IuXG4gICAgICAgKiBXZeKAmXJlIG5vdCBhYm91dCB0byByZXN0YXJ0IHRoZSBwaXBlbGluZSBhZ2FpbixcbiAgICAgICAqIHNvIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgdG8gdGhyb3cgdGhlXG4gICAgICAgKiB0aGluZyBpbnN0ZWEuICovXG4gICAgICBpZiAoY2FsbGJhY2sgJiYgaW52b2tlZCkge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0LnRoZW4odGhlbiwgZG9uZSk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoZW4ocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBJbnZva2UgYG5leHRgLCBvbmx5IG9uY2UuICovXG4gIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgaWYgKCFpbnZva2VkKSB7XG4gICAgICBpbnZva2VkID0gdHJ1ZTtcblxuICAgICAgbmV4dC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEludm9rZSBgZG9uZWAgd2l0aCBvbmUgdmFsdWUuXG4gICAqIFRyYWNrcyBpZiBhbiBlcnJvciBpcyBwYXNzZWQsIHRvby4gKi9cbiAgZnVuY3Rpb24gdGhlbih2YWx1ZSkge1xuICAgIGRvbmUobnVsbCwgdmFsdWUpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHJlcGxhY2UgPSByZXF1aXJlKCdyZXBsYWNlLWV4dCcpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnaXMtYnVmZmVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVkZpbGU7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm90byA9IFZGaWxlLnByb3RvdHlwZTtcblxucHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbnByb3RvLm1lc3NhZ2UgPSBtZXNzYWdlO1xucHJvdG8uaW5mbyA9IGluZm87XG5wcm90by5mYWlsID0gZmFpbDtcblxuLyogU2xpZ2h0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgUmVtb3ZlIGluIHRoZSBmdXR1cmUuICovXG5wcm90by53YXJuID0gbWVzc2FnZTtcblxuLyogT3JkZXIgb2Ygc2V0dGluZyAobGVhc3Qgc3BlY2lmaWMgdG8gbW9zdCksIHdlIG5lZWQgdGhpcyBiZWNhdXNlXG4gKiBvdGhlcndpc2UgYHtzdGVtOiAnYScsIHBhdGg6ICd+L2IuanMnfWAgd291bGQgdGhyb3csIGFzIGEgcGF0aFxuICogaXMgbmVlZGVkIGJlZm9yZSBhIHN0ZW0gY2FuIGJlIHNldC4gKi9cbnZhciBvcmRlciA9IFtcbiAgJ2hpc3RvcnknLFxuICAncGF0aCcsXG4gICdiYXNlbmFtZScsXG4gICdzdGVtJyxcbiAgJ2V4dG5hbWUnLFxuICAnZGlybmFtZSdcbl07XG5cbi8qIENvbnN0cnVjdCBhIG5ldyBmaWxlLiAqL1xuZnVuY3Rpb24gVkZpbGUob3B0aW9ucykge1xuICB2YXIgcHJvcDtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGVuZ3RoO1xuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgfHwgYnVmZmVyKG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IHtjb250ZW50czogb3B0aW9uc307XG4gIH0gZWxzZSBpZiAoJ21lc3NhZ2UnIGluIG9wdGlvbnMgJiYgJ21lc3NhZ2VzJyBpbiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVkZpbGUpKSB7XG4gICAgcmV0dXJuIG5ldyBWRmlsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuZGF0YSA9IHt9O1xuICB0aGlzLm1lc3NhZ2VzID0gW107XG4gIHRoaXMuaGlzdG9yeSA9IFtdO1xuICB0aGlzLmN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLyogU2V0IHBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAqL1xuICBpbmRleCA9IC0xO1xuICBsZW5ndGggPSBvcmRlci5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcm9wID0gb3JkZXJbaW5kZXhdO1xuXG4gICAgaWYgKG93bi5jYWxsKG9wdGlvbnMsIHByb3ApKSB7XG4gICAgICB0aGlzW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICB9XG4gIH1cblxuICAvKiBTZXQgbm9uLXBhdGggcmVsYXRlZCBwcm9wZXJ0aWVzLiAqL1xuICBmb3IgKHByb3AgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcmRlci5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgdGhpc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG59XG5cbi8qIEFjY2VzcyBmdWxsIHBhdGggKGB+L2luZGV4Lm1pbi5qc2ApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAncGF0aCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV07XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHBhdGgpIHtcbiAgICBhc3NlcnROb25FbXB0eShwYXRoLCAncGF0aCcpO1xuXG4gICAgaWYgKHBhdGggIT09IHRoaXMucGF0aCkge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocGF0aCk7XG4gICAgfVxuICB9XG59KTtcblxuLyogQWNjZXNzIHBhcmVudCBwYXRoIChgfmApLiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCAnZGlybmFtZScsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5kaXJuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGRpcm5hbWUpIHtcbiAgICBhc3NlcnRQYXRoKHRoaXMucGF0aCwgJ2Rpcm5hbWUnKTtcbiAgICB0aGlzLnBhdGggPSBwYXRoLmpvaW4oZGlybmFtZSB8fCAnJywgdGhpcy5iYXNlbmFtZSk7XG4gIH1cbn0pO1xuXG4vKiBBY2Nlc3MgYmFzZW5hbWUgKGBpbmRleC5taW4uanNgKS4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgJ2Jhc2VuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCkgOiB1bmRlZmluZWQ7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKGJhc2VuYW1lKSB7XG4gICAgYXNzZXJ0Tm9uRW1wdHkoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIGFzc2VydFBhcnQoYmFzZW5hbWUsICdiYXNlbmFtZScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIGJhc2VuYW1lKTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBleHRuYW1lIChgLmpzYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdleHRuYW1lJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmV4dG5hbWUodGhpcy5wYXRoKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoZXh0bmFtZSkge1xuICAgIHZhciBleHQgPSBleHRuYW1lIHx8ICcnO1xuXG4gICAgYXNzZXJ0UGFydChleHQsICdleHRuYW1lJyk7XG4gICAgYXNzZXJ0UGF0aCh0aGlzLnBhdGgsICdleHRuYW1lJyk7XG5cbiAgICBpZiAoZXh0KSB7XG4gICAgICBpZiAoZXh0LmNoYXJBdCgwKSAhPT0gJy4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIG11c3Qgc3RhcnQgd2l0aCBgLmAnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dC5pbmRleE9mKCcuJywgMSkgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGV4dG5hbWVgIGNhbm5vdCBjb250YWluIG11bHRpcGxlIGRvdHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdGggPSByZXBsYWNlKHRoaXMucGF0aCwgZXh0KTtcbiAgfVxufSk7XG5cbi8qIEFjY2VzcyBzdGVtIChgaW5kZXgubWluYCkuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sICdzdGVtJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGF0aCA9PT0gJ3N0cmluZycgPyBwYXRoLmJhc2VuYW1lKHRoaXMucGF0aCwgdGhpcy5leHRuYW1lKSA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoc3RlbSkge1xuICAgIGFzc2VydE5vbkVtcHR5KHN0ZW0sICdzdGVtJyk7XG4gICAgYXNzZXJ0UGFydChzdGVtLCAnc3RlbScpO1xuICAgIHRoaXMucGF0aCA9IHBhdGguam9pbih0aGlzLmRpcm5hbWUgfHwgJycsIHN0ZW0gKyAodGhpcy5leHRuYW1lIHx8ICcnKSk7XG4gIH1cbn0pO1xuXG4vKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2RpbmcpIHtcbiAgdmFyIHZhbHVlID0gdGhpcy5jb250ZW50cyB8fCAnJztcbiAgcmV0dXJuIGJ1ZmZlcih2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZyhlbmNvZGluZykgOiBTdHJpbmcodmFsdWUpO1xufVxuXG4vKiBDcmVhdGUgYSBtZXNzYWdlIHdpdGggYHJlYXNvbmAgYXQgYHBvc2l0aW9uYC5cbiAqIFdoZW4gYW4gZXJyb3IgaXMgcGFzc2VkIGluIGFzIGByZWFzb25gLCBjb3BpZXMgdGhlIHN0YWNrLiAqL1xuZnVuY3Rpb24gbWVzc2FnZShyZWFzb24sIHBvc2l0aW9uLCBydWxlSWQpIHtcbiAgdmFyIGZpbGVQYXRoID0gdGhpcy5wYXRoO1xuICB2YXIgcmFuZ2UgPSBzdHJpbmdpZnkocG9zaXRpb24pIHx8ICcxOjEnO1xuICB2YXIgbG9jYXRpb247XG4gIHZhciBlcnI7XG5cbiAgbG9jYXRpb24gPSB7XG4gICAgc3RhcnQ6IHtsaW5lOiBudWxsLCBjb2x1bW46IG51bGx9LFxuICAgIGVuZDoge2xpbmU6IG51bGwsIGNvbHVtbjogbnVsbH1cbiAgfTtcblxuICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24ucG9zaXRpb24pIHtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnBvc2l0aW9uO1xuICB9XG5cbiAgaWYgKHBvc2l0aW9uKSB7XG4gICAgLyogTG9jYXRpb24uICovXG4gICAgaWYgKHBvc2l0aW9uLnN0YXJ0KSB7XG4gICAgICBsb2NhdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbi5zdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogUG9zaXRpb24uICovXG4gICAgICBsb2NhdGlvbi5zdGFydCA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGVyciA9IG5ldyBWTWVzc2FnZShyZWFzb24ubWVzc2FnZSB8fCByZWFzb24pO1xuXG4gIGVyci5uYW1lID0gKGZpbGVQYXRoID8gZmlsZVBhdGggKyAnOicgOiAnJykgKyByYW5nZTtcbiAgZXJyLmZpbGUgPSBmaWxlUGF0aCB8fCAnJztcbiAgZXJyLnJlYXNvbiA9IHJlYXNvbi5tZXNzYWdlIHx8IHJlYXNvbjtcbiAgZXJyLmxpbmUgPSBwb3NpdGlvbiA/IHBvc2l0aW9uLmxpbmUgOiBudWxsO1xuICBlcnIuY29sdW1uID0gcG9zaXRpb24gPyBwb3NpdGlvbi5jb2x1bW4gOiBudWxsO1xuICBlcnIubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgZXJyLnJ1bGVJZCA9IHJ1bGVJZCB8fCBudWxsO1xuICBlcnIuc291cmNlID0gbnVsbDtcbiAgZXJyLmZhdGFsID0gZmFsc2U7XG5cbiAgaWYgKHJlYXNvbi5zdGFjaykge1xuICAgIGVyci5zdGFjayA9IHJlYXNvbi5zdGFjaztcbiAgfVxuXG4gIHRoaXMubWVzc2FnZXMucHVzaChlcnIpO1xuXG4gIHJldHVybiBlcnI7XG59XG5cbi8qIEZhaWwuIENyZWF0ZXMgYSB2bWVzc2FnZSwgYXNzb2NpYXRlcyBpdCB3aXRoIHRoZSBmaWxlLFxuICogYW5kIHRocm93cyBpdC4gKi9cbmZ1bmN0aW9uIGZhaWwoKSB7XG4gIHZhciBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgbWVzc2FnZS5mYXRhbCA9IHRydWU7XG5cbiAgdGhyb3cgbWVzc2FnZTtcbn1cblxuLyogSW5mby4gQ3JlYXRlcyBhIHZtZXNzYWdlLCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlIGZpbGUsXG4gKiBhbmQgbWFya3MgdGhlIGZhdGFsaXR5IGFzIG51bGwuICovXG5mdW5jdGlvbiBpbmZvKCkge1xuICB2YXIgbWVzc2FnZSA9IHRoaXMubWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIG1lc3NhZ2UuZmF0YWwgPSBudWxsO1xuXG4gIHJldHVybiBtZXNzYWdlO1xufVxuXG4vKiBJbmhlcml0IGZyb20gYEVycm9yI2AuICovXG5mdW5jdGlvbiBWTWVzc2FnZVByb3RvdHlwZSgpIHt9XG5WTWVzc2FnZVByb3RvdHlwZS5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5WTWVzc2FnZS5wcm90b3R5cGUgPSBuZXcgVk1lc3NhZ2VQcm90b3R5cGUoKTtcblxuLyogTWVzc2FnZSBwcm9wZXJ0aWVzLiAqL1xucHJvdG8gPSBWTWVzc2FnZS5wcm90b3R5cGU7XG5cbnByb3RvLmZpbGUgPSAnJztcbnByb3RvLm5hbWUgPSAnJztcbnByb3RvLnJlYXNvbiA9ICcnO1xucHJvdG8ubWVzc2FnZSA9ICcnO1xucHJvdG8uc3RhY2sgPSAnJztcbnByb3RvLmZhdGFsID0gbnVsbDtcbnByb3RvLmNvbHVtbiA9IG51bGw7XG5wcm90by5saW5lID0gbnVsbDtcblxuLyogQ29uc3RydWN0IGEgbmV3IGZpbGUgbWVzc2FnZS5cbiAqXG4gKiBOb3RlOiBXZSBjYW5ub3QgaW52b2tlIGBFcnJvcmAgb24gdGhlIGNyZWF0ZWQgY29udGV4dCxcbiAqIGFzIHRoYXQgYWRkcyByZWFkb25seSBgbGluZWAgYW5kIGBjb2x1bW5gIGF0dHJpYnV0ZXMgb25cbiAqIFNhZmFyaSA5LCB0aHVzIHRocm93aW5nIGFuZCBmYWlsaW5nIHRoZSBkYXRhLiAqL1xuZnVuY3Rpb24gVk1lc3NhZ2UocmVhc29uKSB7XG4gIHRoaXMubWVzc2FnZSA9IHJlYXNvbjtcbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBhIHBhdGggKGkuZS4sIGRvZXNcbiAqIG5vdCBjb250YWluIGBwYXRoLnNlcGApLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UGFydChwYXJ0LCBuYW1lKSB7XG4gIGlmIChwYXJ0LmluZGV4T2YocGF0aC5zZXApICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgY2Fubm90IGJlIGEgcGF0aDogZGlkIG5vdCBleHBlY3QgYCcgKyBwYXRoLnNlcCArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYHBhcnRgIGlzIG5vdCBlbXB0eS4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vbkVtcHR5KHBhcnQsIG5hbWUpIHtcbiAgaWYgKCFwYXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgJyArIG5hbWUgKyAnYCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgYHBhdGhgIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCwgbmFtZSkge1xuICBpZiAoIXBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgYCcgKyBuYW1lICsgJ2AgcmVxdWlyZXMgYHBhdGhgIHRvIGJlIHNldCB0b28nKTtcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxuZnVuY3Rpb24gcmVwbGFjZUV4dChucGF0aCwgZXh0KSB7XG4gIGlmICh0eXBlb2YgbnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5wYXRoO1xuICB9XG5cbiAgaWYgKG5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBucGF0aDtcbiAgfVxuXG4gIHZhciBuRmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKG5wYXRoLCBwYXRoLmV4dG5hbWUobnBhdGgpKSArIGV4dDtcbiAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUobnBhdGgpLCBuRmlsZU5hbWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGxhY2VFeHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnk7XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSkge1xuICAvKiBOb3RoaW5nLiAqL1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qIE5vZGUuICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3Bvc2l0aW9uJykgfHwgb3duLmNhbGwodmFsdWUsICd0eXBlJykpIHtcbiAgICByZXR1cm4gbG9jYXRpb24odmFsdWUucG9zaXRpb24pO1xuICB9XG5cbiAgLyogTG9jYXRpb24uICovXG4gIGlmIChvd24uY2FsbCh2YWx1ZSwgJ3N0YXJ0JykgfHwgb3duLmNhbGwodmFsdWUsICdlbmQnKSkge1xuICAgIHJldHVybiBsb2NhdGlvbih2YWx1ZSk7XG4gIH1cblxuICAvKiBQb3NpdGlvbi4gKi9cbiAgaWYgKG93bi5jYWxsKHZhbHVlLCAnbGluZScpIHx8IG93bi5jYWxsKHZhbHVlLCAnY29sdW1uJykpIHtcbiAgICByZXR1cm4gcG9zaXRpb24odmFsdWUpO1xuICB9XG5cbiAgLyogPyAqL1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb24ocG9zKSB7XG4gIGlmICghcG9zIHx8IHR5cGVvZiBwb3MgIT09ICdvYmplY3QnKSB7XG4gICAgcG9zID0ge307XG4gIH1cblxuICByZXR1cm4gaW5kZXgocG9zLmxpbmUpICsgJzonICsgaW5kZXgocG9zLmNvbHVtbik7XG59XG5cbmZ1bmN0aW9uIGxvY2F0aW9uKGxvYykge1xuICBpZiAoIWxvYyB8fCB0eXBlb2YgbG9jICE9PSAnb2JqZWN0Jykge1xuICAgIGxvYyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uKGxvYy5zdGFydCkgKyAnLScgKyBwb3NpdGlvbihsb2MuZW5kKTtcbn1cblxuZnVuY3Rpb24gaW5kZXgodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IDE7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZm4pID09PSAnW29iamVjdCBGdW5jdGlvbl0nXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmdcblxuZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gXCJbb2JqZWN0IFN0cmluZ11cIlxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBEZXBlbmRlbmNpZXMuICovXG52YXIgZXh0ZW5kID0gcmVxdWlyZSgnZXh0ZW5kJyk7XG52YXIgYmFpbCA9IHJlcXVpcmUoJ2JhaWwnKTtcbnZhciB2ZmlsZSA9IHJlcXVpcmUoJ3ZmaWxlJyk7XG52YXIgdHJvdWdoID0gcmVxdWlyZSgndHJvdWdoJyk7XG52YXIgc3RyaW5nID0gcmVxdWlyZSgneC1pcy1zdHJpbmcnKTtcbnZhciBmdW5jID0gcmVxdWlyZSgneC1pcy1mdW5jdGlvbicpO1xudmFyIHBsYWluID0gcmVxdWlyZSgnaXMtcGxhaW4tb2JqJyk7XG5cbi8qIEV4cG9zZSBhIGZyb3plbiBwcm9jZXNzb3IuICovXG5tb2R1bGUuZXhwb3J0cyA9IHVuaWZpZWQoKS5mcmVlemUoKTtcblxudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qIFByb2Nlc3MgcGlwZWxpbmUuICovXG52YXIgcGlwZWxpbmUgPSB0cm91Z2goKS51c2UocGlwZWxpbmVQYXJzZSkudXNlKHBpcGVsaW5lUnVuKS51c2UocGlwZWxpbmVTdHJpbmdpZnkpO1xuXG5mdW5jdGlvbiBwaXBlbGluZVBhcnNlKHAsIGN0eCkge1xuICBjdHgudHJlZSA9IHAucGFyc2UoY3R4LmZpbGUpO1xufVxuXG5mdW5jdGlvbiBwaXBlbGluZVJ1bihwLCBjdHgsIG5leHQpIHtcbiAgcC5ydW4oY3R4LnRyZWUsIGN0eC5maWxlLCBkb25lKTtcblxuICBmdW5jdGlvbiBkb25lKGVyciwgdHJlZSwgZmlsZSkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIG5leHQoZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4LnRyZWUgPSB0cmVlO1xuICAgICAgY3R4LmZpbGUgPSBmaWxlO1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVN0cmluZ2lmeShwLCBjdHgpIHtcbiAgY3R4LmZpbGUuY29udGVudHMgPSBwLnN0cmluZ2lmeShjdHgudHJlZSwgY3R4LmZpbGUpO1xufVxuXG4vKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIGZpcnN0IHByb2Nlc3Nvci4gKi9cbmZ1bmN0aW9uIHVuaWZpZWQoKSB7XG4gIHZhciBhdHRhY2hlcnMgPSBbXTtcbiAgdmFyIHRyYW5zZm9ybWVycyA9IHRyb3VnaCgpO1xuICB2YXIgbmFtZXNwYWNlID0ge307XG4gIHZhciBmcm96ZW4gPSBmYWxzZTtcbiAgdmFyIGZyZWV6ZUluZGV4ID0gLTE7XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LiAqL1xuICBwcm9jZXNzb3IuZGF0YSA9IGRhdGE7XG5cbiAgLyogTG9jay4gKi9cbiAgcHJvY2Vzc29yLmZyZWV6ZSA9IGZyZWV6ZTtcblxuICAvKiBQbHVnLWlucy4gKi9cbiAgcHJvY2Vzc29yLmF0dGFjaGVycyA9IGF0dGFjaGVycztcbiAgcHJvY2Vzc29yLnVzZSA9IHVzZTtcblxuICAvKiBBUEkuICovXG4gIHByb2Nlc3Nvci5wYXJzZSA9IHBhcnNlO1xuICBwcm9jZXNzb3Iuc3RyaW5naWZ5ID0gc3RyaW5naWZ5O1xuICBwcm9jZXNzb3IucnVuID0gcnVuO1xuICBwcm9jZXNzb3IucnVuU3luYyA9IHJ1blN5bmM7XG4gIHByb2Nlc3Nvci5wcm9jZXNzID0gcHJvY2VzcztcbiAgcHJvY2Vzc29yLnByb2Nlc3NTeW5jID0gcHJvY2Vzc1N5bmM7XG5cbiAgLyogRXhwb3NlLiAqL1xuICByZXR1cm4gcHJvY2Vzc29yO1xuXG4gIC8qIENyZWF0ZSBhIG5ldyBwcm9jZXNzb3IgYmFzZWQgb24gdGhlIHByb2Nlc3NvclxuICAgKiBpbiB0aGUgY3VycmVudCBzY29wZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc29yKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IHVuaWZpZWQoKTtcbiAgICB2YXIgbGVuZ3RoID0gYXR0YWNoZXJzLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAtMTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBkZXN0aW5hdGlvbi51c2UuYXBwbHkobnVsbCwgYXR0YWNoZXJzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24uZGF0YShleHRlbmQodHJ1ZSwge30sIG5hbWVzcGFjZSkpO1xuXG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICB9XG5cbiAgLyogRnJlZXplOiB1c2VkIHRvIHNpZ25hbCBhIHByb2Nlc3NvciB0aGF0IGhhcyBmaW5pc2hlZFxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdGFrZSB1bmlmaWVkIGl0c2VsZi4gIEl04oCZcyBmcm96ZW4uXG4gICAqIFBsdWctaW5zIHNob3VsZCBub3QgYmUgYWRkZWQgdG8gaXQuICBSYXRoZXIsIGl0IHNob3VsZFxuICAgKiBiZSBleHRlbmRlZCwgYnkgaW52b2tpbmcgaXQsIGJlZm9yZSBtb2RpZnlpbmcgaXQuXG4gICAqXG4gICAqIEluIGVzc2VuY2UsIGFsd2F5cyBpbnZva2UgdGhpcyB3aGVuIGV4cG9ydGluZyBhXG4gICAqIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gZnJlZXplKCkge1xuICAgIHZhciB2YWx1ZXM7XG4gICAgdmFyIHBsdWdpbjtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgdHJhbnNmb3JtZXI7XG5cbiAgICBpZiAoZnJvemVuKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIHdoaWxlICgrK2ZyZWV6ZUluZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgdmFsdWVzID0gYXR0YWNoZXJzW2ZyZWV6ZUluZGV4XTtcbiAgICAgIHBsdWdpbiA9IHZhbHVlc1swXTtcbiAgICAgIG9wdGlvbnMgPSB2YWx1ZXNbMV07XG4gICAgICB0cmFuc2Zvcm1lciA9IG51bGw7XG5cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWVzWzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lciA9IHBsdWdpbi5hcHBseShwcm9jZXNzb3IsIHZhbHVlcy5zbGljZSgxKSk7XG5cbiAgICAgIGlmIChmdW5jKHRyYW5zZm9ybWVyKSkge1xuICAgICAgICB0cmFuc2Zvcm1lcnMudXNlKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmcm96ZW4gPSB0cnVlO1xuICAgIGZyZWV6ZUluZGV4ID0gSW5maW5pdHk7XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yO1xuICB9XG5cbiAgLyogRGF0YSBtYW5hZ2VtZW50LlxuICAgKiBHZXR0ZXIgLyBzZXR0ZXIgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYyBpbmZvcm10aW9uLiAqL1xuICBmdW5jdGlvbiBkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoc3RyaW5nKGtleSkpIHtcbiAgICAgIC8qIFNldCBga2V5YC4gKi9cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGFzc2VydFVuZnJvemVuKCdkYXRhJywgZnJvemVuKTtcblxuICAgICAgICBuYW1lc3BhY2Vba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIHJldHVybiBwcm9jZXNzb3I7XG4gICAgICB9XG5cbiAgICAgIC8qIEdldCBga2V5YC4gKi9cbiAgICAgIHJldHVybiAob3duLmNhbGwobmFtZXNwYWNlLCBrZXkpICYmIG5hbWVzcGFjZVtrZXldKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qIFNldCBzcGFjZS4gKi9cbiAgICBpZiAoa2V5KSB7XG4gICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIGZyb3plbik7XG4gICAgICBuYW1lc3BhY2UgPSBrZXk7XG4gICAgICByZXR1cm4gcHJvY2Vzc29yO1xuICAgIH1cblxuICAgIC8qIEdldCBzcGFjZS4gKi9cbiAgICByZXR1cm4gbmFtZXNwYWNlO1xuICB9XG5cbiAgLyogUGx1Zy1pbiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBQYXNzIGl0OlxuICAgKiAqICAgYW4gYXR0YWNoZXIgYW5kIG9wdGlvbnMsXG4gICAqICogICBhIHByZXNldCxcbiAgICogKiAgIGEgbGlzdCBvZiBwcmVzZXRzLCBhdHRhY2hlcnMsIGFuZCBhcmd1bWVudHMgKGxpc3RcbiAgICogICAgIG9mIGF0dGFjaGVycyBhbmQgb3B0aW9ucykuICovXG4gIGZ1bmN0aW9uIHVzZSh2YWx1ZSkge1xuICAgIHZhciBzZXR0aW5ncztcblxuICAgIGFzc2VydFVuZnJvemVuKCd1c2UnLCBmcm96ZW4pO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBlbHNlIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgYWRkUGx1Z2luLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICAgICAgYWRkTGlzdCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRQcmVzZXQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgbmFtZXNwYWNlLnNldHRpbmdzID0gZXh0ZW5kKG5hbWVzcGFjZS5zZXR0aW5ncyB8fCB7fSwgc2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzb3I7XG5cbiAgICBmdW5jdGlvbiBhZGRQcmVzZXQocmVzdWx0KSB7XG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKTtcblxuICAgICAgaWYgKHJlc3VsdC5zZXR0aW5ncykge1xuICAgICAgICBzZXR0aW5ncyA9IGV4dGVuZChzZXR0aW5ncyB8fCB7fSwgcmVzdWx0LnNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgIGlmIChmdW5jKHZhbHVlKSkge1xuICAgICAgICBhZGRQbHVnaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICgnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgICAgIGFkZFBsdWdpbi5hcHBseShudWxsLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkUHJlc2V0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgJyArIHZhbHVlICsgJ2AnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHtcbiAgICAgIHZhciBsZW5ndGg7XG4gICAgICB2YXIgaW5kZXg7XG5cbiAgICAgIGlmIChwbHVnaW5zID09PSBudWxsIHx8IHBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBFbXB0eSAqL1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGx1Z2lucyA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gcGx1Z2lucykge1xuICAgICAgICBsZW5ndGggPSBwbHVnaW5zLmxlbmd0aDtcbiAgICAgICAgaW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFkZChwbHVnaW5zW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFBsdWdpbihwbHVnaW4sIHZhbHVlKSB7XG4gICAgICB2YXIgZW50cnkgPSBmaW5kKHBsdWdpbik7XG5cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBpZiAocGxhaW4oZW50cnlbMV0pICYmIHBsYWluKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gZXh0ZW5kKGVudHJ5WzFdLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbnRyeVsxXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0YWNoZXJzLnB1c2goc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kKHBsdWdpbikge1xuICAgIHZhciBsZW5ndGggPSBhdHRhY2hlcnMubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IC0xO1xuICAgIHZhciBlbnRyeTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGF0dGFjaGVyc1tpbmRleF07XG5cbiAgICAgIGlmIChlbnRyeVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZVxuICAgKiBwcm9jZXNzb3IuICovXG4gIGZ1bmN0aW9uIHBhcnNlKGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgUGFyc2VyO1xuXG4gICAgZnJlZXplKCk7XG4gICAgUGFyc2VyID0gcHJvY2Vzc29yLlBhcnNlcjtcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgUGFyc2VyKTtcblxuICAgIGlmIChuZXdhYmxlKFBhcnNlcikpIHtcbiAgICAgIHJldHVybiBuZXcgUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSkucGFyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUGFyc2VyKFN0cmluZyhmaWxlKSwgZmlsZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgYXN5bmMuICovXG4gIGZ1bmN0aW9uIHJ1bihub2RlLCBmaWxlLCBjYikge1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG4gICAgZnJlZXplKCk7XG5cbiAgICBpZiAoIWNiICYmIGZ1bmMoZmlsZSkpIHtcbiAgICAgIGNiID0gZmlsZTtcbiAgICAgIGZpbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghY2IpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShleGVjdXRvcik7XG4gICAgfVxuXG4gICAgZXhlY3V0b3IobnVsbCwgY2IpO1xuXG4gICAgZnVuY3Rpb24gZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB0cmFuc2Zvcm1lcnMucnVuKG5vZGUsIHZmaWxlKGZpbGUpLCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIHRyZWUsIGZpbGUpIHtcbiAgICAgICAgdHJlZSA9IHRyZWUgfHwgbm9kZTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKHRyZWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIHRyZWUsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUnVuIHRyYW5zZm9ybXMgb24gYSBVbmlzdCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZVxuICAgKiAoaW4gc3RyaW5nIG9yIFZGaWxlIHJlcHJlc2VudGF0aW9uKSwgc3luYy4gKi9cbiAgZnVuY3Rpb24gcnVuU3luYyhub2RlLCBmaWxlKSB7XG4gICAgdmFyIGNvbXBsZXRlID0gZmFsc2U7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHJ1bihub2RlLCBmaWxlLCBkb25lKTtcblxuICAgIGFzc2VydERvbmUoJ3J1blN5bmMnLCAncnVuJywgY29tcGxldGUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCB0cmVlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICBiYWlsKGVycik7XG4gICAgICByZXN1bHQgPSB0cmVlO1xuICAgIH1cbiAgfVxuXG4gIC8qIFN0cmluZ2lmeSBhIFVuaXN0IG5vZGUgcmVwcmVzZW50YXRpb24gb2YgYSBmaWxlXG4gICAqIChpbiBzdHJpbmcgb3IgVkZpbGUgcmVwcmVzZW50YXRpb24pIGludG8gYSBzdHJpbmdcbiAgICogdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3Nvci4gKi9cbiAgZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUsIGRvYykge1xuICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcbiAgICB2YXIgQ29tcGlsZXI7XG5cbiAgICBmcmVlemUoKTtcbiAgICBDb21waWxlciA9IHByb2Nlc3Nvci5Db21waWxlcjtcbiAgICBhc3NlcnRDb21waWxlcignc3RyaW5naWZ5JywgQ29tcGlsZXIpO1xuICAgIGFzc2VydE5vZGUobm9kZSk7XG5cbiAgICBpZiAobmV3YWJsZShDb21waWxlcikpIHtcbiAgICAgIHJldHVybiBuZXcgQ29tcGlsZXIobm9kZSwgZmlsZSkuY29tcGlsZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21waWxlcihub2RlLCBmaWxlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gIH1cblxuICAvKiBQYXJzZSBhIGZpbGUgKGluIHN0cmluZyBvciBWRmlsZSByZXByZXNlbnRhdGlvbilcbiAgICogaW50byBhIFVuaXN0IG5vZGUgdXNpbmcgdGhlIGBQYXJzZXJgIG9uIHRoZSBwcm9jZXNzb3IsXG4gICAqIHRoZW4gcnVuIHRyYW5zZm9ybXMgb24gdGhhdCBub2RlLCBhbmQgY29tcGlsZSB0aGVcbiAgICogcmVzdWx0aW5nIG5vZGUgdXNpbmcgdGhlIGBDb21waWxlcmAgb24gdGhlIHByb2Nlc3NvcixcbiAgICogYW5kIHN0b3JlIHRoYXQgcmVzdWx0IG9uIHRoZSBWRmlsZS4gKi9cbiAgZnVuY3Rpb24gcHJvY2Vzcyhkb2MsIGNiKSB7XG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzJywgcHJvY2Vzc29yLlBhcnNlcik7XG4gICAgYXNzZXJ0Q29tcGlsZXIoJ3Byb2Nlc3MnLCBwcm9jZXNzb3IuQ29tcGlsZXIpO1xuXG4gICAgaWYgKCFjYikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGV4ZWN1dG9yKTtcbiAgICB9XG5cbiAgICBleGVjdXRvcihudWxsLCBjYik7XG5cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBmaWxlID0gdmZpbGUoZG9jKTtcblxuICAgICAgcGlwZWxpbmUucnVuKHByb2Nlc3Nvciwge2ZpbGU6IGZpbGV9LCBkb25lKTtcblxuICAgICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNiKG51bGwsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUHJvY2VzcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgKGluIHN0cmluZyBvciBWRmlsZVxuICAgKiByZXByZXNlbnRhdGlvbiksIHN5bmMuICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NTeW5jKGRvYykge1xuICAgIHZhciBjb21wbGV0ZSA9IGZhbHNlO1xuICAgIHZhciBmaWxlO1xuXG4gICAgZnJlZXplKCk7XG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5QYXJzZXIpO1xuICAgIGFzc2VydENvbXBpbGVyKCdwcm9jZXNzU3luYycsIHByb2Nlc3Nvci5Db21waWxlcik7XG4gICAgZmlsZSA9IHZmaWxlKGRvYyk7XG5cbiAgICBwcm9jZXNzKGZpbGUsIGRvbmUpO1xuXG4gICAgYXNzZXJ0RG9uZSgncHJvY2Vzc1N5bmMnLCAncHJvY2VzcycsIGNvbXBsZXRlKTtcblxuICAgIHJldHVybiBmaWxlO1xuXG4gICAgZnVuY3Rpb24gZG9uZShlcnIpIHtcbiAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGJhaWwoZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuLyogQ2hlY2sgaWYgYGZ1bmNgIGlzIGEgY29uc3RydWN0b3IuICovXG5mdW5jdGlvbiBuZXdhYmxlKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jKHZhbHVlKSAmJiBrZXlzKHZhbHVlLnByb3RvdHlwZSk7XG59XG5cbi8qIENoZWNrIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IHdpdGgga2V5cy4gKi9cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qIEFzc2VydCBhIHBhcnNlciBpcyBhdmFpbGFibGUuICovXG5mdW5jdGlvbiBhc3NlcnRQYXJzZXIobmFtZSwgUGFyc2VyKSB7XG4gIGlmICghZnVuYyhQYXJzZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgUGFyc2VyYCcpO1xuICB9XG59XG5cbi8qIEFzc2VydCBhIGNvbXBpbGVyIGlzIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIENvbXBpbGVyKSB7XG4gIGlmICghZnVuYyhDb21waWxlcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBDb21waWxlcmAnKTtcbiAgfVxufVxuXG4vKiBBc3NlcnQgdGhlIHByb2Nlc3NvciBpcyBub3QgZnJvemVuLiAqL1xuZnVuY3Rpb24gYXNzZXJ0VW5mcm96ZW4obmFtZSwgZnJvemVuKSB7XG4gIGlmIChmcm96ZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGludm9rZSBgJyArIG5hbWUgKyAnYCBvbiBhIGZyb3plbiBwcm9jZXNzb3IuXFxuJyArXG4gICAgICAnQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBmaXJzdCwgYnkgaW52b2tpbmcgaXQ6ICcgK1xuICAgICAgJ3VzZSBgcHJvY2Vzc29yKClgIGluc3RlYWQgb2YgYHByb2Nlc3NvcmAuJ1xuICAgICk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IGBub2RlYCBpcyBhIFVuaXN0IG5vZGUuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlKG5vZGUpIHtcbiAgaWYgKCFub2RlIHx8ICFzdHJpbmcobm9kZS50eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9kZSwgZ290IGAnICsgbm9kZSArICdgJyk7XG4gIH1cbn1cblxuLyogQXNzZXJ0IHRoYXQgYGNvbXBsZXRlYCBpcyBgdHJ1ZWAuICovXG5mdW5jdGlvbiBhc3NlcnREb25lKG5hbWUsIGFzeW5jTmFtZSwgY29tcGxldGUpIHtcbiAgaWYgKCFjb21wbGV0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignYCcgKyBuYW1lICsgJ2AgZmluaXNoZWQgYXN5bmMuIFVzZSBgJyArIGFzeW5jTmFtZSArICdgIGluc3RlYWQnKTtcbiAgfVxufVxuIl19
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
module.exports=[
"address",
"article",
"aside",
"base",
"basefont",
"blockquote",
"body",
"caption",
"center",
"col",
"colgroup",
"dd",
"details",
"dialog",
"dir",
"div",
"dl",
"dt",
"fieldset",
"figcaption",
"figure",
"footer",
"form",
"frame",
"frameset",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"head",
"header",
"hgroup",
"hr",
"html",
"iframe",
"legend",
"li",
"link",
"main",
"menu",
"menuitem",
"meta",
"nav",
"noframes",
"ol",
"optgroup",
"option",
"p",
"param",
"pre",
"section",
"source",
"title",
"summary",
"table",
"tbody",
"td",
"tfoot",
"th",
"thead",
"title",
"tr",
"track",
"ul"
]
},{}],2:[function(require,module,exports){
'use strict';
var entities = require('parse-entities');
module.exports = factory;
/* Factory to create an entity decoder. */
function factory(ctx) {
decoder.raw = decodeRaw;
return decoder;
/* Normalize `position` to add an `indent`. */
function normalize(position) {
var offsets = ctx.offset;
var line = position.line;
var result = [];
while (++line) {
if (!(line in offsets)) {
break;
}
result.push((offsets[line] || 0) + 1);
}
return {
start: position,
indent: result
};
}
/* Handle a warning.
* See https://github.com/wooorm/parse-entities
* for the warnings. */
function handleWarning(reason, position, code) {
if (code === 3) {
return;
}
ctx.file.message(reason, position);
}
/* Decode `value` (at `position`) into text-nodes. */
function decoder(value, position, handler) {
entities(value, {
position: normalize(position),
warning: handleWarning,
text: handler,
reference: handler,
textContext: ctx,
referenceContext: ctx
});
}
/* Decode `value` (at `position`) into a string. */
function decodeRaw(value, position) {
return entities(value, {
position: normalize(position),
warning: handleWarning
});
}
}
},{"parse-entities":54}],3:[function(require,module,exports){
'use strict';
module.exports = {
position: true,
gfm: true,
commonmark: false,
footnotes: false,
pedantic: false,
blocks: require('./block-elements.json')
};
},{"./block-elements.json":1}],4:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
var index = value.indexOf('\n', fromIndex);
while (index > fromIndex) {
if (value.charAt(index - 1) !== ' ') {
break;
}
index--;
}
return index;
}
},{}],5:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
return value.indexOf('`', fromIndex);
}
},{}],6:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
return value.indexOf('~~', fromIndex);
}
},{}],7:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
var asterisk = value.indexOf('*', fromIndex);
var underscore = value.indexOf('_', fromIndex);
if (underscore === -1) {
return asterisk;
}
if (asterisk === -1) {
return underscore;
}
return underscore < asterisk ? underscore : asterisk;
}
},{}],8:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
return value.indexOf('\\', fromIndex);
}
},{}],9:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
var link = value.indexOf('[', fromIndex);
var image = value.indexOf('![', fromIndex);
if (image === -1) {
return link;
}
/* Link can never be `-1` if an image is found, so we don’t need
* to check for that :) */
return link < image ? link : image;
}
},{}],10:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
var asterisk = value.indexOf('**', fromIndex);
var underscore = value.indexOf('__', fromIndex);
if (underscore === -1) {
return asterisk;
}
if (asterisk === -1) {
return underscore;
}
return underscore < asterisk ? underscore : asterisk;
}
},{}],11:[function(require,module,exports){
'use strict';
module.exports = locate;
function locate(value, fromIndex) {
return value.indexOf('<', fromIndex);
}
},{}],12:[function(require,module,exports){
'use strict';
module.exports = locate;
var PROTOCOLS = ['https://', 'http://', 'mailto:'];
function locate(value, fromIndex) {
var length = PROTOCOLS.length;
var index = -1;
var min = -1;
var position;
if (!this.options.gfm) {
return -1;
}
while (++index < length) {
position = value.indexOf(PROTOCOLS[index], fromIndex);
if (position !== -1 && (position < min || min === -1)) {
min = position;
}
}
return min;
}
},{}],13:[function(require,module,exports){
'use strict';
var xtend = require('xtend');
var removePosition = require('unist-util-remove-position');
module.exports = parse;
var C_NEWLINE = '\n';
var EXPRESSION_LINE_BREAKS = /\r\n|\r/g;
/* Parse the bound file. */
function parse() {
var self = this;
var value = String(self.file);
var start = {line: 1, column: 1, offset: 0};
var content = xtend(start);
var node;
/* Clean non-unix newlines: `\r\n` and `\r` are all
* changed to `\n`. This should not affect positional
* information. */
value = value.replace(EXPRESSION_LINE_BREAKS, C_NEWLINE);
if (value.charCodeAt(0) === 0xFEFF) {
value = value.slice(1);
content.column++;
content.offset++;
}
node = {
type: 'root',
children: self.tokenizeBlock(value, content),
position: {
start: start,
end: self.eof || xtend(start)
}
};
if (!self.options.position) {
removePosition(node, true);
}
return node;
}
},{"unist-util-remove-position":66,"xtend":69}],14:[function(require,module,exports){
'use strict';
var xtend = require('xtend');
var toggle = require('state-toggle');
var vfileLocation = require('vfile-location');
var unescape = require('./unescape');
var decode = require('./decode');
var tokenizer = require('./tokenizer');
module.exports = Parser;
function Parser(doc, file) {
this.file = file;
this.offset = {};
this.options = xtend(this.options);
this.setOptions({});
this.inList = false;
this.inBlock = false;
this.inLink = false;
this.atStart = true;
this.toOffset = vfileLocation(file).toOffset;
this.unescape = unescape(this, 'escape');
this.decode = decode(this);
}
var proto = Parser.prototype;
/* Expose core. */
proto.setOptions = require('./set-options');
proto.parse = require('./parse');
/* Expose `defaults`. */
proto.options = require('./defaults');
/* Enter and exit helpers. */
proto.exitStart = toggle('atStart', true);
proto.enterList = toggle('inList', false);
proto.enterLink = toggle('inLink', false);
proto.enterBlock = toggle('inBlock', false);
/* Nodes that can interupt a paragraph:
*
* ```markdown
* A paragraph, followed by a thematic break.
* ___
* ```
*
* In the above example, the thematic break “interupts”
* the paragraph. */
proto.interruptParagraph = [
['thematicBreak'],
['atxHeading'],
['fencedCode'],
['blockquote'],
['html'],
['setextHeading', {commonmark: false}],
['definition', {commonmark: false}],
['footnote', {commonmark: false}]
];
/* Nodes that can interupt a list:
*
* ```markdown
* - One
* ___
* ```
*
* In the above example, the thematic break “interupts”
* the list. */
proto.interruptList = [
['fencedCode', {pedantic: false}],
['thematicBreak', {pedantic: false}],
['definition', {commonmark: false}],
['footnote', {commonmark: false}]
];
/* Nodes that can interupt a blockquote:
*
* ```markdown
* > A paragraph.
* ___
* ```
*
* In the above example, the thematic break “interupts”
* the blockquote. */
proto.interruptBlockquote = [
['indentedCode', {commonmark: true}],
['fencedCode', {commonmark: true}],
['atxHeading', {commonmark: true}],
['setextHeading', {commonmark: true}],
['thematicBreak', {commonmark: true}],
['html', {commonmark: true}],
['list', {commonmark: true}],
['definition', {commonmark: false}],
['footnote', {commonmark: false}]
];
/* Handlers. */
proto.blockTokenizers = {
newline: require('./tokenize/newline'),
indentedCode: require('./tokenize/code-indented'),
fencedCode: require('./tokenize/code-fenced'),
blockquote: require('./tokenize/blockquote'),
atxHeading: require('./tokenize/heading-atx'),
thematicBreak: require('./tokenize/thematic-break'),
list: require('./tokenize/list'),
setextHeading: require('./tokenize/heading-setext'),
html: require('./tokenize/html-block'),
footnote: require('./tokenize/footnote-definition'),
definition: require('./tokenize/definition'),
table: require('./tokenize/table'),
paragraph: require('./tokenize/paragraph')
};
proto.inlineTokenizers = {
escape: require('./tokenize/escape'),
autoLink: require('./tokenize/auto-link'),
url: require('./tokenize/url'),
html: require('./tokenize/html-inline'),
link: require('./tokenize/link'),
reference: require('./tokenize/reference'),
strong: require('./tokenize/strong'),
emphasis: require('./tokenize/emphasis'),
deletion: require('./tokenize/delete'),
code: require('./tokenize/code-inline'),
break: require('./tokenize/break'),
text: require('./tokenize/text')
};
/* Expose precedence. */
proto.blockMethods = keys(proto.blockTokenizers);
proto.inlineMethods = keys(proto.inlineTokenizers);
/* Tokenizers. */
proto.tokenizeBlock = tokenizer('block');
proto.tokenizeInline = tokenizer('inline');
proto.tokenizeFactory = tokenizer;
/* Get all keys in `value`. */
function keys(value) {
var result = [];
var key;
for (key in value) {
result.push(key);
}
return result;
}
},{"./decode":2,"./defaults":3,"./parse":13,"./set-options":15,"./tokenize/auto-link":16,"./tokenize/blockquote":17,"./tokenize/break":18,"./tokenize/code-fenced":19,"./tokenize/code-indented":20,"./tokenize/code-inline":21,"./tokenize/definition":22,"./tokenize/delete":23,"./tokenize/emphasis":24,"./tokenize/escape":25,"./tokenize/footnote-definition":26,"./tokenize/heading-atx":27,"./tokenize/heading-setext":28,"./tokenize/html-block":29,"./tokenize/html-inline":30,"./tokenize/link":31,"./tokenize/list":32,"./tokenize/newline":33,"./tokenize/paragraph":34,"./tokenize/reference":35,"./tokenize/strong":36,"./tokenize/table":37,"./tokenize/text":38,"./tokenize/thematic-break":39,"./tokenize/url":40,"./tokenizer":41,"./unescape":42,"state-toggle":61,"vfile-location":68,"xtend":69}],15:[function(require,module,exports){
'use strict';
var xtend = require('xtend');
var escapes = require('markdown-escapes');
var defaults = require('./defaults');
module.exports = setOptions;
function setOptions(options) {
var self = this;
var current = self.options;
var key;
var value;
if (options == null) {
options = {};
} else if (typeof options === 'object') {
options = xtend(options);
} else {
throw new Error(
'Invalid value `' + options + '` ' +
'for setting `options`'
);
}
for (key in defaults) {
value = options[key];
if (value == null) {
value = current[key];
}
if (
(key !== 'blocks' && typeof value !== 'boolean') ||
(key === 'blocks' && typeof value !== 'object')
) {
throw new Error('Invalid value `' + value + '` for setting `options.' + key + '`');
}
options[key] = value;
}
self.options = options;
self.escape = escapes(options);
return self;
}
},{"./defaults":3,"markdown-escapes":53,"xtend":69}],16:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var decode = require('parse-entities');
var locate = require('../locate/tag');
module.exports = autoLink;
autoLink.locator = locate;
autoLink.notInLink = true;
var C_LT = '<';
var C_GT = '>';
var C_AT_SIGN = '@';
var C_SLASH = '/';
var MAILTO = 'mailto:';
var MAILTO_LENGTH = MAILTO.length;
/* Tokenise a link. */
function autoLink(eat, value, silent) {
var self;
var subvalue;
var length;
var index;
var queue;
var character;
var hasAtCharacter;
var link;
var now;
var content;
var tokenize;
var exit;
if (value.charAt(0) !== C_LT) {
return;
}
self = this;
subvalue = '';
length = value.length;
index = 0;
queue = '';
hasAtCharacter = false;
link = '';
index++;
subvalue = C_LT;
while (index < length) {
character = value.charAt(index);
if (
whitespace(character) ||
character === C_GT ||
character === C_AT_SIGN ||
(character === ':' && value.charAt(index + 1) === C_SLASH)
) {
break;
}
queue += character;
index++;
}
if (!queue) {
return;
}
link += queue;
queue = '';
character = value.charAt(index);
link += character;
index++;
if (character === C_AT_SIGN) {
hasAtCharacter = true;
} else {
if (
character !== ':' ||
value.charAt(index + 1) !== C_SLASH
) {
return;
}
link += C_SLASH;
index++;
}
while (index < length) {
character = value.charAt(index);
if (whitespace(character) || character === C_GT) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
if (!queue || character !== C_GT) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
link += queue;
content = link;
subvalue += link + character;
now = eat.now();
now.column++;
now.offset++;
if (hasAtCharacter) {
if (link.slice(0, MAILTO_LENGTH).toLowerCase() === MAILTO) {
content = content.substr(MAILTO_LENGTH);
now.column += MAILTO_LENGTH;
now.offset += MAILTO_LENGTH;
} else {
link = MAILTO + link;
}
}
/* Temporarily remove support for escapes in autolinks. */
tokenize = self.inlineTokenizers.escape;
self.inlineTokenizers.escape = null;
exit = self.enterLink();
content = self.tokenizeInline(content, now);
self.inlineTokenizers.escape = tokenize;
exit();
return eat(subvalue)({
type: 'link',
title: null,
url: decode(link),
children: content
});
}
},{"../locate/tag":11,"is-whitespace-character":51,"parse-entities":54}],17:[function(require,module,exports){
'use strict';
var trim = require('trim');
var interrupt = require('../util/interrupt');
module.exports = blockquote;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_GT = '>';
/* Tokenise a blockquote. */
function blockquote(eat, value, silent) {
var self = this;
var offsets = self.offset;
var tokenizers = self.blockTokenizers;
var interruptors = self.interruptBlockquote;
var now = eat.now();
var currentLine = now.line;
var length = value.length;
var values = [];
var contents = [];
var indents = [];
var add;
var index = 0;
var character;
var rest;
var nextIndex;
var content;
var line;
var startIndex;
var prefixed;
var exit;
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
index++;
}
if (value.charAt(index) !== C_GT) {
return;
}
if (silent) {
return true;
}
index = 0;
while (index < length) {
nextIndex = value.indexOf(C_NEWLINE, index);
startIndex = index;
prefixed = false;
if (nextIndex === -1) {
nextIndex = length;
}
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
index++;
}
if (value.charAt(index) === C_GT) {
index++;
prefixed = true;
if (value.charAt(index) === C_SPACE) {
index++;
}
} else {
index = startIndex;
}
content = value.slice(index, nextIndex);
if (!prefixed && !trim(content)) {
index = startIndex;
break;
}
if (!prefixed) {
rest = value.slice(index);
/* Check if the following code contains a possible
* block. */
if (interrupt(interruptors, tokenizers, self, [eat, rest, true])) {
break;
}
}
line = startIndex === index ? content : value.slice(startIndex, nextIndex);
indents.push(index - startIndex);
values.push(line);
contents.push(content);
index = nextIndex + 1;
}
index = -1;
length = indents.length;
add = eat(values.join(C_NEWLINE));
while (++index < length) {
offsets[currentLine] = (offsets[currentLine] || 0) + indents[index];
currentLine++;
}
exit = self.enterBlock();
contents = self.tokenizeBlock(contents.join(C_NEWLINE), now);
exit();
return add({
type: 'blockquote',
children: contents
});
}
},{"../util/interrupt":45,"trim":63}],18:[function(require,module,exports){
'use strict';
var locate = require('../locate/break');
module.exports = hardBreak;
hardBreak.locator = locate;
var MIN_BREAK_LENGTH = 2;
function hardBreak(eat, value, silent) {
var length = value.length;
var index = -1;
var queue = '';
var character;
while (++index < length) {
character = value.charAt(index);
if (character === '\n') {
if (index < MIN_BREAK_LENGTH) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
queue += character;
return eat(queue)({type: 'break'});
}
if (character !== ' ') {
return;
}
queue += character;
}
}
},{"../locate/break":4}],19:[function(require,module,exports){
'use strict';
var trim = require('trim-trailing-lines');
module.exports = fencedCode;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_TILDE = '~';
var C_TICK = '`';
var MIN_FENCE_COUNT = 3;
var CODE_INDENT_COUNT = 4;
function fencedCode(eat, value, silent) {
var self = this;
var settings = self.options;
var length = value.length + 1;
var index = 0;
var subvalue = '';
var fenceCount;
var marker;
var character;
var flag;
var queue;
var content;
var exdentedContent;
var closing;
var exdentedClosing;
var indent;
var now;
if (!settings.gfm) {
return;
}
/* Eat initial spacing. */
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
subvalue += character;
index++;
}
indent = index;
/* Eat the fence. */
character = value.charAt(index);
if (character !== C_TILDE && character !== C_TICK) {
return;
}
index++;
marker = character;
fenceCount = 1;
subvalue += character;
while (index < length) {
character = value.charAt(index);
if (character !== marker) {
break;
}
subvalue += character;
fenceCount++;
index++;
}
if (fenceCount < MIN_FENCE_COUNT) {
return;
}
/* Eat spacing before flag. */
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
subvalue += character;
index++;
}
/* Eat flag. */
flag = '';
queue = '';
while (index < length) {
character = value.charAt(index);
if (
character === C_NEWLINE ||
character === C_TILDE ||
character === C_TICK
) {
break;
}
if (character === C_SPACE || character === C_TAB) {
queue += character;
} else {
flag += queue + character;
queue = '';
}
index++;
}
character = value.charAt(index);
if (character && character !== C_NEWLINE) {
return;
}
if (silent) {
return true;
}
now = eat.now();
now.column += subvalue.length;
now.offset += subvalue.length;
subvalue += flag;
flag = self.decode.raw(self.unescape(flag), now);
if (queue) {
subvalue += queue;
}
queue = '';
closing = '';
exdentedClosing = '';
content = '';
exdentedContent = '';
/* Eat content. */
while (index < length) {
character = value.charAt(index);
content += closing;
exdentedContent += exdentedClosing;
closing = '';
exdentedClosing = '';
if (character !== C_NEWLINE) {
content += character;
exdentedClosing += character;
index++;
continue;
}
/* Add the newline to `subvalue` if its the first
* character. Otherwise, add it to the `closing`
* queue. */
if (content) {
closing += character;
exdentedClosing += character;
} else {
subvalue += character;
}
queue = '';
index++;
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE) {
break;
}
queue += character;
index++;
}
closing += queue;
exdentedClosing += queue.slice(indent);
if (queue.length >= CODE_INDENT_COUNT) {
continue;
}
queue = '';
while (index < length) {
character = value.charAt(index);
if (character !== marker) {
break;
}
queue += character;
index++;
}
closing += queue;
exdentedClosing += queue;
if (queue.length < fenceCount) {
continue;
}
queue = '';
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
closing += character;
exdentedClosing += character;
index++;
}
if (!character || character === C_NEWLINE) {
break;
}
}
subvalue += content + closing;
return eat(subvalue)({
type: 'code',
lang: flag || null,
value: trim(exdentedContent)
});
}
},{"trim-trailing-lines":62}],20:[function(require,module,exports){
'use strict';
var repeat = require('repeat-string');
var trim = require('trim-trailing-lines');
module.exports = indentedCode;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var CODE_INDENT_COUNT = 4;
var CODE_INDENT = repeat(C_SPACE, CODE_INDENT_COUNT);
/* Tokenise indented code. */
function indentedCode(eat, value, silent) {
var index = -1;
var length = value.length;
var subvalue = '';
var content = '';
var subvalueQueue = '';
var contentQueue = '';
var character;
var blankQueue;
var indent;
while (++index < length) {
character = value.charAt(index);
if (indent) {
indent = false;
subvalue += subvalueQueue;
content += contentQueue;
subvalueQueue = '';
contentQueue = '';
if (character === C_NEWLINE) {
subvalueQueue = character;
contentQueue = character;
} else {
subvalue += character;
content += character;
while (++index < length) {
character = value.charAt(index);
if (!character || character === C_NEWLINE) {
contentQueue = character;
subvalueQueue = character;
break;
}
subvalue += character;
content += character;
}
}
} else if (
character === C_SPACE &&
value.charAt(index + 1) === character &&
value.charAt(index + 2) === character &&
value.charAt(index + 3) === character
) {
subvalueQueue += CODE_INDENT;
index += 3;
indent = true;
} else if (character === C_TAB) {
subvalueQueue += character;
indent = true;
} else {
blankQueue = '';
while (character === C_TAB || character === C_SPACE) {
blankQueue += character;
character = value.charAt(++index);
}
if (character !== C_NEWLINE) {
break;
}
subvalueQueue += blankQueue + character;
contentQueue += character;
}
}
if (content) {
if (silent) {
return true;
}
return eat(subvalue)({
type: 'code',
lang: null,
value: trim(content)
});
}
}
},{"repeat-string":60,"trim-trailing-lines":62}],21:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var locate = require('../locate/code-inline');
module.exports = inlineCode;
inlineCode.locator = locate;
var C_TICK = '`';
/* Tokenise inline code. */
function inlineCode(eat, value, silent) {
var length = value.length;
var index = 0;
var queue = '';
var tickQueue = '';
var contentQueue;
var subqueue;
var count;
var openingCount;
var subvalue;
var character;
var found;
var next;
while (index < length) {
if (value.charAt(index) !== C_TICK) {
break;
}
queue += C_TICK;
index++;
}
if (!queue) {
return;
}
subvalue = queue;
openingCount = index;
queue = '';
next = value.charAt(index);
count = 0;
while (index < length) {
character = next;
next = value.charAt(index + 1);
if (character === C_TICK) {
count++;
tickQueue += character;
} else {
count = 0;
queue += character;
}
if (count && next !== C_TICK) {
if (count === openingCount) {
subvalue += queue + tickQueue;
found = true;
break;
}
queue += tickQueue;
tickQueue = '';
}
index++;
}
if (!found) {
if (openingCount % 2 !== 0) {
return;
}
queue = '';
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
contentQueue = '';
subqueue = '';
length = queue.length;
index = -1;
while (++index < length) {
character = queue.charAt(index);
if (whitespace(character)) {
subqueue += character;
continue;
}
if (subqueue) {
if (contentQueue) {
contentQueue += subqueue;
}
subqueue = '';
}
contentQueue += character;
}
return eat(subvalue)({
type: 'inlineCode',
value: contentQueue
});
}
},{"../locate/code-inline":5,"is-whitespace-character":51}],22:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var normalize = require('../util/normalize');
module.exports = definition;
definition.notInList = true;
definition.notInBlock = true;
var C_DOUBLE_QUOTE = '"';
var C_SINGLE_QUOTE = '\'';
var C_BACKSLASH = '\\';
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_BRACKET_OPEN = '[';
var C_BRACKET_CLOSE = ']';
var C_PAREN_OPEN = '(';
var C_PAREN_CLOSE = ')';
var C_COLON = ':';
var C_LT = '<';
var C_GT = '>';
function definition(eat, value, silent) {
var self = this;
var commonmark = self.options.commonmark;
var index = 0;
var length = value.length;
var subvalue = '';
var beforeURL;
var beforeTitle;
var queue;
var character;
var test;
var identifier;
var url;
var title;
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
break;
}
subvalue += character;
index++;
}
character = value.charAt(index);
if (character !== C_BRACKET_OPEN) {
return;
}
index++;
subvalue += character;
queue = '';
while (index < length) {
character = value.charAt(index);
if (character === C_BRACKET_CLOSE) {
break;
} else if (character === C_BACKSLASH) {
queue += character;
index++;
character = value.charAt(index);
}
queue += character;
index++;
}
if (
!queue ||
value.charAt(index) !== C_BRACKET_CLOSE ||
value.charAt(index + 1) !== C_COLON
) {
return;
}
identifier = queue;
subvalue += queue + C_BRACKET_CLOSE + C_COLON;
index = subvalue.length;
queue = '';
while (index < length) {
character = value.charAt(index);
if (
character !== C_TAB &&
character !== C_SPACE &&
character !== C_NEWLINE
) {
break;
}
subvalue += character;
index++;
}
character = value.charAt(index);
queue = '';
beforeURL = subvalue;
if (character === C_LT) {
index++;
while (index < length) {
character = value.charAt(index);
if (!isEnclosedURLCharacter(character)) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
if (character === isEnclosedURLCharacter.delimiter) {
subvalue += C_LT + queue + character;
index++;
} else {
if (commonmark) {
return;
}
index -= queue.length + 1;
queue = '';
}
}
if (!queue) {
while (index < length) {
character = value.charAt(index);
if (!isUnclosedURLCharacter(character)) {
break;
}
queue += character;
index++;
}
subvalue += queue;
}
if (!queue) {
return;
}
url = queue;
queue = '';
while (index < length) {
character = value.charAt(index);
if (
character !== C_TAB &&
character !== C_SPACE &&
character !== C_NEWLINE
) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
test = null;
if (character === C_DOUBLE_QUOTE) {
test = C_DOUBLE_QUOTE;
} else if (character === C_SINGLE_QUOTE) {
test = C_SINGLE_QUOTE;
} else if (character === C_PAREN_OPEN) {
test = C_PAREN_CLOSE;
}
if (!test) {
queue = '';
index = subvalue.length;
} else if (queue) {
subvalue += queue + character;
index = subvalue.length;
queue = '';
while (index < length) {
character = value.charAt(index);
if (character === test) {
break;
}
if (character === C_NEWLINE) {
index++;
character = value.charAt(index);
if (character === C_NEWLINE || character === test) {
return;
}
queue += C_NEWLINE;
}
queue += character;
index++;
}
character = value.charAt(index);
if (character !== test) {
return;
}
beforeTitle = subvalue;
subvalue += queue + character;
index++;
title = queue;
queue = '';
} else {
return;
}
while (index < length) {
character = value.charAt(index);
if (character !== C_TAB && character !== C_SPACE) {
break;
}
subvalue += character;
index++;
}
character = value.charAt(index);
if (!character || character === C_NEWLINE) {
if (silent) {
return true;
}
beforeURL = eat(beforeURL).test().end;
url = self.decode.raw(self.unescape(url), beforeURL);
if (title) {
beforeTitle = eat(beforeTitle).test().end;
title = self.decode.raw(self.unescape(title), beforeTitle);
}
return eat(subvalue)({
type: 'definition',
identifier: normalize(identifier),
title: title || null,
url: url
});
}
}
/* Check if `character` can be inside an enclosed URI. */
function isEnclosedURLCharacter(character) {
return character !== C_GT &&
character !== C_BRACKET_OPEN &&
character !== C_BRACKET_CLOSE;
}
isEnclosedURLCharacter.delimiter = C_GT;
/* Check if `character` can be inside an unclosed URI. */
function isUnclosedURLCharacter(character) {
return character !== C_BRACKET_OPEN &&
character !== C_BRACKET_CLOSE &&
!whitespace(character);
}
},{"../util/normalize":46,"is-whitespace-character":51}],23:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var locate = require('../locate/delete');
module.exports = strikethrough;
strikethrough.locator = locate;
var C_TILDE = '~';
var DOUBLE = '~~';
function strikethrough(eat, value, silent) {
var self = this;
var character = '';
var previous = '';
var preceding = '';
var subvalue = '';
var index;
var length;
var now;
if (
!self.options.gfm ||
value.charAt(0) !== C_TILDE ||
value.charAt(1) !== C_TILDE ||
whitespace(value.charAt(2))
) {
return;
}
index = 1;
length = value.length;
now = eat.now();
now.column += 2;
now.offset += 2;
while (++index < length) {
character = value.charAt(index);
if (
character === C_TILDE &&
previous === C_TILDE &&
(!preceding || !whitespace(preceding))
) {
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
return eat(DOUBLE + subvalue + DOUBLE)({
type: 'delete',
children: self.tokenizeInline(subvalue, now)
});
}
subvalue += previous;
preceding = previous;
previous = character;
}
}
},{"../locate/delete":6,"is-whitespace-character":51}],24:[function(require,module,exports){
'use strict';
var trim = require('trim');
var word = require('is-word-character');
var whitespace = require('is-whitespace-character');
var locate = require('../locate/emphasis');
module.exports = emphasis;
emphasis.locator = locate;
var C_ASTERISK = '*';
var C_UNDERSCORE = '_';
function emphasis(eat, value, silent) {
var self = this;
var index = 0;
var character = value.charAt(index);
var now;
var pedantic;
var marker;
var queue;
var subvalue;
var length;
var prev;
if (character !== C_ASTERISK && character !== C_UNDERSCORE) {
return;
}
pedantic = self.options.pedantic;
subvalue = character;
marker = character;
length = value.length;
index++;
queue = '';
character = '';
if (pedantic && whitespace(value.charAt(index))) {
return;
}
while (index < length) {
prev = character;
character = value.charAt(index);
if (character === marker && (!pedantic || !whitespace(prev))) {
character = value.charAt(++index);
if (character !== marker) {
if (!trim(queue) || prev === marker) {
return;
}
if (!pedantic && marker === C_UNDERSCORE && word(character)) {
queue += marker;
continue;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
now = eat.now();
now.column++;
now.offset++;
return eat(subvalue + queue + marker)({
type: 'emphasis',
children: self.tokenizeInline(queue, now)
});
}
queue += marker;
}
if (!pedantic && character === '\\') {
queue += character;
character = value.charAt(++index);
}
queue += character;
index++;
}
}
},{"../locate/emphasis":7,"is-whitespace-character":51,"is-word-character":52,"trim":63}],25:[function(require,module,exports){
'use strict';
var locate = require('../locate/escape');
module.exports = escape;
escape.locator = locate;
function escape(eat, value, silent) {
var self = this;
var character;
var node;
if (value.charAt(0) === '\\') {
character = value.charAt(1);
if (self.escape.indexOf(character) !== -1) {
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
if (character === '\n') {
node = {type: 'break'};
} else {
node = {
type: 'text',
value: character
};
}
return eat('\\' + character)(node);
}
}
}
},{"../locate/escape":8}],26:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var normalize = require('../util/normalize');
module.exports = footnoteDefinition;
footnoteDefinition.notInList = true;
footnoteDefinition.notInBlock = true;
var C_BACKSLASH = '\\';
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_BRACKET_OPEN = '[';
var C_BRACKET_CLOSE = ']';
var C_CARET = '^';
var C_COLON = ':';
var EXPRESSION_INITIAL_TAB = /^( {4}|\t)?/gm;
function footnoteDefinition(eat, value, silent) {
var self = this;
var offsets = self.offset;
var index;
var length;
var subvalue;
var now;
var currentLine;
var content;
var queue;
var subqueue;
var character;
var identifier;
var add;
var exit;
if (!self.options.footnotes) {
return;
}
index = 0;
length = value.length;
subvalue = '';
now = eat.now();
currentLine = now.line;
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
subvalue += character;
index++;
}
if (
value.charAt(index) !== C_BRACKET_OPEN ||
value.charAt(index + 1) !== C_CARET
) {
return;
}
subvalue += C_BRACKET_OPEN + C_CARET;
index = subvalue.length;
queue = '';
while (index < length) {
character = value.charAt(index);
if (character === C_BRACKET_CLOSE) {
break;
} else if (character === C_BACKSLASH) {
queue += character;
index++;
character = value.charAt(index);
}
queue += character;
index++;
}
if (
!queue ||
value.charAt(index) !== C_BRACKET_CLOSE ||
value.charAt(index + 1) !== C_COLON
) {
return;
}
if (silent) {
return true;
}
identifier = normalize(queue);
subvalue += queue + C_BRACKET_CLOSE + C_COLON;
index = subvalue.length;
while (index < length) {
character = value.charAt(index);
if (character !== C_TAB && character !== C_SPACE) {
break;
}
subvalue += character;
index++;
}
now.column += subvalue.length;
now.offset += subvalue.length;
queue = '';
content = '';
subqueue = '';
while (index < length) {
character = value.charAt(index);
if (character === C_NEWLINE) {
subqueue = character;
index++;
while (index < length) {
character = value.charAt(index);
if (character !== C_NEWLINE) {
break;
}
subqueue += character;
index++;
}
queue += subqueue;
subqueue = '';
while (index < length) {
character = value.charAt(index);
if (character !== C_SPACE) {
break;
}
subqueue += character;
index++;
}
if (subqueue.length === 0) {
break;
}
queue += subqueue;
}
if (queue) {
content += queue;
queue = '';
}
content += character;
index++;
}
subvalue += content;
content = content.replace(EXPRESSION_INITIAL_TAB, function (line) {
offsets[currentLine] = (offsets[currentLine] || 0) + line.length;
currentLine++;
return '';
});
add = eat(subvalue);
exit = self.enterBlock();
content = self.tokenizeBlock(content, now);
exit();
return add({
type: 'footnoteDefinition',
identifier: identifier,
children: content
});
}
},{"../util/normalize":46,"is-whitespace-character":51}],27:[function(require,module,exports){
'use strict';
module.exports = atxHeading;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_HASH = '#';
var MAX_ATX_COUNT = 6;
function atxHeading(eat, value, silent) {
var self = this;
var settings = self.options;
var length = value.length + 1;
var index = -1;
var now = eat.now();
var subvalue = '';
var content = '';
var character;
var queue;
var depth;
/* Eat initial spacing. */
while (++index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
index--;
break;
}
subvalue += character;
}
/* Eat hashes. */
depth = 0;
while (++index <= length) {
character = value.charAt(index);
if (character !== C_HASH) {
index--;
break;
}
subvalue += character;
depth++;
}
if (depth > MAX_ATX_COUNT) {
return;
}
if (
!depth ||
(!settings.pedantic && value.charAt(index + 1) === C_HASH)
) {
return;
}
length = value.length + 1;
/* Eat intermediate white-space. */
queue = '';
while (++index < length) {
character = value.charAt(index);
if (character !== C_SPACE && character !== C_TAB) {
index--;
break;
}
queue += character;
}
/* Exit when not in pedantic mode without spacing. */
if (
!settings.pedantic &&
queue.length === 0 &&
character &&
character !== C_NEWLINE
) {
return;
}
if (silent) {
return true;
}
/* Eat content. */
subvalue += queue;
queue = '';
content = '';
while (++index < length) {
character = value.charAt(index);
if (!character || character === C_NEWLINE) {
break;
}
if (
character !== C_SPACE &&
character !== C_TAB &&
character !== C_HASH
) {
content += queue + character;
queue = '';
continue;
}
while (character === C_SPACE || character === C_TAB) {
queue += character;
character = value.charAt(++index);
}
while (character === C_HASH) {
queue += character;
character = value.charAt(++index);
}
while (character === C_SPACE || character === C_TAB) {
queue += character;
character = value.charAt(++index);
}
index--;
}
now.column += subvalue.length;
now.offset += subvalue.length;
subvalue += content + queue;
return eat(subvalue)({
type: 'heading',
depth: depth,
children: self.tokenizeInline(content, now)
});
}
},{}],28:[function(require,module,exports){
'use strict';
module.exports = setextHeading;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_EQUALS = '=';
var C_DASH = '-';
var MAX_HEADING_INDENT = 3;
/* Map of characters which can be used to mark setext
* headers, mapping to their corresponding depth. */
var SETEXT_MARKERS = {};
SETEXT_MARKERS[C_EQUALS] = 1;
SETEXT_MARKERS[C_DASH] = 2;
function setextHeading(eat, value, silent) {
var self = this;
var now = eat.now();
var length = value.length;
var index = -1;
var subvalue = '';
var content;
var queue;
var character;
var marker;
var depth;
/* Eat initial indentation. */
while (++index < length) {
character = value.charAt(index);
if (character !== C_SPACE || index >= MAX_HEADING_INDENT) {
index--;
break;
}
subvalue += character;
}
/* Eat content. */
content = '';
queue = '';
while (++index < length) {
character = value.charAt(index);
if (character === C_NEWLINE) {
index--;
break;
}
if (character === C_SPACE || character === C_TAB) {
queue += character;
} else {
content += queue + character;
queue = '';
}
}
now.column += subvalue.length;
now.offset += subvalue.length;
subvalue += content + queue;
/* Ensure the content is followed by a newline and a
* valid marker. */
character = value.charAt(++index);
marker = value.charAt(++index);
if (character !== C_NEWLINE || !SETEXT_MARKERS[marker]) {
return;
}
subvalue += character;
/* Eat Setext-line. */
queue = marker;
depth = SETEXT_MARKERS[marker];
while (++index < length) {
character = value.charAt(index);
if (character !== marker) {
if (character !== C_NEWLINE) {
return;
}
index--;
break;
}
queue += character;
}
if (silent) {
return true;
}
return eat(subvalue + queue)({
type: 'heading',
depth: depth,
children: self.tokenizeInline(content, now)
});
}
},{}],29:[function(require,module,exports){
'use strict';
var openCloseTag = require('../util/html').openCloseTag;
module.exports = blockHTML;
var C_TAB = '\t';
var C_SPACE = ' ';
var C_NEWLINE = '\n';
var C_LT = '<';
function blockHTML(eat, value, silent) {
var self = this;
var blocks = self.options.blocks;
var length = value.length;
var index = 0;
var next;
var line;
var offset;
var character;
var count;
var sequence;
var subvalue;
var sequences = [
[/^<(script|pre|style)(?=(\s|>|$))/i, /<\/(script|pre|style)>/i, true],
[/^<!--/, /-->/, true],
[/^<\?/, /\?>/, true],
[/^<![A-Za-z]/, />/, true],
[/^<!\[CDATA\[/, /\]\]>/, true],
[new RegExp('^</?(' + blocks.join('|') + ')(?=(\\s|/?>|$))', 'i'), /^$/, true],
[new RegExp(openCloseTag.source + '\\s*$'), /^$/, false]
];
/* Eat initial spacing. */
while (index < length) {
character = value.charAt(index);
if (character !== C_TAB && character !== C_SPACE) {
break;
}
index++;
}
if (value.charAt(index) !== C_LT) {
return;
}
next = value.indexOf(C_NEWLINE, index + 1);
next = next === -1 ? length : next;
line = value.slice(index, next);
offset = -1;
count = sequences.length;
while (++offset < count) {
if (sequences[offset][0].test(line)) {
sequence = sequences[offset];
break;
}
}
if (!sequence) {
return;
}
if (silent) {
return sequence[2];
}
index = next;
if (!sequence[1].test(line)) {
while (index < length) {
next = value.indexOf(C_NEWLINE, index + 1);
next = next === -1 ? length : next;
line = value.slice(index + 1, next);
if (sequence[1].test(line)) {
if (line) {
index = next;
}
break;
}
index = next;
}
}
subvalue = value.slice(0, index);
return eat(subvalue)({type: 'html', value: subvalue});
}
},{"../util/html":44}],30:[function(require,module,exports){
'use strict';
var alphabetical = require('is-alphabetical');
var locate = require('../locate/tag');
var tag = require('../util/html').tag;
module.exports = inlineHTML;
inlineHTML.locator = locate;
var EXPRESSION_HTML_LINK_OPEN = /^<a /i;
var EXPRESSION_HTML_LINK_CLOSE = /^<\/a>/i;
function inlineHTML(eat, value, silent) {
var self = this;
var length = value.length;
var character;
var subvalue;
if (value.charAt(0) !== '<' || length < 3) {
return;
}
character = value.charAt(1);
if (
!alphabetical(character) &&
character !== '?' &&
character !== '!' &&
character !== '/'
) {
return;
}
subvalue = value.match(tag);
if (!subvalue) {
return;
}
/* istanbul ignore if - not used yet. */
if (silent) {
return true;
}
subvalue = subvalue[0];
if (!self.inLink && EXPRESSION_HTML_LINK_OPEN.test(subvalue)) {
self.inLink = true;
} else if (self.inLink && EXPRESSION_HTML_LINK_CLOSE.test(subvalue)) {
self.inLink = false;
}
return eat(subvalue)({type: 'html', value: subvalue});
}
},{"../locate/tag":11,"../util/html":44,"is-alphabetical":49}],31:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var locate = require('../locate/link');
module.exports = link;
link.locator = locate;
var own = {}.hasOwnProperty;
var C_BACKSLASH = '\\';
var C_BRACKET_OPEN = '[';
var C_BRACKET_CLOSE = ']';
var C_PAREN_OPEN = '(';
var C_PAREN_CLOSE = ')';
var C_LT = '<';
var C_GT = '>';
var C_TICK = '`';
var C_DOUBLE_QUOTE = '"';
var C_SINGLE_QUOTE = '\'';
/* Map of characters, which can be used to mark link
* and image titles. */
var LINK_MARKERS = {};
LINK_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE;
LINK_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE;
/* Map of characters, which can be used to mark link
* and image titles in commonmark-mode. */
var COMMONMARK_LINK_MARKERS = {};
COMMONMARK_LINK_MARKERS[C_DOUBLE_QUOTE] = C_DOUBLE_QUOTE;
COMMONMARK_LINK_MARKERS[C_SINGLE_QUOTE] = C_SINGLE_QUOTE;
COMMONMARK_LINK_MARKERS[C_PAREN_OPEN] = C_PAREN_CLOSE;
function link(eat, value, silent) {
var self = this;
var subvalue = '';
var index = 0;
var character = value.charAt(0);
var pedantic = self.options.pedantic;
var commonmark = self.options.commonmark;
var gfm = self.options.gfm;
var closed;
var count;
var opening;
var beforeURL;
var beforeTitle;
var subqueue;
var hasMarker;
var markers;
var isImage;
var content;
var marker;
var length;
var title;
var depth;
var queue;
var url;
var now;
var exit;
var node;
/* Detect whether this is an image. */
if (character === '!') {
isImage = true;
subvalue = character;
character = value.charAt(++index);
}
/* Eat the opening. */
if (character !== C_BRACKET_OPEN) {
return;
}
/* Exit when this is a link and we’re already inside
* a link. */
if (!isImage && self.inLink) {
return;
}
subvalue += character;
queue = '';
index++;
/* Eat the content. */
length = value.length;
now = eat.now();
depth = 0;
now.column += index;
now.offset += index;
while (index < length) {
character = value.charAt(index);
subqueue = character;
if (character === C_TICK) {
/* Inline-code in link content. */
count = 1;
while (value.charAt(index + 1) === C_TICK) {
subqueue += character;
index++;
count++;
}
if (!opening) {
opening = count;
} else if (count >= opening) {
opening = 0;
}
} else if (character === C_BACKSLASH) {
/* Allow brackets to be escaped. */
index++;
subqueue += value.charAt(index);
/* In GFM mode, brackets in code still count.
* In all other modes, they don’t. This empty
* block prevents the next statements are
* entered. */
} else if ((!opening || gfm) && character === C_BRACKET_OPEN) {
depth++;
} else if ((!opening || gfm) && character === C_BRACKET_CLOSE) {
if (depth) {
depth--;
} else {
/* Allow white-space between content and
* url in GFM mode. */
if (!pedantic) {
while (index < length) {
character = value.charAt(index + 1);
if (!whitespace(character)) {
break;
}
subqueue += character;
index++;
}
}
if (value.charAt(index + 1) !== C_PAREN_OPEN) {
return;
}
subqueue += C_PAREN_OPEN;
closed = true;
index++;
break;
}
}
queue += subqueue;
subqueue = '';
index++;
}
/* Eat the content closing. */
if (!closed) {
return;
}
content = queue;
subvalue += queue + subqueue;
index++;
/* Eat white-space. */
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
subvalue += character;
index++;
}
/* Eat the URL. */
character = value.charAt(index);
markers = commonmark ? COMMONMARK_LINK_MARKERS : LINK_MARKERS;
queue = '';
beforeURL = subvalue;
if (character === C_LT) {
index++;
beforeURL += C_LT;
while (index < length) {
character = value.charAt(index);
if (character === C_GT) {
break;
}
if (commonmark && character === '\n') {
return;
}
queue += character;
index++;
}
if (value.charAt(index) !== C_GT) {
return;
}
subvalue += C_LT + queue + C_GT;
url = queue;
index++;
} else {
character = null;
subqueue = '';
while (index < length) {
character = value.charAt(index);
if (subqueue && own.call(markers, character)) {
break;
}
if (whitespace(character)) {
if (!pedantic) {
break;
}
subqueue += character;
} else {
if (character === C_PAREN_OPEN) {
depth++;
} else if (character === C_PAREN_CLOSE) {
if (depth === 0) {
break;
}
depth--;
}
queue += subqueue;
subqueue = '';
if (character === C_BACKSLASH) {
queue += C_BACKSLASH;
character = value.charAt(++index);
}
queue += character;
}
index++;
}
subvalue += queue;
url = queue;
index = subvalue.length;
}
/* Eat white-space. */
queue = '';
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
subvalue += queue;
/* Eat the title. */
if (queue && own.call(markers, character)) {
index++;
subvalue += character;
queue = '';
marker = markers[character];
beforeTitle = subvalue;
/* In commonmark-mode, things are pretty easy: the
* marker cannot occur inside the title.
*
* Non-commonmark does, however, support nested
* delimiters. */
if (commonmark) {
while (index < length) {
character = value.charAt(index);
if (character === marker) {
break;
}
if (character === C_BACKSLASH) {
queue += C_BACKSLASH;
character = value.charAt(++index);
}
index++;
queue += character;
}
character = value.charAt(index);
if (character !== marker) {
return;
}
title = queue;
subvalue += queue + character;
index++;
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
subvalue += character;
index++;
}
} else {
subqueue = '';
while (index < length) {
character = value.charAt(index);
if (character === marker) {
if (hasMarker) {
queue += marker + subqueue;
subqueue = '';
}
hasMarker = true;
} else if (!hasMarker) {
queue += character;
} else if (character === C_PAREN_CLOSE) {
subvalue += queue + marker + subqueue;
title = queue;
break;
} else if (whitespace(character)) {
subqueue += character;
} else {
queue += marker + subqueue + character;
subqueue = '';
hasMarker = false;
}
index++;
}
}
}
if (value.charAt(index) !== C_PAREN_CLOSE) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
subvalue += C_PAREN_CLOSE;
url = self.decode.raw(self.unescape(url), eat(beforeURL).test().end);
if (title) {
beforeTitle = eat(beforeTitle).test().end;
title = self.decode.raw(self.unescape(title), beforeTitle);
}
node = {
type: isImage ? 'image' : 'link',
title: title || null,
url: url
};
if (isImage) {
node.alt = self.decode.raw(self.unescape(content), now) || null;
} else {
exit = self.enterLink();
node.children = self.tokenizeInline(content, now);
exit();
}
return eat(subvalue)(node);
}
},{"../locate/link":9,"is-whitespace-character":51}],32:[function(require,module,exports){
'use strict';
/* eslint-disable max-params */
var trim = require('trim');
var repeat = require('repeat-string');
var decimal = require('is-decimal');
var getIndent = require('../util/get-indentation');
var removeIndent = require('../util/remove-indentation');
var interrupt = require('../util/interrupt');
module.exports = list;
var C_ASTERISK = '*';
var C_UNDERSCORE = '_';
var C_PLUS = '+';
var C_DASH = '-';
var C_DOT = '.';
var C_SPACE = ' ';
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_PAREN_CLOSE = ')';
var C_X_LOWER = 'x';
var TAB_SIZE = 4;
var EXPRESSION_LOOSE_LIST_ITEM = /\n\n(?!\s*$)/;
var EXPRESSION_TASK_ITEM = /^\[([ \t]|x|X)][ \t]/;
var EXPRESSION_BULLET = /^([ \t]*)([*+-]|\d+[.)])( {1,4}(?! )| |\t|$|(?=\n))([^\n]*)/;
var EXPRESSION_PEDANTIC_BULLET = /^([ \t]*)([*+-]|\d+[.)])([ \t]+)/;
var EXPRESSION_INITIAL_INDENT = /^( {1,4}|\t)?/gm;
/* Map of characters which can be used to mark
* list-items. */
var LIST_UNORDERED_MARKERS = {};
LIST_UNORDERED_MARKERS[C_ASTERISK] = true;
LIST_UNORDERED_MARKERS[C_PLUS] = true;
LIST_UNORDERED_MARKERS[C_DASH] = true;
/* Map of characters which can be used to mark
* list-items after a digit. */
var LIST_ORDERED_MARKERS = {};
LIST_ORDERED_MARKERS[C_DOT] = true;
/* Map of characters which can be used to mark
* list-items after a digit. */
var LIST_ORDERED_COMMONMARK_MARKERS = {};
LIST_ORDERED_COMMONMARK_MARKERS[C_DOT] = true;
LIST_ORDERED_COMMONMARK_MARKERS[C_PAREN_CLOSE] = true;
function list(eat, value, silent) {
var self = this;
var commonmark = self.options.commonmark;
var pedantic = self.options.pedantic;
var tokenizers = self.blockTokenizers;
var interuptors = self.interruptList;
var markers;
var index = 0;
var length = value.length;
var start = null;
var size = 0;
var queue;
var ordered;
var character;
var marker;
var nextIndex;
var startIndex;
var prefixed;
var currentMarker;
var content;
var line;
var prevEmpty;
var empty;
var items;
var allLines;
var emptyLines;
var item;
var enterTop;
var exitBlockquote;
var isLoose;
var node;
var now;
var end;
var indented;
while (index < length) {
character = value.charAt(index);
if (character === C_TAB) {
size += TAB_SIZE - (size % TAB_SIZE);
} else if (character === C_SPACE) {
size++;
} else {
break;
}
index++;
}
if (size >= TAB_SIZE) {
return;
}
character = value.charAt(index);
markers = commonmark ?
LIST_ORDERED_COMMONMARK_MARKERS :
LIST_ORDERED_MARKERS;
if (LIST_UNORDERED_MARKERS[character] === true) {
marker = character;
ordered = false;
} else {
ordered = true;
queue = '';
while (index < length) {
character = value.charAt(index);
if (!decimal(character)) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
if (!queue || markers[character] !== true) {
return;
}
start = parseInt(queue, 10);
marker = character;
}
character = value.charAt(++index);
if (character !== C_SPACE && character !== C_TAB) {
return;
}
if (silent) {
return true;
}
index = 0;
items = [];
allLines = [];
emptyLines = [];
while (index < length) {
nextIndex = value.indexOf(C_NEWLINE, index);
startIndex = index;
prefixed = false;
indented = false;
if (nextIndex === -1) {
nextIndex = length;
}
end = index + TAB_SIZE;
size = 0;
while (index < length) {
character = value.charAt(index);
if (character === C_TAB) {
size += TAB_SIZE - (size % TAB_SIZE);
} else if (character === C_SPACE) {
size++;
} else {
break;
}
index++;
}
if (size >= TAB_SIZE) {
indented = true;
}
if (item && size >= item.indent) {
indented = true;
}
character = value.charAt(index);
currentMarker = null;
if (!indented) {
if (LIST_UNORDERED_MARKERS[character] === true) {
currentMarker = character;
index++;
size++;
} else {
queue = '';
while (index < length) {
character = value.charAt(index);
if (!decimal(character)) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
index++;
if (queue && markers[character] === true) {
currentMarker = character;
size += queue.length + 1;
}
}
if (currentMarker) {
character = value.charAt(index);
if (character === C_TAB) {
size += TAB_SIZE - (size % TAB_SIZE);
index++;
} else if (character === C_SPACE) {
end = index + TAB_SIZE;
while (index < end) {
if (value.charAt(index) !== C_SPACE) {
break;
}
index++;
size++;
}
if (index === end && value.charAt(index) === C_SPACE) {
index -= TAB_SIZE - 1;
size -= TAB_SIZE - 1;
}
} else if (character !== C_NEWLINE && character !== '') {
currentMarker = null;
}
}
}
if (currentMarker) {
if (!pedantic && marker !== currentMarker) {
break;
}
prefixed = true;
} else {
if (!commonmark && !indented && value.charAt(startIndex) === C_SPACE) {
indented = true;
} else if (commonmark && item) {
indented = size >= item.indent || size > TAB_SIZE;
}
prefixed = false;
index = startIndex;
}
line = value.slice(startIndex, nextIndex);
content = startIndex === index ? line : value.slice(index, nextIndex);
if (
currentMarker === C_ASTERISK ||
currentMarker === C_UNDERSCORE ||
currentMarker === C_DASH
) {
if (tokenizers.thematicBreak.call(self, eat, line, true)) {
break;
}
}
prevEmpty = empty;
empty = !trim(content).length;
if (indented && item) {
item.value = item.value.concat(emptyLines, line);
allLines = allLines.concat(emptyLines, line);
emptyLines = [];
} else if (prefixed) {
if (emptyLines.length !== 0) {
item.value.push('');
item.trail = emptyLines.concat();
}
item = {
value: [line],
indent: size,
trail: []
};
items.push(item);
allLines = allLines.concat(emptyLines, line);
emptyLines = [];
} else if (empty) {
if (prevEmpty) {
break;
}
emptyLines.push(line);
} else {
if (prevEmpty) {
break;
}
if (interrupt(interuptors, tokenizers, self, [eat, line, true])) {
break;
}
item.value = item.value.concat(emptyLines, line);
allLines = allLines.concat(emptyLines, line);
emptyLines = [];
}
index = nextIndex + 1;
}
node = eat(allLines.join(C_NEWLINE)).reset({
type: 'list',
ordered: ordered,
start: start,
loose: null,
children: []
});
enterTop = self.enterList();
exitBlockquote = self.enterBlock();
isLoose = false;
index = -1;
length = items.length;
while (++index < length) {
item = items[index].value.join(C_NEWLINE);
now = eat.now();
item = eat(item)(listItem(self, item, now), node);
if (item.loose) {
isLoose = true;
}
item = items[index].trail.join(C_NEWLINE);
if (index !== length - 1) {
item += C_NEWLINE;
}
eat(item);
}
enterTop();
exitBlockquote();
node.loose = isLoose;
return node;
}
function listItem(ctx, value, position) {
var offsets = ctx.offset;
var fn = ctx.options.pedantic ? pedanticListItem : normalListItem;
var checked = null;
var task;
var indent;
value = fn.apply(null, arguments);
if (ctx.options.gfm) {
task = value.match(EXPRESSION_TASK_ITEM);
if (task) {
indent = task[0].length;
checked = task[1].toLowerCase() === C_X_LOWER;
offsets[position.line] += indent;
value = value.slice(indent);
}
}
return {
type: 'listItem',
loose: EXPRESSION_LOOSE_LIST_ITEM.test(value) ||
value.charAt(value.length - 1) === C_NEWLINE,
checked: checked,
children: ctx.tokenizeBlock(value, position)
};
}
/* Create a list-item using overly simple mechanics. */
function pedanticListItem(ctx, value, position) {
var offsets = ctx.offset;
var line = position.line;
/* Remove the list-item’s bullet. */
value = value.replace(EXPRESSION_PEDANTIC_BULLET, replacer);
/* The initial line was also matched by the below, so
* we reset the `line`. */
line = position.line;
return value.replace(EXPRESSION_INITIAL_INDENT, replacer);
/* A simple replacer which removed all matches,
* and adds their length to `offset`. */
function replacer($0) {
offsets[line] = (offsets[line] || 0) + $0.length;
line++;
return '';
}
}
/* Create a list-item using sane mechanics. */
function normalListItem(ctx, value, position) {
var offsets = ctx.offset;
var line = position.line;
var max;
var bullet;
var rest;
var lines;
var trimmedLines;
var index;
var length;
/* Remove the list-item’s bullet. */
value = value.replace(EXPRESSION_BULLET, replacer);
lines = value.split(C_NEWLINE);
trimmedLines = removeIndent(value, getIndent(max).indent).split(C_NEWLINE);
/* We replaced the initial bullet with something
* else above, which was used to trick
* `removeIndentation` into removing some more
* characters when possible. However, that could
* result in the initial line to be stripped more
* than it should be. */
trimmedLines[0] = rest;
offsets[line] = (offsets[line] || 0) + bullet.length;
line++;
index = 0;
length = lines.length;
while (++index < length) {
offsets[line] = (offsets[line] || 0) +
lines[index].length - trimmedLines[index].length;
line++;
}
return trimmedLines.join(C_NEWLINE);
function replacer($0, $1, $2, $3, $4) {
bullet = $1 + $2 + $3;
rest = $4;
/* Make sure that the first nine numbered list items
* can indent with an extra space. That is, when
* the bullet did not receive an extra final space. */
if (Number($2) < 10 && bullet.length % 2 === 1) {
$2 = C_SPACE + $2;
}
max = $1 + repeat(C_SPACE, $2.length) + $3;
return max + rest;
}
}
},{"../util/get-indentation":43,"../util/interrupt":45,"../util/remove-indentation":47,"is-decimal":50,"repeat-string":60,"trim":63}],33:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
module.exports = newline;
/* Tokenise newline. */
function newline(eat, value, silent) {
var character = value.charAt(0);
var length;
var subvalue;
var queue;
var index;
if (character !== '\n') {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
index = 1;
length = value.length;
subvalue = character;
queue = '';
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
queue += character;
if (character === '\n') {
subvalue += queue;
queue = '';
}
index++;
}
eat(subvalue);
}
},{"is-whitespace-character":51}],34:[function(require,module,exports){
'use strict';
var trim = require('trim');
var decimal = require('is-decimal');
var trimTrailingLines = require('trim-trailing-lines');
var interrupt = require('../util/interrupt');
module.exports = paragraph;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var TAB_SIZE = 4;
/* Tokenise paragraph. */
function paragraph(eat, value, silent) {
var self = this;
var settings = self.options;
var commonmark = settings.commonmark;
var gfm = settings.gfm;
var tokenizers = self.blockTokenizers;
var interruptors = self.interruptParagraph;
var index = value.indexOf(C_NEWLINE);
var length = value.length;
var position;
var subvalue;
var character;
var size;
var now;
while (index < length) {
/* Eat everything if there’s no following newline. */
if (index === -1) {
index = length;
break;
}
/* Stop if the next character is NEWLINE. */
if (value.charAt(index + 1) === C_NEWLINE) {
break;
}
/* In commonmark-mode, following indented lines
* are part of the paragraph. */
if (commonmark) {
size = 0;
position = index + 1;
while (position < length) {
character = value.charAt(position);
if (character === C_TAB) {
size = TAB_SIZE;
break;
} else if (character === C_SPACE) {
size++;
} else {
break;
}
position++;
}
if (size >= TAB_SIZE) {
index = value.indexOf(C_NEWLINE, index + 1);
continue;
}
}
subvalue = value.slice(index + 1);
/* Check if the following code contains a possible
* block. */
if (interrupt(interruptors, tokenizers, self, [eat, subvalue, true])) {
break;
}
/* Break if the following line starts a list, when
* already in a list, or when in commonmark, or when
* in gfm mode and the bullet is *not* numeric. */
if (
tokenizers.list.call(self, eat, subvalue, true) &&
(
self.inList ||
commonmark ||
(gfm && !decimal(trim.left(subvalue).charAt(0)))
)
) {
break;
}
position = index;
index = value.indexOf(C_NEWLINE, index + 1);
if (index !== -1 && trim(value.slice(position, index)) === '') {
index = position;
break;
}
}
subvalue = value.slice(0, index);
if (trim(subvalue) === '') {
eat(subvalue);
return null;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
now = eat.now();
subvalue = trimTrailingLines(subvalue);
return eat(subvalue)({
type: 'paragraph',
children: self.tokenizeInline(subvalue, now)
});
}
},{"../util/interrupt":45,"is-decimal":50,"trim":63,"trim-trailing-lines":62}],35:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
var locate = require('../locate/link');
var normalize = require('../util/normalize');
module.exports = reference;
reference.locator = locate;
var T_LINK = 'link';
var T_IMAGE = 'image';
var T_FOOTNOTE = 'footnote';
var REFERENCE_TYPE_SHORTCUT = 'shortcut';
var REFERENCE_TYPE_COLLAPSED = 'collapsed';
var REFERENCE_TYPE_FULL = 'full';
var C_CARET = '^';
var C_BACKSLASH = '\\';
var C_BRACKET_OPEN = '[';
var C_BRACKET_CLOSE = ']';
function reference(eat, value, silent) {
var self = this;
var character = value.charAt(0);
var index = 0;
var length = value.length;
var subvalue = '';
var intro = '';
var type = T_LINK;
var referenceType = REFERENCE_TYPE_SHORTCUT;
var content;
var identifier;
var now;
var node;
var exit;
var queue;
var bracketed;
var depth;
/* Check whether we’re eating an image. */
if (character === '!') {
type = T_IMAGE;
intro = character;
character = value.charAt(++index);
}
if (character !== C_BRACKET_OPEN) {
return;
}
index++;
intro += character;
queue = '';
/* Check whether we’re eating a footnote. */
if (
self.options.footnotes &&
type === T_LINK &&
value.charAt(index) === C_CARET
) {
intro += C_CARET;
index++;
type = T_FOOTNOTE;
}
/* Eat the text. */
depth = 0;
while (index < length) {
character = value.charAt(index);
if (character === C_BRACKET_OPEN) {
bracketed = true;
depth++;
} else if (character === C_BRACKET_CLOSE) {
if (!depth) {
break;
}
depth--;
}
if (character === C_BACKSLASH) {
queue += C_BACKSLASH;
character = value.charAt(++index);
}
queue += character;
index++;
}
subvalue = queue;
content = queue;
character = value.charAt(index);
if (character !== C_BRACKET_CLOSE) {
return;
}
index++;
subvalue += character;
queue = '';
while (index < length) {
character = value.charAt(index);
if (!whitespace(character)) {
break;
}
queue += character;
index++;
}
character = value.charAt(index);
/* Inline footnotes cannot have an identifier. */
if (type !== T_FOOTNOTE && character === C_BRACKET_OPEN) {
identifier = '';
queue += character;
index++;
while (index < length) {
character = value.charAt(index);
if (character === C_BRACKET_OPEN || character === C_BRACKET_CLOSE) {
break;
}
if (character === C_BACKSLASH) {
identifier += C_BACKSLASH;
character = value.charAt(++index);
}
identifier += character;
index++;
}
character = value.charAt(index);
if (character === C_BRACKET_CLOSE) {
referenceType = identifier ? REFERENCE_TYPE_FULL : REFERENCE_TYPE_COLLAPSED;
queue += identifier + character;
index++;
} else {
identifier = '';
}
subvalue += queue;
queue = '';
} else {
if (!content) {
return;
}
identifier = content;
}
/* Brackets cannot be inside the identifier. */
if (referenceType !== REFERENCE_TYPE_FULL && bracketed) {
return;
}
subvalue = intro + subvalue;
if (type === T_LINK && self.inLink) {
return null;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
if (type === T_FOOTNOTE && content.indexOf(' ') !== -1) {
return eat(subvalue)({
type: 'footnote',
children: this.tokenizeInline(content, eat.now())
});
}
now = eat.now();
now.column += intro.length;
now.offset += intro.length;
identifier = referenceType === REFERENCE_TYPE_FULL ? identifier : content;
node = {
type: type + 'Reference',
identifier: normalize(identifier)
};
if (type === T_LINK || type === T_IMAGE) {
node.referenceType = referenceType;
}
if (type === T_LINK) {
exit = self.enterLink();
node.children = self.tokenizeInline(content, now);
exit();
} else if (type === T_IMAGE) {
node.alt = self.decode.raw(self.unescape(content), now) || null;
}
return eat(subvalue)(node);
}
},{"../locate/link":9,"../util/normalize":46,"is-whitespace-character":51}],36:[function(require,module,exports){
'use strict';
var trim = require('trim');
var whitespace = require('is-whitespace-character');
var locate = require('../locate/strong');
module.exports = strong;
strong.locator = locate;
var C_ASTERISK = '*';
var C_UNDERSCORE = '_';
function strong(eat, value, silent) {
var self = this;
var index = 0;
var character = value.charAt(index);
var now;
var pedantic;
var marker;
var queue;
var subvalue;
var length;
var prev;
if (
(character !== C_ASTERISK && character !== C_UNDERSCORE) ||
value.charAt(++index) !== character
) {
return;
}
pedantic = self.options.pedantic;
marker = character;
subvalue = marker + marker;
length = value.length;
index++;
queue = '';
character = '';
if (pedantic && whitespace(value.charAt(index))) {
return;
}
while (index < length) {
prev = character;
character = value.charAt(index);
if (
character === marker &&
value.charAt(index + 1) === marker &&
(!pedantic || !whitespace(prev))
) {
character = value.charAt(index + 2);
if (character !== marker) {
if (!trim(queue)) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
now = eat.now();
now.column += 2;
now.offset += 2;
return eat(subvalue + queue + subvalue)({
type: 'strong',
children: self.tokenizeInline(queue, now)
});
}
}
if (!pedantic && character === '\\') {
queue += character;
character = value.charAt(++index);
}
queue += character;
index++;
}
}
},{"../locate/strong":10,"is-whitespace-character":51,"trim":63}],37:[function(require,module,exports){
'use strict';
var whitespace = require('is-whitespace-character');
module.exports = table;
var C_BACKSLASH = '\\';
var C_TICK = '`';
var C_DASH = '-';
var C_PIPE = '|';
var C_COLON = ':';
var C_SPACE = ' ';
var C_NEWLINE = '\n';
var C_TAB = '\t';
var MIN_TABLE_COLUMNS = 1;
var MIN_TABLE_ROWS = 2;
var TABLE_ALIGN_LEFT = 'left';
var TABLE_ALIGN_CENTER = 'center';
var TABLE_ALIGN_RIGHT = 'right';
var TABLE_ALIGN_NONE = null;
function table(eat, value, silent) {
var self = this;
var index;
var alignments;
var alignment;
var subvalue;
var row;
var length;
var lines;
var queue;
var character;
var hasDash;
var align;
var cell;
var preamble;
var count;
var opening;
var now;
var position;
var lineCount;
var line;
var rows;
var table;
var lineIndex;
var pipeIndex;
var first;
/* Exit when not in gfm-mode. */
if (!self.options.gfm) {
return;
}
/* Get the rows.
* Detecting tables soon is hard, so there are some
* checks for performance here, such as the minimum
* number of rows, and allowed characters in the
* alignment row. */
index = 0;
lineCount = 0;
length = value.length + 1;
lines = [];
while (index < length) {
lineIndex = value.indexOf(C_NEWLINE, index);
pipeIndex = value.indexOf(C_PIPE, index + 1);
if (lineIndex === -1) {
lineIndex = value.length;
}
if (pipeIndex === -1 || pipeIndex > lineIndex) {
if (lineCount < MIN_TABLE_ROWS) {
return;
}
break;
}
lines.push(value.slice(index, lineIndex));
lineCount++;
index = lineIndex + 1;
}
/* Parse the alignment row. */
subvalue = lines.join(C_NEWLINE);
alignments = lines.splice(1, 1)[0] || [];
index = 0;
length = alignments.length;
lineCount--;
alignment = false;
align = [];
while (index < length) {
character = alignments.charAt(index);
if (character === C_PIPE) {
hasDash = null;
if (alignment === false) {
if (first === false) {
return;
}
} else {
align.push(alignment);
alignment = false;
}
first = false;
} else if (character === C_DASH) {
hasDash = true;
alignment = alignment || TABLE_ALIGN_NONE;
} else if (character === C_COLON) {
if (alignment === TABLE_ALIGN_LEFT) {
alignment = TABLE_ALIGN_CENTER;
} else if (hasDash && alignment === TABLE_ALIGN_NONE) {
alignment = TABLE_ALIGN_RIGHT;
} else {
alignment = TABLE_ALIGN_LEFT;
}
} else if (!whitespace(character)) {
return;
}
index++;
}
if (alignment !== false) {
align.push(alignment);
}
/* Exit when without enough columns. */
if (align.length < MIN_TABLE_COLUMNS) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
/* Parse the rows. */
position = -1;
rows = [];
table = eat(subvalue).reset({
type: 'table',
align: align,
children: rows
});
while (++position < lineCount) {
line = lines[position];
row = {type: 'tableRow', children: []};
/* Eat a newline character when this is not the
* first row. */
if (position) {
eat(C_NEWLINE);
}
/* Eat the row. */
eat(line).reset(row, table);
length = line.length + 1;
index = 0;
queue = '';
cell = '';
preamble = true;
count = null;
opening = null;
while (index < length) {
character = line.charAt(index);
if (character === C_TAB || character === C_SPACE) {
if (cell) {
queue += character;
} else {
eat(character);
}
index++;
continue;
}
if (character === '' || character === C_PIPE) {
if (preamble) {
eat(character);
} else {
if (character && opening) {
queue += character;
index++;
continue;
}
if ((cell || character) && !preamble) {
subvalue = cell;
if (queue.length > 1) {
if (character) {
subvalue += queue.slice(0, queue.length - 1);
queue = queue.charAt(queue.length - 1);
} else {
subvalue += queue;
queue = '';
}
}
now = eat.now();
eat(subvalue)({
type: 'tableCell',
children: self.tokenizeInline(cell, now)
}, row);
}
eat(queue + character);
queue = '';
cell = '';
}
} else {
if (queue) {
cell += queue;
queue = '';
}
cell += character;
if (character === C_BACKSLASH && index !== length - 2) {
cell += line.charAt(index + 1);
index++;
}
if (character === C_TICK) {
count = 1;
while (line.charAt(index + 1) === character) {
cell += character;
index++;
count++;
}
if (!opening) {
opening = count;
} else if (count >= opening) {
opening = 0;
}
}
}
preamble = false;
index++;
}
/* Eat the alignment row. */
if (!position) {
eat(C_NEWLINE + alignments);
}
}
return table;
}
},{"is-whitespace-character":51}],38:[function(require,module,exports){
'use strict';
module.exports = text;
function text(eat, value, silent) {
var self = this;
var methods;
var tokenizers;
var index;
var length;
var subvalue;
var position;
var tokenizer;
var name;
var min;
var now;
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
methods = self.inlineMethods;
length = methods.length;
tokenizers = self.inlineTokenizers;
index = -1;
min = value.length;
while (++index < length) {
name = methods[index];
if (name === 'text' || !tokenizers[name]) {
continue;
}
tokenizer = tokenizers[name].locator;
if (!tokenizer) {
eat.file.fail('Missing locator: `' + name + '`');
}
position = tokenizer.call(self, value, 1);
if (position !== -1 && position < min) {
min = position;
}
}
subvalue = value.slice(0, min);
now = eat.now();
self.decode(subvalue, now, function (content, position, source) {
eat(source || content)({
type: 'text',
value: content
});
});
}
},{}],39:[function(require,module,exports){
'use strict';
module.exports = thematicBreak;
var C_NEWLINE = '\n';
var C_TAB = '\t';
var C_SPACE = ' ';
var C_ASTERISK = '*';
var C_UNDERSCORE = '_';
var C_DASH = '-';
var THEMATIC_BREAK_MARKER_COUNT = 3;
function thematicBreak(eat, value, silent) {
var index = -1;
var length = value.length + 1;
var subvalue = '';
var character;
var marker;
var markerCount;
var queue;
while (++index < length) {
character = value.charAt(index);
if (character !== C_TAB && character !== C_SPACE) {
break;
}
subvalue += character;
}
if (
character !== C_ASTERISK &&
character !== C_DASH &&
character !== C_UNDERSCORE
) {
return;
}
marker = character;
subvalue += character;
markerCount = 1;
queue = '';
while (++index < length) {
character = value.charAt(index);
if (character === marker) {
markerCount++;
subvalue += queue + marker;
queue = '';
} else if (character === C_SPACE) {
queue += character;
} else if (
markerCount >= THEMATIC_BREAK_MARKER_COUNT &&
(!character || character === C_NEWLINE)
) {
subvalue += queue;
if (silent) {
return true;
}
return eat(subvalue)({type: 'thematicBreak'});
} else {
return;
}
}
}
},{}],40:[function(require,module,exports){
'use strict';
var decode = require('parse-entities');
var whitespace = require('is-whitespace-character');
var locate = require('../locate/url');
module.exports = url;
url.locator = locate;
url.notInLink = true;
var C_BRACKET_OPEN = '[';
var C_BRACKET_CLOSE = ']';
var C_PAREN_OPEN = '(';
var C_PAREN_CLOSE = ')';
var C_LT = '<';
var C_AT_SIGN = '@';
var HTTP_PROTOCOL = 'http://';
var HTTPS_PROTOCOL = 'https://';
var MAILTO_PROTOCOL = 'mailto:';
var PROTOCOLS = [
HTTP_PROTOCOL,
HTTPS_PROTOCOL,
MAILTO_PROTOCOL
];
var PROTOCOLS_LENGTH = PROTOCOLS.length;
function url(eat, value, silent) {
var self = this;
var subvalue;
var content;
var character;
var index;
var position;
var protocol;
var match;
var length;
var queue;
var parenCount;
var nextCharacter;
var exit;
if (!self.options.gfm) {
return;
}
subvalue = '';
index = -1;
length = PROTOCOLS_LENGTH;
while (++index < length) {
protocol = PROTOCOLS[index];
match = value.slice(0, protocol.length);
if (match.toLowerCase() === protocol) {
subvalue = match;
break;
}
}
if (!subvalue) {
return;
}
index = subvalue.length;
length = value.length;
queue = '';
parenCount = 0;
while (index < length) {
character = value.charAt(index);
if (whitespace(character) || character === C_LT) {
break;
}
if (
character === '.' ||
character === ',' ||
character === ':' ||
character === ';' ||
character === '"' ||
character === '\'' ||
character === ')' ||
character === ']'
) {
nextCharacter = value.charAt(index + 1);
if (!nextCharacter || whitespace(nextCharacter)) {
break;
}
}
if (character === C_PAREN_OPEN || character === C_BRACKET_OPEN) {
parenCount++;
}
if (character === C_PAREN_CLOSE || character === C_BRACKET_CLOSE) {
parenCount--;
if (parenCount < 0) {
break;
}
}
queue += character;
index++;
}
if (!queue) {
return;
}
subvalue += queue;
content = subvalue;
if (protocol === MAILTO_PROTOCOL) {
position = queue.indexOf(C_AT_SIGN);
if (position === -1 || position === length - 1) {
return;
}
content = content.substr(MAILTO_PROTOCOL.length);
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
exit = self.enterLink();
content = self.tokenizeInline(content, eat.now());
exit();
return eat(subvalue)({
type: 'link',
title: null,
url: decode(subvalue),
children: content
});
}
},{"../locate/url":12,"is-whitespace-character":51,"parse-entities":54}],41:[function(require,module,exports){
'use strict';
module.exports = factory;
var MERGEABLE_NODES = {
text: mergeText,
blockquote: mergeBlockquote
};
/* Check whether a node is mergeable with adjacent nodes. */
function mergeable(node) {
var start;
var end;
if (node.type !== 'text' || !node.position) {
return true;
}
start = node.position.start;
end = node.position.end;
/* Only merge nodes which occupy the same size as their
* `value`. */
return start.line !== end.line ||
end.column - start.column === node.value.length;
}
/* Merge two text nodes: `node` into `prev`. */
function mergeText(prev, node) {
prev.value += node.value;
return prev;
}
/* Merge two blockquotes: `node` into `prev`, unless in
* CommonMark mode. */
function mergeBlockquote(prev, node) {
if (this.options.commonmark) {
return node;
}
prev.children = prev.children.concat(node.children);
return prev;
}
/* Construct a tokenizer. This creates both
* `tokenizeInline` and `tokenizeBlock`. */
function factory(type) {
return tokenize;
/* Tokenizer for a bound `type`. */
function tokenize(value, location) {
var self = this;
var offset = self.offset;
var tokens = [];
var methods = self[type + 'Methods'];
var tokenizers = self[type + 'Tokenizers'];
var line = location.line;
var column = location.column;
var index;
var length;
var method;
var name;
var matched;
var valueLength;
/* Trim white space only lines. */
if (!value) {
return tokens;
}
/* Expose on `eat`. */
eat.now = now;
eat.file = self.file;
/* Sync initial offset. */
updatePosition('');
/* Iterate over `value`, and iterate over all
* tokenizers. When one eats something, re-iterate
* with the remaining value. If no tokenizer eats,
* something failed (should not happen) and an
* exception is thrown. */
while (value) {
index = -1;
length = methods.length;
matched = false;
while (++index < length) {
name = methods[index];
method = tokenizers[name];
if (
method &&
/* istanbul ignore next */ (!method.onlyAtStart || self.atStart) &&
(!method.notInList || !self.inList) &&
(!method.notInBlock || !self.inBlock) &&
(!method.notInLink || !self.inLink)
) {
valueLength = value.length;
method.apply(self, [eat, value]);
matched = valueLength !== value.length;
if (matched) {
break;
}
}
}
/* istanbul ignore if */
if (!matched) {
self.file.fail(new Error('Infinite loop'), eat.now());
}
}
self.eof = now();
return tokens;
/* Update line, column, and offset based on
* `value`. */
function updatePosition(subvalue) {
var lastIndex = -1;
var index = subvalue.indexOf('\n');
while (index !== -1) {
line++;
lastIndex = index;
index = subvalue.indexOf('\n', index + 1);
}
if (lastIndex === -1) {
column += subvalue.length;
} else {
column = subvalue.length - lastIndex;
}
if (line in offset) {
if (lastIndex !== -1) {
column += offset[line];
} else if (column <= offset[line]) {
column = offset[line] + 1;
}
}
}
/* Get offset. Called before the first character is
* eaten to retrieve the range's offsets. */
function getOffset() {
var indentation = [];
var pos = line + 1;
/* Done. Called when the last character is
* eaten to retrieve the range’s offsets. */
return function () {
var last = line + 1;
while (pos < last) {
indentation.push((offset[pos] || 0) + 1);
pos++;
}
return indentation;
};
}
/* Get the current position. */
function now() {
var pos = {line: line, column: column};
pos.offset = self.toOffset(pos);
return pos;
}
/* Store position information for a node. */
function Position(start) {
this.start = start;
this.end = now();
}
/* Throw when a value is incorrectly eaten.
* This shouldn’t happen but will throw on new,
* incorrect rules. */
function validateEat(subvalue) {
/* istanbul ignore if */
if (value.substring(0, subvalue.length) !== subvalue) {
/* Capture stack-trace. */
self.file.fail(
new Error(
'Incorrectly eaten value: please report this ' +
'warning on http://git.io/vg5Ft'
),
now()
);
}
}
/* Mark position and patch `node.position`. */
function position() {
var before = now();
return update;
/* Add the position to a node. */
function update(node, indent) {
var prev = node.position;
var start = prev ? prev.start : before;
var combined = [];
var n = prev && prev.end.line;
var l = before.line;
node.position = new Position(start);
/* If there was already a `position`, this
* node was merged. Fixing `start` wasn’t
* hard, but the indent is different.
* Especially because some information, the
* indent between `n` and `l` wasn’t
* tracked. Luckily, that space is
* (should be?) empty, so we can safely
* check for it now. */
if (prev && indent && prev.indent) {
combined = prev.indent;
if (n < l) {
while (++n < l) {
combined.push((offset[n] || 0) + 1);
}
combined.push(before.column);
}
indent = combined.concat(indent);
}
node.position.indent = indent || [];
return node;
}
}
/* Add `node` to `parent`s children or to `tokens`.
* Performs merges where possible. */
function add(node, parent) {
var children = parent ? parent.children : tokens;
var prev = children[children.length - 1];
if (
prev &&
node.type === prev.type &&
node.type in MERGEABLE_NODES &&
mergeable(prev) &&
mergeable(node)
) {
node = MERGEABLE_NODES[node.type].call(self, prev, node);
}
if (node !== prev) {
children.push(node);
}
if (self.atStart && tokens.length !== 0) {
self.exitStart();
}
return node;
}
/* Remove `subvalue` from `value`.
* `subvalue` must be at the start of `value`. */
function eat(subvalue) {
var indent = getOffset();
var pos = position();
var current = now();
validateEat(subvalue);
apply.reset = reset;
reset.test = test;
apply.test = test;
value = value.substring(subvalue.length);
updatePosition(subvalue);
indent = indent();
return apply;
/* Add the given arguments, add `position` to
* the returned node, and return the node. */
function apply(node, parent) {
return pos(add(pos(node), parent), indent);
}
/* Functions just like apply, but resets the
* content: the line and column are reversed,
* and the eaten value is re-added.
* This is useful for nodes with a single
* type of content, such as lists and tables.
* See `apply` above for what parameters are
* expected. */
function reset() {
var node = apply.apply(null, arguments);
line = current.line;
column = current.column;
value = subvalue + value;
return node;
}
/* Test the position, after eating, and reverse
* to a not-eaten state. */
function test() {
var result = pos({});
line = current.line;
column = current.column;
value = subvalue + value;
return result.position;
}
}
}
}
},{}],42:[function(require,module,exports){
'use strict';
module.exports = factory;
/* Factory to de-escape a value, based on a list at `key`
* in `ctx`. */
function factory(ctx, key) {
return unescape;
/* De-escape a string using the expression at `key`
* in `ctx`. */
function unescape(value) {
var prev = 0;
var index = value.indexOf('\\');
var escape = ctx[key];
var queue = [];
var character;
while (index !== -1) {
queue.push(value.slice(prev, index));
prev = index + 1;
character = value.charAt(prev);
/* If the following character is not a valid escape,
* add the slash. */
if (!character || escape.indexOf(character) === -1) {
queue.push('\\');
}
index = value.indexOf('\\', prev);
}
queue.push(value.slice(prev));
return queue.join('');
}
}
},{}],43:[function(require,module,exports){
'use strict';
module.exports = indentation;
/* Map of characters, and their column length,
* which can be used as indentation. */
var characters = {' ': 1, '\t': 4};
/* Gets indentation information for a line. */
function indentation(value) {
var index = 0;
var indent = 0;
var character = value.charAt(index);
var stops = {};
var size;
while (character in characters) {
size = characters[character];
indent += size;
if (size > 1) {
indent = Math.floor(indent / size) * size;
}
stops[indent] = index;
character = value.charAt(++index);
}
return {indent: indent, stops: stops};
}
},{}],44:[function(require,module,exports){
'use strict';
var attributeName = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
var unquoted = '[^"\'=<>`\\u0000-\\u0020]+';
var singleQuoted = '\'[^\']*\'';
var doubleQuoted = '"[^"]*"';
var attributeValue = '(?:' + unquoted + '|' + singleQuoted + '|' + doubleQuoted + ')';
var attribute = '(?:\\s+' + attributeName + '(?:\\s*=\\s*' + attributeValue + ')?)';
var openTag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>';
var closeTag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>';
var comment = '<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->';
var processing = '<[?].*?[?]>';
var declaration = '<![A-Za-z]+\\s+[^>]*>';
var cdata = '<!\\[CDATA\\[[\\s\\S]*?\\]\\]>';
exports.openCloseTag = new RegExp('^(?:' + openTag + '|' + closeTag + ')');
exports.tag = new RegExp('^(?:' +
openTag + '|' +
closeTag + '|' +
comment + '|' +
processing + '|' +
declaration + '|' +
cdata +
')');
},{}],45:[function(require,module,exports){
'use strict';
module.exports = interrupt;
function interrupt(interruptors, tokenizers, ctx, params) {
var bools = ['pedantic', 'commonmark'];
var count = bools.length;
var length = interruptors.length;
var index = -1;
var interruptor;
var config;
var fn;
var offset;
var bool;
var ignore;
while (++index < length) {
interruptor = interruptors[index];
config = interruptor[1] || {};
fn = interruptor[0];
offset = -1;
ignore = false;
while (++offset < count) {
bool = bools[offset];
if (config[bool] !== undefined && config[bool] !== ctx.options[bool]) {
ignore = true;
break;
}
}
if (ignore) {
continue;
}
if (tokenizers[fn].apply(ctx, params)) {
return true;
}
}
return false;
}
},{}],46:[function(require,module,exports){
'use strict';
var collapseWhiteSpace = require('collapse-white-space');
module.exports = normalize;
/* Normalize an identifier. Collapses multiple white space
* characters into a single space, and removes casing. */
function normalize(value) {
return collapseWhiteSpace(value).toLowerCase();
}
},{"collapse-white-space":48}],47:[function(require,module,exports){
'use strict';
var trim = require('trim');
var repeat = require('repeat-string');
var getIndent = require('./get-indentation');
module.exports = indentation;
var C_SPACE = ' ';
var C_NEWLINE = '\n';
var C_TAB = '\t';
/* Remove the minimum indent from every line in `value`.
* Supports both tab, spaced, and mixed indentation (as
* well as possible). */
function indentation(value, maximum) {
var values = value.split(C_NEWLINE);
var position = values.length + 1;
var minIndent = Infinity;
var matrix = [];
var index;
var indentation;
var stops;
var padding;
values.unshift(repeat(C_SPACE, maximum) + '!');
while (position--) {
indentation = getIndent(values[position]);
matrix[position] = indentation.stops;
if (trim(values[position]).length === 0) {
continue;
}
if (indentation.indent) {
if (indentation.indent > 0 && indentation.indent < minIndent) {
minIndent = indentation.indent;
}
} else {
minIndent = Infinity;
break;
}
}
if (minIndent !== Infinity) {
position = values.length;
while (position--) {
stops = matrix[position];
index = minIndent;
while (index && !(index in stops)) {
index--;
}
if (
trim(values[position]).length !== 0 &&
minIndent &&
index !== minIndent
) {
padding = C_TAB;
} else {
padding = '';
}
values[position] = padding + values[position].slice(
index in stops ? stops[index] + 1 : 0
);
}
}
values.shift();
return values.join(C_NEWLINE);
}
},{"./get-indentation":43,"repeat-string":60,"trim":63}],48:[function(require,module,exports){
'use strict';
module.exports = collapse;
/* collapse(' \t\nbar \nbaz\t'); // ' bar baz ' */
function collapse(value) {
return String(value).replace(/\s+/g, ' ');
}
},{}],49:[function(require,module,exports){
'use strict';
module.exports = alphabetical;
/* Check if the given character code, or the character
* code at the first character, is alphabetical. */
function alphabetical(character) {
var code = typeof character === 'string' ?
character.charCodeAt(0) : character;
return (code >= 97 && code <= 122) || /* a-z */
(code >= 65 && code <= 90); /* A-Z */
}
},{}],50:[function(require,module,exports){
'use strict';
module.exports = decimal;
/* Check if the given character code, or the character
* code at the first character, is decimal. */
function decimal(character) {
var code = typeof character === 'string' ?
character.charCodeAt(0) : character;
return code >= 48 && code <= 57; /* 0-9 */
}
},{}],51:[function(require,module,exports){
'use strict';
module.exports = whitespace;
var fromCode = String.fromCharCode;
var re = /\s/;
/* Check if the given character code, or the character
* code at the first character, is a whitespace character. */
function whitespace(character) {
return re.test(
typeof character === 'number' ? fromCode(character) : character.charAt(0)
);
}
},{}],52:[function(require,module,exports){
'use strict';
module.exports = wordCharacter;
var fromCode = String.fromCharCode;
var re = /\w/;
/* Check if the given character code, or the character
* code at the first character, is a word character. */
function wordCharacter(character) {
return re.test(
typeof character === 'number' ? fromCode(character) : character.charAt(0)
);
}
},{}],53:[function(require,module,exports){
'use strict';
module.exports = escapes;
var defaults = [
'\\',
'`',
'*',
'{',
'}',
'[',
']',
'(',
')',
'#',
'+',
'-',
'.',
'!',
'_',
'>'
];
var gfm = defaults.concat(['~', '|']);
var commonmark = gfm.concat([
'\n',
'"',
'$',
'%',
'&',
'\'',
',',
'/',
':',
';',
'<',
'=',
'?',
'@',
'^'
]);
escapes.default = defaults;
escapes.gfm = gfm;
escapes.commonmark = commonmark;
/* Get markdown escapes. */
function escapes(options) {
var settings = options || {};
if (settings.commonmark) {
return commonmark;
}
return settings.gfm ? gfm : defaults;
}
},{}],54:[function(require,module,exports){
'use strict';
/* Dependencies. */
var characterEntities = require('character-entities');
var legacy = require('character-entities-legacy');
var invalid = require('character-reference-invalid');
var decimal = require('is-decimal');
var hexadecimal = require('is-hexadecimal');
var alphanumerical = require('is-alphanumerical');
/* Expose. */
module.exports = wrapper;
/* Methods. */
var own = {}.hasOwnProperty;
var fromCharCode = String.fromCharCode;
var noop = Function.prototype;
/* Characters. */
var REPLACEMENT = '\uFFFD';
var FORM_FEED = '\f';
var AMPERSAND = '&';
var OCTOTHORP = '#';
var SEMICOLON = ';';
var NEWLINE = '\n';
var X_LOWER = 'x';
var X_UPPER = 'X';
var SPACE = ' ';
var LESS_THAN = '<';
var EQUAL = '=';
var EMPTY = '';
var TAB = '\t';
/* Default settings. */
var defaults = {
warning: null,
reference: null,
text: null,
warningContext: null,
referenceContext: null,
textContext: null,
position: {},
additional: null,
attribute: false,
nonTerminated: true
};
/* Reference types. */
var NAMED = 'named';
var HEXADECIMAL = 'hexadecimal';
var DECIMAL = 'decimal';
/* Map of bases. */
var BASE = {};
BASE[HEXADECIMAL] = 16;
BASE[DECIMAL] = 10;
/* Map of types to tests. Each type of character reference
* accepts different characters. This test is used to
* detect whether a reference has ended (as the semicolon
* is not strictly needed). */
var TESTS = {};
TESTS[NAMED] = alphanumerical;
TESTS[DECIMAL] = decimal;
TESTS[HEXADECIMAL] = hexadecimal;
/* Warning messages. */
var NAMED_NOT_TERMINATED = 1;
var NUMERIC_NOT_TERMINATED = 2;
var NAMED_EMPTY = 3;
var NUMERIC_EMPTY = 4;
var NAMED_UNKNOWN = 5;
var NUMERIC_DISALLOWED = 6;
var NUMERIC_PROHIBITED = 7;
var NUMERIC_REFERENCE = 'Numeric character references';
var NAMED_REFERENCE = 'Named character references';
var TERMINATED = ' must be terminated by a semicolon';
var VOID = ' cannot be empty';
var MESSAGES = {};
MESSAGES[NAMED_NOT_TERMINATED] = NAMED_REFERENCE + TERMINATED;
MESSAGES[NUMERIC_NOT_TERMINATED] = NUMERIC_REFERENCE + TERMINATED;
MESSAGES[NAMED_EMPTY] = NAMED_REFERENCE + VOID;
MESSAGES[NUMERIC_EMPTY] = NUMERIC_REFERENCE + VOID;
MESSAGES[NAMED_UNKNOWN] = NAMED_REFERENCE + ' must be known';
MESSAGES[NUMERIC_DISALLOWED] = NUMERIC_REFERENCE + ' cannot be disallowed';
MESSAGES[NUMERIC_PROHIBITED] = NUMERIC_REFERENCE + ' cannot be outside the ' +
'permissible Unicode range';
/* Wrap to ensure clean parameters are given to `parse`. */
function wrapper(value, options) {
var settings = {};
var option;
var key;
if (!options) {
options = {};
}
for (key in defaults) {
option = options[key];
settings[key] = option === null || option === undefined ? defaults[key] : option;
}
if (settings.position.indent || settings.position.start) {
settings.indent = settings.position.indent || [];
settings.position = settings.position.start;
}
return parse(value, settings);
}
/* Parse entities. */
function parse(value, settings) {
var additional = settings.additional;
var nonTerminated = settings.nonTerminated;
var handleText = settings.text;
var handleReference = settings.reference;
var handleWarning = settings.warning;
var textContext = settings.textContext;
var referenceContext = settings.referenceContext;
var warningContext = settings.warningContext;
var pos = settings.position;
var indent = settings.indent || [];
var length = value.length;
var index = 0;
var lines = -1;
var column = pos.column || 1;
var line = pos.line || 1;
var queue = EMPTY;
var result = [];
var entityCharacters;
var terminated;
var characters;
var character;
var reference;
var following;
var warning;
var reason;
var output;
var entity;
var begin;
var start;
var type;
var test;
var prev;
var next;
var diff;
var end;
/* Cache the current point. */
prev = now();
/* Wrap `handleWarning`. */
warning = handleWarning ? parseError : noop;
/* Ensure the algorithm walks over the first character
* and the end (inclusive). */
index--;
length++;
while (++index < length) {
/* If the previous character was a newline. */
if (character === NEWLINE) {
column = indent[lines] || 1;
}
character = at(index);
/* Handle anything other than an ampersand,
* including newlines and EOF. */
if (character !== AMPERSAND) {
if (character === NEWLINE) {
line++;
lines++;
column = 0;
}
if (character) {
queue += character;
column++;
} else {
flush();
}
} else {
following = at(index + 1);
/* The behaviour depends on the identity of the next
* character. */
if (
following === TAB ||
following === NEWLINE ||
following === FORM_FEED ||
following === SPACE ||
following === LESS_THAN ||
following === AMPERSAND ||
following === EMPTY ||
(additional && following === additional)
) {
/* Not a character reference. No characters
* are consumed, and nothing is returned.
* This is not an error, either. */
queue += character;
column++;
continue;
}
start = index + 1;
begin = start;
end = start;
/* Numerical entity. */
if (following !== OCTOTHORP) {
type = NAMED;
} else {
end = ++begin;
/* The behaviour further depends on the
* character after the U+0023 NUMBER SIGN. */
following = at(end);
if (following === X_LOWER || following === X_UPPER) {
/* ASCII hex digits. */
type = HEXADECIMAL;
end = ++begin;
} else {
/* ASCII digits. */
type = DECIMAL;
}
}
entityCharacters = EMPTY;
entity = EMPTY;
characters = EMPTY;
test = TESTS[type];
end--;
while (++end < length) {
following = at(end);
if (!test(following)) {
break;
}
characters += following;
/* Check if we can match a legacy named
* reference. If so, we cache that as the
* last viable named reference. This
* ensures we do not need to walk backwards
* later. */
if (type === NAMED && own.call(legacy, characters)) {
entityCharacters = characters;
entity = legacy[characters];
}
}
terminated = at(end) === SEMICOLON;
if (terminated) {
end++;
if (type === NAMED && own.call(characterEntities, characters)) {
entityCharacters = characters;
entity = characterEntities[characters];
}
}
diff = 1 + end - start;
if (!terminated && !nonTerminated) {
/* Empty. */
} else if (!characters) {
/* An empty (possible) entity is valid, unless
* its numeric (thus an ampersand followed by
* an octothorp). */
if (type !== NAMED) {
warning(NUMERIC_EMPTY, diff);
}
} else if (type === NAMED) {
/* An ampersand followed by anything
* unknown, and not terminated, is invalid. */
if (terminated && !entity) {
warning(NAMED_UNKNOWN, 1);
} else {
/* If theres something after an entity
* name which is not known, cap the
* reference. */
if (entityCharacters !== characters) {
end = begin + entityCharacters.length;
diff = 1 + end - begin;
terminated = false;
}
/* If the reference is not terminated,
* warn. */
if (!terminated) {
reason = entityCharacters ?
NAMED_NOT_TERMINATED :
NAMED_EMPTY;
if (!settings.attribute) {
warning(reason, diff);
} else {
following = at(end);
if (following === EQUAL) {
warning(reason, diff);
entity = null;
} else if (alphanumerical(following)) {
entity = null;
} else {
warning(reason, diff);
}
}
}
}
reference = entity;
} else {
if (!terminated) {
/* All non-terminated numeric entities are
* not rendered, and trigger a warning. */
warning(NUMERIC_NOT_TERMINATED, diff);
}
/* When terminated and number, parse as
* either hexadecimal or decimal. */
reference = parseInt(characters, BASE[type]);
/* Trigger a warning when the parsed number
* is prohibited, and replace with
* replacement character. */
if (isProhibited(reference)) {
warning(NUMERIC_PROHIBITED, diff);
reference = REPLACEMENT;
} else if (reference in invalid) {
/* Trigger a warning when the parsed number
* is disallowed, and replace by an
* alternative. */
warning(NUMERIC_DISALLOWED, diff);
reference = invalid[reference];
} else {
/* Parse the number. */
output = EMPTY;
/* Trigger a warning when the parsed
* number should not be used. */
if (isWarning(reference)) {
warning(NUMERIC_DISALLOWED, diff);
}
/* Stringify the number. */
if (reference > 0xFFFF) {
reference -= 0x10000;
output += fromCharCode((reference >>> (10 & 0x3FF)) | 0xD800);
reference = 0xDC00 | (reference & 0x3FF);
}
reference = output + fromCharCode(reference);
}
}
/* If we could not find a reference, queue the
* checked characters (as normal characters),
* and move the pointer to their end. This is
* possible because we can be certain neither
* newlines nor ampersands are included. */
if (!reference) {
characters = value.slice(start - 1, end);
queue += characters;
column += characters.length;
index = end - 1;
} else {
/* Found it! First eat the queued
* characters as normal text, then eat
* an entity. */
flush();
prev = now();
index = end - 1;
column += end - start + 1;
result.push(reference);
next = now();
next.offset++;
if (handleReference) {
handleReference.call(referenceContext, reference, {
start: prev,
end: next
}, value.slice(start - 1, end));
}
prev = next;
}
}
}
/* Return the reduced nodes, and any possible warnings. */
return result.join(EMPTY);
/* Get current position. */
function now() {
return {
line: line,
column: column,
offset: index + (pos.offset || 0)
};
}
/* “Throw” a parse-error: a warning. */
function parseError(code, offset) {
var position = now();
position.column += offset;
position.offset += offset;
handleWarning.call(warningContext, MESSAGES[code], position, code);
}
/* Get character at position. */
function at(position) {
return value.charAt(position);
}
/* Flush `queue` (normal text). Macro invoked before
* each entity and at the end of `value`.
* Does nothing when `queue` is empty. */
function flush() {
if (queue) {
result.push(queue);
if (handleText) {
handleText.call(textContext, queue, {
start: prev,
end: now()
});
}
queue = EMPTY;
}
}
}
/* Check if `character` is outside the permissible
* unicode range. */
function isProhibited(code) {
return (code >= 0xD800 && code <= 0xDFFF) || (code > 0x10FFFF);
}
/* Check if `character` is disallowed. */
function isWarning(code) {
if (
(code >= 0x0001 && code <= 0x0008) ||
code === 0x000B ||
(code >= 0x000D && code <= 0x001F) ||
(code >= 0x007F && code <= 0x009F) ||
(code >= 0xFDD0 && code <= 0xFDEF) ||
(code & 0xFFFF) === 0xFFFF ||
(code & 0xFFFF) === 0xFFFE
) {
return true;
}
return false;
}
},{"character-entities":56,"character-entities-legacy":55,"character-reference-invalid":57,"is-alphanumerical":58,"is-decimal":50,"is-hexadecimal":59}],55:[function(require,module,exports){
module.exports={
"AElig": "Æ",
"AMP": "&",
"Aacute": "Á",
"Acirc": "Â",
"Agrave": "À",
"Aring": "Å",
"Atilde": "Ã",
"Auml": "Ä",
"COPY": "©",
"Ccedil": "Ç",
"ETH": "Ð",
"Eacute": "É",
"Ecirc": "Ê",
"Egrave": "È",
"Euml": "Ë",
"GT": ">",
"Iacute": "Í",
"Icirc": "Î",
"Igrave": "Ì",
"Iuml": "Ï",
"LT": "<",
"Ntilde": "Ñ",
"Oacute": "Ó",
"Ocirc": "Ô",
"Ograve": "Ò",
"Oslash": "Ø",
"Otilde": "Õ",
"Ouml": "Ö",
"QUOT": "\"",
"REG": "®",
"THORN": "Þ",
"Uacute": "Ú",
"Ucirc": "Û",
"Ugrave": "Ù",
"Uuml": "Ü",
"Yacute": "Ý",
"aacute": "á",
"acirc": "â",
"acute": "´",
"aelig": "æ",
"agrave": "à",
"amp": "&",
"aring": "å",
"atilde": "ã",
"auml": "ä",
"brvbar": "¦",
"ccedil": "ç",
"cedil": "¸",
"cent": "¢",
"copy": "©",
"curren": "¤",
"deg": "°",
"divide": "÷",
"eacute": "é",
"ecirc": "ê",
"egrave": "è",
"eth": "ð",
"euml": "ë",
"frac12": "½",
"frac14": "¼",
"frac34": "¾",
"gt": ">",
"iacute": "í",
"icirc": "î",
"iexcl": "¡",
"igrave": "ì",
"iquest": "¿",
"iuml": "ï",
"laquo": "«",
"lt": "<",
"macr": "¯",
"micro": "µ",
"middot": "·",
"nbsp": " ",
"not": "¬",
"ntilde": "ñ",
"oacute": "ó",
"ocirc": "ô",
"ograve": "ò",
"ordf": "ª",
"ordm": "º",
"oslash": "ø",
"otilde": "õ",
"ouml": "ö",
"para": "¶",
"plusmn": "±",
"pound": "£",
"quot": "\"",
"raquo": "»",
"reg": "®",
"sect": "§",
"shy": "­",
"sup1": "¹",
"sup2": "²",
"sup3": "³",
"szlig": "ß",
"thorn": "þ",
"times": "×",
"uacute": "ú",
"ucirc": "û",
"ugrave": "ù",
"uml": "¨",
"uuml": "ü",
"yacute": "ý",
"yen": "¥",
"yuml": "ÿ"
}
},{}],56:[function(require,module,exports){
module.exports={
"AEli": "Æ",
"AElig": "Æ",
"AM": "&",
"AMP": "&",
"Aacut": "Á",
"Aacute": "Á",
"Abreve": "Ă",
"Acir": "Â",
"Acirc": "Â",
"Acy": "А",
"Afr": "𝔄",
"Agrav": "À",
"Agrave": "À",
"Alpha": "Α",
"Amacr": "Ā",
"And": "⩓",
"Aogon": "Ą",
"Aopf": "𝔸",
"ApplyFunction": "⁡",
"Arin": "Å",
"Aring": "Å",
"Ascr": "𝒜",
"Assign": "≔",
"Atild": "Ã",
"Atilde": "Ã",
"Aum": "Ä",
"Auml": "Ä",
"Backslash": "∖",
"Barv": "⫧",
"Barwed": "⌆",
"Bcy": "Б",
"Because": "∵",
"Bernoullis": "ℬ",
"Beta": "Β",
"Bfr": "𝔅",
"Bopf": "𝔹",
"Breve": "˘",
"Bscr": "ℬ",
"Bumpeq": "≎",
"CHcy": "Ч",
"COP": "©",
"COPY": "©",
"Cacute": "Ć",
"Cap": "⋒",
"CapitalDifferentialD": "ⅅ",
"Cayleys": "ℭ",
"Ccaron": "Č",
"Ccedi": "Ç",
"Ccedil": "Ç",
"Ccirc": "Ĉ",
"Cconint": "∰",
"Cdot": "Ċ",
"Cedilla": "¸",
"CenterDot": "·",
"Cfr": "ℭ",
"Chi": "Χ",
"CircleDot": "⊙",
"CircleMinus": "⊖",
"CirclePlus": "⊕",
"CircleTimes": "⊗",
"ClockwiseContourIntegral": "∲",
"CloseCurlyDoubleQuote": "”",
"CloseCurlyQuote": "’",
"Colon": "∷",
"Colone": "⩴",
"Congruent": "≡",
"Conint": "∯",
"ContourIntegral": "∮",
"Copf": "ℂ",
"Coproduct": "∐",
"CounterClockwiseContourIntegral": "∳",
"Cross": "⨯",
"Cscr": "𝒞",
"Cup": "⋓",
"CupCap": "≍",
"DD": "ⅅ",
"DDotrahd": "⤑",
"DJcy": "Ђ",
"DScy": "Ѕ",
"DZcy": "Џ",
"Dagger": "‡",
"Darr": "↡",
"Dashv": "⫤",
"Dcaron": "Ď",
"Dcy": "Д",
"Del": "∇",
"Delta": "Δ",
"Dfr": "𝔇",
"DiacriticalAcute": "´",
"DiacriticalDot": "˙",
"DiacriticalDoubleAcute": "˝",
"DiacriticalGrave": "`",
"DiacriticalTilde": "˜",
"Diamond": "⋄",
"DifferentialD": "ⅆ",
"Dopf": "𝔻",
"Dot": "¨",
"DotDot": "⃜",
"DotEqual": "≐",
"DoubleContourIntegral": "∯",
"DoubleDot": "¨",
"DoubleDownArrow": "⇓",
"DoubleLeftArrow": "⇐",
"DoubleLeftRightArrow": "⇔",
"DoubleLeftTee": "⫤",
"DoubleLongLeftArrow": "⟸",
"DoubleLongLeftRightArrow": "⟺",
"DoubleLongRightArrow": "⟹",
"DoubleRightArrow": "⇒",
"DoubleRightTee": "⊨",
"DoubleUpArrow": "⇑",
"DoubleUpDownArrow": "⇕",
"DoubleVerticalBar": "∥",
"DownArrow": "↓",
"DownArrowBar": "⤓",
"DownArrowUpArrow": "⇵",
"DownBreve": "̑",
"DownLeftRightVector": "⥐",
"DownLeftTeeVector": "⥞",
"DownLeftVector": "↽",
"DownLeftVectorBar": "⥖",
"DownRightTeeVector": "⥟",
"DownRightVector": "⇁",
"DownRightVectorBar": "⥗",
"DownTee": "⊤",
"DownTeeArrow": "↧",
"Downarrow": "⇓",
"Dscr": "𝒟",
"Dstrok": "Đ",
"ENG": "Ŋ",
"ET": "Ð",
"ETH": "Ð",
"Eacut": "É",
"Eacute": "É",
"Ecaron": "Ě",
"Ecir": "Ê",
"Ecirc": "Ê",
"Ecy": "Э",
"Edot": "Ė",
"Efr": "𝔈",
"Egrav": "È",
"Egrave": "È",
"Element": "∈",
"Emacr": "Ē",
"EmptySmallSquare": "◻",
"EmptyVerySmallSquare": "▫",
"Eogon": "Ę",
"Eopf": "𝔼",
"Epsilon": "Ε",
"Equal": "⩵",
"EqualTilde": "≂",
"Equilibrium": "⇌",
"Escr": "ℰ",
"Esim": "⩳",
"Eta": "Η",
"Eum": "Ë",
"Euml": "Ë",
"Exists": "∃",
"ExponentialE": "ⅇ",
"Fcy": "Ф",
"Ffr": "𝔉",
"FilledSmallSquare": "◼",
"FilledVerySmallSquare": "▪",
"Fopf": "𝔽",
"ForAll": "∀",
"Fouriertrf": "ℱ",
"Fscr": "ℱ",
"GJcy": "Ѓ",
"G": ">",
"GT": ">",
"Gamma": "Γ",
"Gammad": "Ϝ",
"Gbreve": "Ğ",
"Gcedil": "Ģ",
"Gcirc": "Ĝ",
"Gcy": "Г",
"Gdot": "Ġ",
"Gfr": "𝔊",
"Gg": "⋙",
"Gopf": "𝔾",
"GreaterEqual": "≥",
"GreaterEqualLess": "⋛",
"GreaterFullEqual": "≧",
"GreaterGreater": "⪢",
"GreaterLess": "≷",
"GreaterSlantEqual": "⩾",
"GreaterTilde": "≳",
"Gscr": "𝒢",
"Gt": "≫",
"HARDcy": "Ъ",
"Hacek": "ˇ",
"Hat": "^",
"Hcirc": "Ĥ",
"Hfr": "ℌ",
"HilbertSpace": "ℋ",
"Hopf": "ℍ",
"HorizontalLine": "─",
"Hscr": "ℋ",
"Hstrok": "Ħ",
"HumpDownHump": "≎",
"HumpEqual": "≏",
"IEcy": "Е",
"IJlig": "IJ",
"IOcy": "Ё",
"Iacut": "Í",
"Iacute": "Í",
"Icir": "Î",
"Icirc": "Î",
"Icy": "И",
"Idot": "İ",
"Ifr": "ℑ",
"Igrav": "Ì",
"Igrave": "Ì",
"Im": "ℑ",
"Imacr": "Ī",
"ImaginaryI": "ⅈ",
"Implies": "⇒",
"Int": "∬",
"Integral": "∫",
"Intersection": "⋂",
"InvisibleComma": "⁣",
"InvisibleTimes": "⁢",
"Iogon": "Į",
"Iopf": "𝕀",
"Iota": "Ι",
"Iscr": "ℐ",
"Itilde": "Ĩ",
"Iukcy": "І",
"Ium": "Ï",
"Iuml": "Ï",
"Jcirc": "Ĵ",
"Jcy": "Й",
"Jfr": "𝔍",
"Jopf": "𝕁",
"Jscr": "𝒥",
"Jsercy": "Ј",
"Jukcy": "Є",
"KHcy": "Х",
"KJcy": "Ќ",
"Kappa": "Κ",
"Kcedil": "Ķ",
"Kcy": "К",
"Kfr": "𝔎",
"Kopf": "𝕂",
"Kscr": "𝒦",
"LJcy": "Љ",
"L": "<",
"LT": "<",
"Lacute": "Ĺ",
"Lambda": "Λ",
"Lang": "⟪",
"Laplacetrf": "ℒ",
"Larr": "↞",
"Lcaron": "Ľ",
"Lcedil": "Ļ",
"Lcy": "Л",
"LeftAngleBracket": "⟨",
"LeftArrow": "←",
"LeftArrowBar": "⇤",
"LeftArrowRightArrow": "⇆",
"LeftCeiling": "⌈",
"LeftDoubleBracket": "⟦",
"LeftDownTeeVector": "⥡",
"LeftDownVector": "⇃",
"LeftDownVectorBar": "⥙",
"LeftFloor": "⌊",
"LeftRightArrow": "↔",
"LeftRightVector": "⥎",
"LeftTee": "⊣",
"LeftTeeArrow": "↤",
"LeftTeeVector": "⥚",
"LeftTriangle": "⊲",
"LeftTriangleBar": "⧏",
"LeftTriangleEqual": "⊴",
"LeftUpDownVector": "⥑",
"LeftUpTeeVector": "⥠",
"LeftUpVector": "↿",
"LeftUpVectorBar": "⥘",
"LeftVector": "↼",
"LeftVectorBar": "⥒",
"Leftarrow": "⇐",
"Leftrightarrow": "⇔",
"LessEqualGreater": "⋚",
"LessFullEqual": "≦",
"LessGreater": "≶",
"LessLess": "⪡",
"LessSlantEqual": "⩽",
"LessTilde": "≲",
"Lfr": "𝔏",
"Ll": "⋘",
"Lleftarrow": "⇚",
"Lmidot": "Ŀ",
"LongLeftArrow": "⟵",
"LongLeftRightArrow": "⟷",
"LongRightArrow": "⟶",
"Longleftarrow": "⟸",
"Longleftrightarrow": "⟺",
"Longrightarrow": "⟹",
"Lopf": "𝕃",
"LowerLeftArrow": "↙",
"LowerRightArrow": "↘",
"Lscr": "ℒ",
"Lsh": "↰",
"Lstrok": "Ł",
"Lt": "≪",
"Map": "⤅",
"Mcy": "М",
"MediumSpace": " ",
"Mellintrf": "ℳ",
"Mfr": "𝔐",
"MinusPlus": "∓",
"Mopf": "𝕄",
"Mscr": "ℳ",
"Mu": "Μ",
"NJcy": "Њ",
"Nacute": "Ń",
"Ncaron": "Ň",
"Ncedil": "Ņ",
"Ncy": "Н",
"NegativeMediumSpace": "​",
"NegativeThickSpace": "​",
"NegativeThinSpace": "​",
"NegativeVeryThinSpace": "​",
"NestedGreaterGreater": "≫",
"NestedLessLess": "≪",
"NewLine": "\n",
"Nfr": "𝔑",
"NoBreak": "⁠",
"NonBreakingSpace": " ",
"Nopf": "ℕ",
"Not": "⫬",
"NotCongruent": "≢",
"NotCupCap": "≭",
"NotDoubleVerticalBar": "∦",
"NotElement": "∉",
"NotEqual": "≠",
"NotEqualTilde": "≂̸",
"NotExists": "∄",
"NotGreater": "≯",
"NotGreaterEqual": "≱",
"NotGreaterFullEqual": "≧̸",
"NotGreaterGreater": "≫̸",
"NotGreaterLess": "≹",
"NotGreaterSlantEqual": "⩾̸",
"NotGreaterTilde": "≵",
"NotHumpDownHump": "≎̸",
"NotHumpEqual": "≏̸",
"NotLeftTriangle": "⋪",
"NotLeftTriangleBar": "⧏̸",
"NotLeftTriangleEqual": "⋬",
"NotLess": "≮",
"NotLessEqual": "≰",
"NotLessGreater": "≸",
"NotLessLess": "≪̸",
"NotLessSlantEqual": "⩽̸",
"NotLessTilde": "≴",
"NotNestedGreaterGreater": "⪢̸",
"NotNestedLessLess": "⪡̸",
"NotPrecedes": "⊀",
"NotPrecedesEqual": "⪯̸",
"NotPrecedesSlantEqual": "⋠",
"NotReverseElement": "∌",
"NotRightTriangle": "⋫",
"NotRightTriangleBar": "⧐̸",
"NotRightTriangleEqual": "⋭",
"NotSquareSubset": "⊏̸",
"NotSquareSubsetEqual": "⋢",
"NotSquareSuperset": "⊐̸",
"NotSquareSupersetEqual": "⋣",
"NotSubset": "⊂⃒",
"NotSubsetEqual": "⊈",
"NotSucceeds": "⊁",
"NotSucceedsEqual": "⪰̸",
"NotSucceedsSlantEqual": "⋡",
"NotSucceedsTilde": "≿̸",
"NotSuperset": "⊃⃒",
"NotSupersetEqual": "⊉",
"NotTilde": "≁",
"NotTildeEqual": "≄",
"NotTildeFullEqual": "≇",
"NotTildeTilde": "≉",
"NotVerticalBar": "∤",
"Nscr": "𝒩",
"Ntild": "Ñ",
"Ntilde": "Ñ",
"Nu": "Ν",
"OElig": "Œ",
"Oacut": "Ó",
"Oacute": "Ó",
"Ocir": "Ô",
"Ocirc": "Ô",
"Ocy": "О",
"Odblac": "Ő",
"Ofr": "𝔒",
"Ograv": "Ò",
"Ograve": "Ò",
"Omacr": "Ō",
"Omega": "Ω",
"Omicron": "Ο",
"Oopf": "𝕆",
"OpenCurlyDoubleQuote": "“",
"OpenCurlyQuote": "‘",
"Or": "⩔",
"Oscr": "𝒪",
"Oslas": "Ø",
"Oslash": "Ø",
"Otild": "Õ",
"Otilde": "Õ",
"Otimes": "⨷",
"Oum": "Ö",
"Ouml": "Ö",
"OverBar": "‾",
"OverBrace": "⏞",
"OverBracket": "⎴",
"OverParenthesis": "⏜",
"PartialD": "∂",
"Pcy": "П",
"Pfr": "𝔓",
"Phi": "Φ",
"Pi": "Π",
"PlusMinus": "±",
"Poincareplane": "ℌ",
"Popf": "ℙ",
"Pr": "⪻",
"Precedes": "≺",
"PrecedesEqual": "⪯",
"PrecedesSlantEqual": "≼",
"PrecedesTilde": "≾",
"Prime": "″",
"Product": "∏",
"Proportion": "∷",
"Proportional": "∝",
"Pscr": "𝒫",
"Psi": "Ψ",
"QUO": "\"",
"QUOT": "\"",
"Qfr": "𝔔",
"Qopf": "ℚ",
"Qscr": "𝒬",
"RBarr": "⤐",
"RE": "®",
"REG": "®",
"Racute": "Ŕ",
"Rang": "⟫",
"Rarr": "↠",
"Rarrtl": "⤖",
"Rcaron": "Ř",
"Rcedil": "Ŗ",
"Rcy": "Р",
"Re": "ℜ",
"ReverseElement": "∋",
"ReverseEquilibrium": "⇋",
"ReverseUpEquilibrium": "⥯",
"Rfr": "ℜ",
"Rho": "Ρ",
"RightAngleBracket": "⟩",
"RightArrow": "→",
"RightArrowBar": "⇥",
"RightArrowLeftArrow": "⇄",
"RightCeiling": "⌉",
"RightDoubleBracket": "⟧",
"RightDownTeeVector": "⥝",
"RightDownVector": "⇂",
"RightDownVectorBar": "⥕",
"RightFloor": "⌋",
"RightTee": "⊢",
"RightTeeArrow": "↦",
"RightTeeVector": "⥛",
"RightTriangle": "⊳",
"RightTriangleBar": "⧐",
"RightTriangleEqual": "⊵",
"RightUpDownVector": "⥏",
"RightUpTeeVector": "⥜",
"RightUpVector": "↾",
"RightUpVectorBar": "⥔",
"RightVector": "⇀",
"RightVectorBar": "⥓",
"Rightarrow": "⇒",
"Ropf": "ℝ",
"RoundImplies": "⥰",
"Rrightarrow": "⇛",
"Rscr": "ℛ",
"Rsh": "↱",
"RuleDelayed": "⧴",
"SHCHcy": "Щ",
"SHcy": "Ш",
"SOFTcy": "Ь",
"Sacute": "Ś",
"Sc": "⪼",
"Scaron": "Š",
"Scedil": "Ş",
"Scirc": "Ŝ",
"Scy": "С",
"Sfr": "𝔖",
"ShortDownArrow": "↓",
"ShortLeftArrow": "←",
"ShortRightArrow": "→",
"ShortUpArrow": "↑",
"Sigma": "Σ",
"SmallCircle": "∘",
"Sopf": "𝕊",
"Sqrt": "√",
"Square": "□",
"SquareIntersection": "⊓",
"SquareSubset": "⊏",
"SquareSubsetEqual": "⊑",
"SquareSuperset": "⊐",
"SquareSupersetEqual": "⊒",
"SquareUnion": "⊔",
"Sscr": "𝒮",
"Star": "⋆",
"Sub": "⋐",
"Subset": "⋐",
"SubsetEqual": "⊆",
"Succeeds": "≻",
"SucceedsEqual": "⪰",
"SucceedsSlantEqual": "≽",
"SucceedsTilde": "≿",
"SuchThat": "∋",
"Sum": "∑",
"Sup": "⋑",
"Superset": "⊃",
"SupersetEqual": "⊇",
"Supset": "⋑",
"THOR": "Þ",
"THORN": "Þ",
"TRADE": "™",
"TSHcy": "Ћ",
"TScy": "Ц",
"Tab": "\t",
"Tau": "Τ",
"Tcaron": "Ť",
"Tcedil": "Ţ",
"Tcy": "Т",
"Tfr": "𝔗",
"Therefore": "∴",
"Theta": "Θ",
"ThickSpace": "  ",
"ThinSpace": " ",
"Tilde": "∼",
"TildeEqual": "≃",
"TildeFullEqual": "≅",
"TildeTilde": "≈",
"Topf": "𝕋",
"TripleDot": "⃛",
"Tscr": "𝒯",
"Tstrok": "Ŧ",
"Uacut": "Ú",
"Uacute": "Ú",
"Uarr": "↟",
"Uarrocir": "⥉",
"Ubrcy": "Ў",
"Ubreve": "Ŭ",
"Ucir": "Û",
"Ucirc": "Û",
"Ucy": "У",
"Udblac": "Ű",
"Ufr": "𝔘",
"Ugrav": "Ù",
"Ugrave": "Ù",
"Umacr": "Ū",
"UnderBar": "_",
"UnderBrace": "⏟",
"UnderBracket": "⎵",
"UnderParenthesis": "⏝",
"Union": "⋃",
"UnionPlus": "⊎",
"Uogon": "Ų",
"Uopf": "𝕌",
"UpArrow": "↑",
"UpArrowBar": "⤒",
"UpArrowDownArrow": "⇅",
"UpDownArrow": "↕",
"UpEquilibrium": "⥮",
"UpTee": "⊥",
"UpTeeArrow": "↥",
"Uparrow": "⇑",
"Updownarrow": "⇕",
"UpperLeftArrow": "↖",
"UpperRightArrow": "↗",
"Upsi": "ϒ",
"Upsilon": "Υ",
"Uring": "Ů",
"Uscr": "𝒰",
"Utilde": "Ũ",
"Uum": "Ü",
"Uuml": "Ü",
"VDash": "⊫",
"Vbar": "⫫",
"Vcy": "В",
"Vdash": "⊩",
"Vdashl": "⫦",
"Vee": "⋁",
"Verbar": "‖",
"Vert": "‖",
"VerticalBar": "∣",
"VerticalLine": "|",
"VerticalSeparator": "❘",
"VerticalTilde": "≀",
"VeryThinSpace": " ",
"Vfr": "𝔙",
"Vopf": "𝕍",
"Vscr": "𝒱",
"Vvdash": "⊪",
"Wcirc": "Ŵ",
"Wedge": "⋀",
"Wfr": "𝔚",
"Wopf": "𝕎",
"Wscr": "𝒲",
"Xfr": "𝔛",
"Xi": "Ξ",
"Xopf": "𝕏",
"Xscr": "𝒳",
"YAcy": "Я",
"YIcy": "Ї",
"YUcy": "Ю",
"Yacut": "Ý",
"Yacute": "Ý",
"Ycirc": "Ŷ",
"Ycy": "Ы",
"Yfr": "𝔜",
"Yopf": "𝕐",
"Yscr": "𝒴",
"Yuml": "Ÿ",
"ZHcy": "Ж",
"Zacute": "Ź",
"Zcaron": "Ž",
"Zcy": "З",
"Zdot": "Ż",
"ZeroWidthSpace": "​",
"Zeta": "Ζ",
"Zfr": "ℨ",
"Zopf": "ℤ",
"Zscr": "𝒵",
"aacut": "á",
"aacute": "á",
"abreve": "ă",
"ac": "∾",
"acE": "∾̳",
"acd": "∿",
"acir": "â",
"acirc": "â",
"acut": "´",
"acute": "´",
"acy": "а",
"aeli": "æ",
"aelig": "æ",
"af": "⁡",
"afr": "𝔞",
"agrav": "à",
"agrave": "à",
"alefsym": "ℵ",
"aleph": "ℵ",
"alpha": "α",
"amacr": "ā",
"amalg": "⨿",
"am": "&",
"amp": "&",
"and": "∧",
"andand": "⩕",
"andd": "⩜",
"andslope": "⩘",
"andv": "⩚",
"ang": "∠",
"ange": "⦤",
"angle": "∠",
"angmsd": "∡",
"angmsdaa": "⦨",
"angmsdab": "⦩",
"angmsdac": "⦪",
"angmsdad": "⦫",
"angmsdae": "⦬",
"angmsdaf": "⦭",
"angmsdag": "⦮",
"angmsdah": "⦯",
"angrt": "∟",
"angrtvb": "⊾",
"angrtvbd": "⦝",
"angsph": "∢",
"angst": "Å",
"angzarr": "⍼",
"aogon": "ą",
"aopf": "𝕒",
"ap": "≈",
"apE": "⩰",
"apacir": "⩯",
"ape": "≊",
"apid": "≋",
"apos": "'",
"approx": "≈",
"approxeq": "≊",
"arin": "å",
"aring": "å",
"ascr": "𝒶",
"ast": "*",
"asymp": "≈",
"asympeq": "≍",
"atild": "ã",
"atilde": "ã",
"aum": "ä",
"auml": "ä",
"awconint": "∳",
"awint": "⨑",
"bNot": "⫭",
"backcong": "≌",
"backepsilon": "϶",
"backprime": "‵",
"backsim": "∽",
"backsimeq": "⋍",
"barvee": "⊽",
"barwed": "⌅",
"barwedge": "⌅",
"bbrk": "⎵",
"bbrktbrk": "⎶",
"bcong": "≌",
"bcy": "б",
"bdquo": "„",
"becaus": "∵",
"because": "∵",
"bemptyv": "⦰",
"bepsi": "϶",
"bernou": "ℬ",
"beta": "β",
"beth": "ℶ",
"between": "≬",
"bfr": "𝔟",
"bigcap": "⋂",
"bigcirc": "◯",
"bigcup": "⋃",
"bigodot": "⨀",
"bigoplus": "⨁",
"bigotimes": "⨂",
"bigsqcup": "⨆",
"bigstar": "★",
"bigtriangledown": "▽",
"bigtriangleup": "△",
"biguplus": "⨄",
"bigvee": "⋁",
"bigwedge": "⋀",
"bkarow": "⤍",
"blacklozenge": "⧫",
"blacksquare": "▪",
"blacktriangle": "▴",
"blacktriangledown": "▾",
"blacktriangleleft": "◂",
"blacktriangleright": "▸",
"blank": "␣",
"blk12": "▒",
"blk14": "░",
"blk34": "▓",
"block": "█",
"bne": "=⃥",
"bnequiv": "≡⃥",
"bnot": "⌐",
"bopf": "𝕓",
"bot": "⊥",
"bottom": "⊥",
"bowtie": "⋈",
"boxDL": "╗",
"boxDR": "╔",
"boxDl": "╖",
"boxDr": "╓",
"boxH": "═",
"boxHD": "╦",
"boxHU": "╩",
"boxHd": "╤",
"boxHu": "╧",
"boxUL": "╝",
"boxUR": "╚",
"boxUl": "╜",
"boxUr": "╙",
"boxV": "║",
"boxVH": "╬",
"boxVL": "╣",
"boxVR": "╠",
"boxVh": "╫",
"boxVl": "╢",
"boxVr": "╟",
"boxbox": "⧉",
"boxdL": "╕",
"boxdR": "╒",
"boxdl": "┐",
"boxdr": "┌",
"boxh": "─",
"boxhD": "╥",
"boxhU": "╨",
"boxhd": "┬",
"boxhu": "┴",
"boxminus": "⊟",
"boxplus": "⊞",
"boxtimes": "⊠",
"boxuL": "╛",
"boxuR": "╘",
"boxul": "┘",
"boxur": "└",
"boxv": "│",
"boxvH": "╪",
"boxvL": "╡",
"boxvR": "╞",
"boxvh": "┼",
"boxvl": "┤",
"boxvr": "├",
"bprime": "‵",
"breve": "˘",
"brvba": "¦",
"brvbar": "¦",
"bscr": "𝒷",
"bsemi": "⁏",
"bsim": "∽",
"bsime": "⋍",
"bsol": "\\",
"bsolb": "⧅",
"bsolhsub": "⟈",
"bull": "•",
"bullet": "•",
"bump": "≎",
"bumpE": "⪮",
"bumpe": "≏",
"bumpeq": "≏",
"cacute": "ć",
"cap": "∩",
"capand": "⩄",
"capbrcup": "⩉",
"capcap": "⩋",
"capcup": "⩇",
"capdot": "⩀",
"caps": "∩︀",
"caret": "⁁",
"caron": "ˇ",
"ccaps": "⩍",
"ccaron": "č",
"ccedi": "ç",
"ccedil": "ç",
"ccirc": "ĉ",
"ccups": "⩌",
"ccupssm": "⩐",
"cdot": "ċ",
"cedi": "¸",
"cedil": "¸",
"cemptyv": "⦲",
"cen": "¢",
"cent": "¢",
"centerdot": "·",
"cfr": "𝔠",
"chcy": "ч",
"check": "✓",
"checkmark": "✓",
"chi": "χ",
"cir": "○",
"cirE": "⧃",
"circ": "ˆ",
"circeq": "≗",
"circlearrowleft": "↺",
"circlearrowright": "↻",
"circledR": "®",
"circledS": "Ⓢ",
"circledast": "⊛",
"circledcirc": "⊚",
"circleddash": "⊝",
"cire": "≗",
"cirfnint": "⨐",
"cirmid": "⫯",
"cirscir": "⧂",
"clubs": "♣",
"clubsuit": "♣",
"colon": ":",
"colone": "≔",
"coloneq": "≔",
"comma": ",",
"commat": "@",
"comp": "∁",
"compfn": "∘",
"complement": "∁",
"complexes": "ℂ",
"cong": "≅",
"congdot": "⩭",
"conint": "∮",
"copf": "𝕔",
"coprod": "∐",
"cop": "©",
"copy": "©",
"copysr": "℗",
"crarr": "↵",
"cross": "✗",
"cscr": "𝒸",
"csub": "⫏",
"csube": "⫑",
"csup": "⫐",
"csupe": "⫒",
"ctdot": "⋯",
"cudarrl": "⤸",
"cudarrr": "⤵",
"cuepr": "⋞",
"cuesc": "⋟",
"cularr": "↶",
"cularrp": "⤽",
"cup": "∪",
"cupbrcap": "⩈",
"cupcap": "⩆",
"cupcup": "⩊",
"cupdot": "⊍",
"cupor": "⩅",
"cups": "∪︀",
"curarr": "↷",
"curarrm": "⤼",
"curlyeqprec": "⋞",
"curlyeqsucc": "⋟",
"curlyvee": "⋎",
"curlywedge": "⋏",
"curre": "¤",
"curren": "¤",
"curvearrowleft": "↶",
"curvearrowright": "↷",
"cuvee": "⋎",
"cuwed": "⋏",
"cwconint": "∲",
"cwint": "∱",
"cylcty": "⌭",
"dArr": "⇓",
"dHar": "⥥",
"dagger": "†",
"daleth": "ℸ",
"darr": "↓",
"dash": "‐",
"dashv": "⊣",
"dbkarow": "⤏",
"dblac": "˝",
"dcaron": "ď",
"dcy": "д",
"dd": "ⅆ",
"ddagger": "‡",
"ddarr": "⇊",
"ddotseq": "⩷",
"de": "°",
"deg": "°",
"delta": "δ",
"demptyv": "⦱",
"dfisht": "⥿",
"dfr": "𝔡",
"dharl": "⇃",
"dharr": "⇂",
"diam": "⋄",
"diamond": "⋄",
"diamondsuit": "♦",
"diams": "♦",
"die": "¨",
"digamma": "ϝ",
"disin": "⋲",
"div": "÷",
"divid": "÷",
"divide": "÷",
"divideontimes": "⋇",
"divonx": "⋇",
"djcy": "ђ",
"dlcorn": "⌞",
"dlcrop": "⌍",
"dollar": "$",
"dopf": "𝕕",
"dot": "˙",
"doteq": "≐",
"doteqdot": "≑",
"dotminus": "∸",
"dotplus": "∔",
"dotsquare": "⊡",
"doublebarwedge": "⌆",
"downarrow": "↓",
"downdownarrows": "⇊",
"downharpoonleft": "⇃",
"downharpoonright": "⇂",
"drbkarow": "⤐",
"drcorn": "⌟",
"drcrop": "⌌",
"dscr": "𝒹",
"dscy": "ѕ",
"dsol": "⧶",
"dstrok": "đ",
"dtdot": "⋱",
"dtri": "▿",
"dtrif": "▾",
"duarr": "⇵",
"duhar": "⥯",
"dwangle": "⦦",
"dzcy": "џ",
"dzigrarr": "⟿",
"eDDot": "⩷",
"eDot": "≑",
"eacut": "é",
"eacute": "é",
"easter": "⩮",
"ecaron": "ě",
"ecir": "ê",
"ecirc": "ê",
"ecolon": "≕",
"ecy": "э",
"edot": "ė",
"ee": "ⅇ",
"efDot": "≒",
"efr": "𝔢",
"eg": "⪚",
"egrav": "è",
"egrave": "è",
"egs": "⪖",
"egsdot": "⪘",
"el": "⪙",
"elinters": "⏧",
"ell": "ℓ",
"els": "⪕",
"elsdot": "⪗",
"emacr": "ē",
"empty": "∅",
"emptyset": "∅",
"emptyv": "∅",
"emsp13": " ",
"emsp14": " ",
"emsp": " ",
"eng": "ŋ",
"ensp": " ",
"eogon": "ę",
"eopf": "𝕖",
"epar": "⋕",
"eparsl": "⧣",
"eplus": "⩱",
"epsi": "ε",
"epsilon": "ε",
"epsiv": "ϵ",
"eqcirc": "≖",
"eqcolon": "≕",
"eqsim": "≂",
"eqslantgtr": "⪖",
"eqslantless": "⪕",
"equals": "=",
"equest": "≟",
"equiv": "≡",
"equivDD": "⩸",
"eqvparsl": "⧥",
"erDot": "≓",
"erarr": "⥱",
"escr": "ℯ",
"esdot": "≐",
"esim": "≂",
"eta": "η",
"et": "ð",
"eth": "ð",
"eum": "ë",
"euml": "ë",
"euro": "€",
"excl": "!",
"exist": "∃",
"expectation": "ℰ",
"exponentiale": "ⅇ",
"fallingdotseq": "≒",
"fcy": "ф",
"female": "♀",
"ffilig": "ffi",
"fflig": "ff",
"ffllig": "ffl",
"ffr": "𝔣",
"filig": "fi",
"fjlig": "fj",
"flat": "♭",
"fllig": "fl",
"fltns": "▱",
"fnof": "ƒ",
"fopf": "𝕗",
"forall": "∀",
"fork": "⋔",
"forkv": "⫙",
"fpartint": "⨍",
"frac1": "¼",
"frac12": "½",
"frac13": "⅓",
"frac14": "¼",
"frac15": "⅕",
"frac16": "⅙",
"frac18": "⅛",
"frac23": "⅔",
"frac25": "⅖",
"frac3": "¾",
"frac34": "¾",
"frac35": "⅗",
"frac38": "⅜",
"frac45": "⅘",
"frac56": "⅚",
"frac58": "⅝",
"frac78": "⅞",
"frasl": "⁄",
"frown": "⌢",
"fscr": "𝒻",
"gE": "≧",
"gEl": "⪌",
"gacute": "ǵ",
"gamma": "γ",
"gammad": "ϝ",
"gap": "⪆",
"gbreve": "ğ",
"gcirc": "ĝ",
"gcy": "г",
"gdot": "ġ",
"ge": "≥",
"gel": "⋛",
"geq": "≥",
"geqq": "≧",
"geqslant": "⩾",
"ges": "⩾",
"gescc": "⪩",
"gesdot": "⪀",
"gesdoto": "⪂",
"gesdotol": "⪄",
"gesl": "⋛︀",
"gesles": "⪔",
"gfr": "𝔤",
"gg": "≫",
"ggg": "⋙",
"gimel": "ℷ",
"gjcy": "ѓ",
"gl": "≷",
"glE": "⪒",
"gla": "⪥",
"glj": "⪤",
"gnE": "≩",
"gnap": "⪊",
"gnapprox": "⪊",
"gne": "⪈",
"gneq": "⪈",
"gneqq": "≩",
"gnsim": "⋧",
"gopf": "𝕘",
"grave": "`",
"gscr": "ℊ",
"gsim": "≳",
"gsime": "⪎",
"gsiml": "⪐",
"g": ">",
"gt": ">",
"gtcc": "⪧",
"gtcir": "⩺",
"gtdot": "⋗",
"gtlPar": "⦕",
"gtquest": "⩼",
"gtrapprox": "⪆",
"gtrarr": "⥸",
"gtrdot": "⋗",
"gtreqless": "⋛",
"gtreqqless": "⪌",
"gtrless": "≷",
"gtrsim": "≳",
"gvertneqq": "≩︀",
"gvnE": "≩︀",
"hArr": "⇔",
"hairsp": " ",
"half": "½",
"hamilt": "ℋ",
"hardcy": "ъ",
"harr": "↔",
"harrcir": "⥈",
"harrw": "↭",
"hbar": "ℏ",
"hcirc": "ĥ",
"hearts": "♥",
"heartsuit": "♥",
"hellip": "…",
"hercon": "⊹",
"hfr": "𝔥",
"hksearow": "⤥",
"hkswarow": "⤦",
"hoarr": "⇿",
"homtht": "∻",
"hookleftarrow": "↩",
"hookrightarrow": "↪",
"hopf": "𝕙",
"horbar": "―",
"hscr": "𝒽",
"hslash": "ℏ",
"hstrok": "ħ",
"hybull": "⁃",
"hyphen": "‐",
"iacut": "í",
"iacute": "í",
"ic": "⁣",
"icir": "î",
"icirc": "î",
"icy": "и",
"iecy": "е",
"iexc": "¡",
"iexcl": "¡",
"iff": "⇔",
"ifr": "𝔦",
"igrav": "ì",
"igrave": "ì",
"ii": "ⅈ",
"iiiint": "⨌",
"iiint": "∭",
"iinfin": "⧜",
"iiota": "℩",
"ijlig": "ij",
"imacr": "ī",
"image": "ℑ",
"imagline": "ℐ",
"imagpart": "ℑ",
"imath": "ı",
"imof": "⊷",
"imped": "Ƶ",
"in": "∈",
"incare": "℅",
"infin": "∞",
"infintie": "⧝",
"inodot": "ı",
"int": "∫",
"intcal": "⊺",
"integers": "ℤ",
"intercal": "⊺",
"intlarhk": "⨗",
"intprod": "⨼",
"iocy": "ё",
"iogon": "į",
"iopf": "𝕚",
"iota": "ι",
"iprod": "⨼",
"iques": "¿",
"iquest": "¿",
"iscr": "𝒾",
"isin": "∈",
"isinE": "⋹",
"isindot": "⋵",
"isins": "⋴",
"isinsv": "⋳",
"isinv": "∈",
"it": "⁢",
"itilde": "ĩ",
"iukcy": "і",
"ium": "ï",
"iuml": "ï",
"jcirc": "ĵ",
"jcy": "й",
"jfr": "𝔧",
"jmath": "ȷ",
"jopf": "𝕛",
"jscr": "𝒿",
"jsercy": "ј",
"jukcy": "є",
"kappa": "κ",
"kappav": "ϰ",
"kcedil": "ķ",
"kcy": "к",
"kfr": "𝔨",
"kgreen": "ĸ",
"khcy": "х",
"kjcy": "ќ",
"kopf": "𝕜",
"kscr": "𝓀",
"lAarr": "⇚",
"lArr": "⇐",
"lAtail": "⤛",
"lBarr": "⤎",
"lE": "≦",
"lEg": "⪋",
"lHar": "⥢",
"lacute": "ĺ",
"laemptyv": "⦴",
"lagran": "ℒ",
"lambda": "λ",
"lang": "⟨",
"langd": "⦑",
"langle": "⟨",
"lap": "⪅",
"laqu": "«",
"laquo": "«",
"larr": "←",
"larrb": "⇤",
"larrbfs": "⤟",
"larrfs": "⤝",
"larrhk": "↩",
"larrlp": "↫",
"larrpl": "⤹",
"larrsim": "⥳",
"larrtl": "↢",
"lat": "⪫",
"latail": "⤙",
"late": "⪭",
"lates": "⪭︀",
"lbarr": "⤌",
"lbbrk": "❲",
"lbrace": "{",
"lbrack": "[",
"lbrke": "⦋",
"lbrksld": "⦏",
"lbrkslu": "⦍",
"lcaron": "ľ",
"lcedil": "ļ",
"lceil": "⌈",
"lcub": "{",
"lcy": "л",
"ldca": "⤶",
"ldquo": "“",
"ldquor": "„",
"ldrdhar": "⥧",
"ldrushar": "⥋",
"ldsh": "↲",
"le": "≤",
"leftarrow": "←",
"leftarrowtail": "↢",
"leftharpoondown": "↽",
"leftharpoonup": "↼",
"leftleftarrows": "⇇",
"leftrightarrow": "↔",
"leftrightarrows": "⇆",
"leftrightharpoons": "⇋",
"leftrightsquigarrow": "↭",
"leftthreetimes": "⋋",
"leg": "⋚",
"leq": "≤",
"leqq": "≦",
"leqslant": "⩽",
"les": "⩽",
"lescc": "⪨",
"lesdot": "⩿",
"lesdoto": "⪁",
"lesdotor": "⪃",
"lesg": "⋚︀",
"lesges": "⪓",
"lessapprox": "⪅",
"lessdot": "⋖",
"lesseqgtr": "⋚",
"lesseqqgtr": "⪋",
"lessgtr": "≶",
"lesssim": "≲",
"lfisht": "⥼",
"lfloor": "⌊",
"lfr": "𝔩",
"lg": "≶",
"lgE": "⪑",
"lhard": "↽",
"lharu": "↼",
"lharul": "⥪",
"lhblk": "▄",
"ljcy": "љ",
"ll": "≪",
"llarr": "⇇",
"llcorner": "⌞",
"llhard": "⥫",
"lltri": "◺",
"lmidot": "ŀ",
"lmoust": "⎰",
"lmoustache": "⎰",
"lnE": "≨",
"lnap": "⪉",
"lnapprox": "⪉",
"lne": "⪇",
"lneq": "⪇",
"lneqq": "≨",
"lnsim": "⋦",
"loang": "⟬",
"loarr": "⇽",
"lobrk": "⟦",
"longleftarrow": "⟵",
"longleftrightarrow": "⟷",
"longmapsto": "⟼",
"longrightarrow": "⟶",
"looparrowleft": "↫",
"looparrowright": "↬",
"lopar": "⦅",
"lopf": "𝕝",
"loplus": "⨭",
"lotimes": "⨴",
"lowast": "∗",
"lowbar": "_",
"loz": "◊",
"lozenge": "◊",
"lozf": "⧫",
"lpar": "(",
"lparlt": "⦓",
"lrarr": "⇆",
"lrcorner": "⌟",
"lrhar": "⇋",
"lrhard": "⥭",
"lrm": "‎",
"lrtri": "⊿",
"lsaquo": "‹",
"lscr": "𝓁",
"lsh": "↰",
"lsim": "≲",
"lsime": "⪍",
"lsimg": "⪏",
"lsqb": "[",
"lsquo": "‘",
"lsquor": "‚",
"lstrok": "ł",
"l": "<",
"lt": "<",
"ltcc": "⪦",
"ltcir": "⩹",
"ltdot": "⋖",
"lthree": "⋋",
"ltimes": "⋉",
"ltlarr": "⥶",
"ltquest": "⩻",
"ltrPar": "⦖",
"ltri": "◃",
"ltrie": "⊴",
"ltrif": "◂",
"lurdshar": "⥊",
"luruhar": "⥦",
"lvertneqq": "≨︀",
"lvnE": "≨︀",
"mDDot": "∺",
"mac": "¯",
"macr": "¯",
"male": "♂",
"malt": "✠",
"maltese": "✠",
"map": "↦",
"mapsto": "↦",
"mapstodown": "↧",
"mapstoleft": "↤",
"mapstoup": "↥",
"marker": "▮",
"mcomma": "⨩",
"mcy": "м",
"mdash": "—",
"measuredangle": "∡",
"mfr": "𝔪",
"mho": "℧",
"micr": "µ",
"micro": "µ",
"mid": "∣",
"midast": "*",
"midcir": "⫰",
"middo": "·",
"middot": "·",
"minus": "−",
"minusb": "⊟",
"minusd": "∸",
"minusdu": "⨪",
"mlcp": "⫛",
"mldr": "…",
"mnplus": "∓",
"models": "⊧",
"mopf": "𝕞",
"mp": "∓",
"mscr": "𝓂",
"mstpos": "∾",
"mu": "μ",
"multimap": "⊸",
"mumap": "⊸",
"nGg": "⋙̸",
"nGt": "≫⃒",
"nGtv": "≫̸",
"nLeftarrow": "⇍",
"nLeftrightarrow": "⇎",
"nLl": "⋘̸",
"nLt": "≪⃒",
"nLtv": "≪̸",
"nRightarrow": "⇏",
"nVDash": "⊯",
"nVdash": "⊮",
"nabla": "∇",
"nacute": "ń",
"nang": "∠⃒",
"nap": "≉",
"napE": "⩰̸",
"napid": "≋̸",
"napos": "ʼn",
"napprox": "≉",
"natur": "♮",
"natural": "♮",
"naturals": "ℕ",
"nbs": " ",
"nbsp": " ",
"nbump": "≎̸",
"nbumpe": "≏̸",
"ncap": "⩃",
"ncaron": "ň",
"ncedil": "ņ",
"ncong": "≇",
"ncongdot": "⩭̸",
"ncup": "⩂",
"ncy": "н",
"ndash": "–",
"ne": "≠",
"neArr": "⇗",
"nearhk": "⤤",
"nearr": "↗",
"nearrow": "↗",
"nedot": "≐̸",
"nequiv": "≢",
"nesear": "⤨",
"nesim": "≂̸",
"nexist": "∄",
"nexists": "∄",
"nfr": "𝔫",
"ngE": "≧̸",
"nge": "≱",
"ngeq": "≱",
"ngeqq": "≧̸",
"ngeqslant": "⩾̸",
"nges": "⩾̸",
"ngsim": "≵",
"ngt": "≯",
"ngtr": "≯",
"nhArr": "⇎",
"nharr": "↮",
"nhpar": "⫲",
"ni": "∋",
"nis": "⋼",
"nisd": "⋺",
"niv": "∋",
"njcy": "њ",
"nlArr": "⇍",
"nlE": "≦̸",
"nlarr": "↚",
"nldr": "‥",
"nle": "≰",
"nleftarrow": "↚",
"nleftrightarrow": "↮",
"nleq": "≰",
"nleqq": "≦̸",
"nleqslant": "⩽̸",
"nles": "⩽̸",
"nless": "≮",
"nlsim": "≴",
"nlt": "≮",
"nltri": "⋪",
"nltrie": "⋬",
"nmid": "∤",
"nopf": "𝕟",
"no": "¬",
"not": "¬",
"notin": "∉",
"notinE": "⋹̸",
"notindot": "⋵̸",
"notinva": "∉",
"notinvb": "⋷",
"notinvc": "⋶",
"notni": "∌",
"notniva": "∌",
"notnivb": "⋾",
"notnivc": "⋽",
"npar": "∦",
"nparallel": "∦",
"nparsl": "⫽⃥",
"npart": "∂̸",
"npolint": "⨔",
"npr": "⊀",
"nprcue": "⋠",
"npre": "⪯̸",
"nprec": "⊀",
"npreceq": "⪯̸",
"nrArr": "⇏",
"nrarr": "↛",
"nrarrc": "⤳̸",
"nrarrw": "↝̸",
"nrightarrow": "↛",
"nrtri": "⋫",
"nrtrie": "⋭",
"nsc": "⊁",
"nsccue": "⋡",
"nsce": "⪰̸",
"nscr": "𝓃",
"nshortmid": "∤",
"nshortparallel": "∦",
"nsim": "≁",
"nsime": "≄",
"nsimeq": "≄",
"nsmid": "∤",
"nspar": "∦",
"nsqsube": "⋢",
"nsqsupe": "⋣",
"nsub": "⊄",
"nsubE": "⫅̸",
"nsube": "⊈",
"nsubset": "⊂⃒",
"nsubseteq": "⊈",
"nsubseteqq": "⫅̸",
"nsucc": "⊁",
"nsucceq": "⪰̸",
"nsup": "⊅",
"nsupE": "⫆̸",
"nsupe": "⊉",
"nsupset": "⊃⃒",
"nsupseteq": "⊉",
"nsupseteqq": "⫆̸",
"ntgl": "≹",
"ntild": "ñ",
"ntilde": "ñ",
"ntlg": "≸",
"ntriangleleft": "⋪",
"ntrianglelefteq": "⋬",
"ntriangleright": "⋫",
"ntrianglerighteq": "⋭",
"nu": "ν",
"num": "#",
"numero": "№",
"numsp": " ",
"nvDash": "⊭",
"nvHarr": "⤄",
"nvap": "≍⃒",
"nvdash": "⊬",
"nvge": "≥⃒",
"nvgt": ">⃒",
"nvinfin": "⧞",
"nvlArr": "⤂",
"nvle": "≤⃒",
"nvlt": "<⃒",
"nvltrie": "⊴⃒",
"nvrArr": "⤃",
"nvrtrie": "⊵⃒",
"nvsim": "∼⃒",
"nwArr": "⇖",
"nwarhk": "⤣",
"nwarr": "↖",
"nwarrow": "↖",
"nwnear": "⤧",
"oS": "Ⓢ",
"oacut": "ó",
"oacute": "ó",
"oast": "⊛",
"ocir": "ô",
"ocirc": "ô",
"ocy": "о",
"odash": "⊝",
"odblac": "ő",
"odiv": "⨸",
"odot": "⊙",
"odsold": "⦼",
"oelig": "œ",
"ofcir": "⦿",
"ofr": "𝔬",
"ogon": "˛",
"ograv": "ò",
"ograve": "ò",
"ogt": "⧁",
"ohbar": "⦵",
"ohm": "Ω",
"oint": "∮",
"olarr": "↺",
"olcir": "⦾",
"olcross": "⦻",
"oline": "‾",
"olt": "⧀",
"omacr": "ō",
"omega": "ω",
"omicron": "ο",
"omid": "⦶",
"ominus": "⊖",
"oopf": "𝕠",
"opar": "⦷",
"operp": "⦹",
"oplus": "⊕",
"or": "∨",
"orarr": "↻",
"ord": "º",
"order": "ℴ",
"orderof": "ℴ",
"ordf": "ª",
"ordm": "º",
"origof": "⊶",
"oror": "⩖",
"orslope": "⩗",
"orv": "⩛",
"oscr": "ℴ",
"oslas": "ø",
"oslash": "ø",
"osol": "⊘",
"otild": "õ",
"otilde": "õ",
"otimes": "⊗",
"otimesas": "⨶",
"oum": "ö",
"ouml": "ö",
"ovbar": "⌽",
"par": "¶",
"para": "¶",
"parallel": "∥",
"parsim": "⫳",
"parsl": "⫽",
"part": "∂",
"pcy": "п",
"percnt": "%",
"period": ".",
"permil": "‰",
"perp": "⊥",
"pertenk": "‱",
"pfr": "𝔭",
"phi": "φ",
"phiv": "ϕ",
"phmmat": "ℳ",
"phone": "☎",
"pi": "π",
"pitchfork": "⋔",
"piv": "ϖ",
"planck": "ℏ",
"planckh": "ℎ",
"plankv": "ℏ",
"plus": "+",
"plusacir": "⨣",
"plusb": "⊞",
"pluscir": "⨢",
"plusdo": "∔",
"plusdu": "⨥",
"pluse": "⩲",
"plusm": "±",
"plusmn": "±",
"plussim": "⨦",
"plustwo": "⨧",
"pm": "±",
"pointint": "⨕",
"popf": "𝕡",
"poun": "£",
"pound": "£",
"pr": "≺",
"prE": "⪳",
"prap": "⪷",
"prcue": "≼",
"pre": "⪯",
"prec": "≺",
"precapprox": "⪷",
"preccurlyeq": "≼",
"preceq": "⪯",
"precnapprox": "⪹",
"precneqq": "⪵",
"precnsim": "⋨",
"precsim": "≾",
"prime": "′",
"primes": "ℙ",
"prnE": "⪵",
"prnap": "⪹",
"prnsim": "⋨",
"prod": "∏",
"profalar": "⌮",
"profline": "⌒",
"profsurf": "⌓",
"prop": "∝",
"propto": "∝",
"prsim": "≾",
"prurel": "⊰",
"pscr": "𝓅",
"psi": "ψ",
"puncsp": " ",
"qfr": "𝔮",
"qint": "⨌",
"qopf": "𝕢",
"qprime": "⁗",
"qscr": "𝓆",
"quaternions": "ℍ",
"quatint": "⨖",
"quest": "?",
"questeq": "≟",
"quo": "\"",
"quot": "\"",
"rAarr": "⇛",
"rArr": "⇒",
"rAtail": "⤜",
"rBarr": "⤏",
"rHar": "⥤",
"race": "∽̱",
"racute": "ŕ",
"radic": "√",
"raemptyv": "⦳",
"rang": "⟩",
"rangd": "⦒",
"range": "⦥",
"rangle": "⟩",
"raqu": "»",
"raquo": "»",
"rarr": "→",
"rarrap": "⥵",
"rarrb": "⇥",
"rarrbfs": "⤠",
"rarrc": "⤳",
"rarrfs": "⤞",
"rarrhk": "↪",
"rarrlp": "↬",
"rarrpl": "⥅",
"rarrsim": "⥴",
"rarrtl": "↣",
"rarrw": "↝",
"ratail": "⤚",
"ratio": "∶",
"rationals": "ℚ",
"rbarr": "⤍",
"rbbrk": "❳",
"rbrace": "}",
"rbrack": "]",
"rbrke": "⦌",
"rbrksld": "⦎",
"rbrkslu": "⦐",
"rcaron": "ř",
"rcedil": "ŗ",
"rceil": "⌉",
"rcub": "}",
"rcy": "р",
"rdca": "⤷",
"rdldhar": "⥩",
"rdquo": "”",
"rdquor": "”",
"rdsh": "↳",
"real": "ℜ",
"realine": "ℛ",
"realpart": "ℜ",
"reals": "ℝ",
"rect": "▭",
"re": "®",
"reg": "®",
"rfisht": "⥽",
"rfloor": "⌋",
"rfr": "𝔯",
"rhard": "⇁",
"rharu": "⇀",
"rharul": "⥬",
"rho": "ρ",
"rhov": "ϱ",
"rightarrow": "→",
"rightarrowtail": "↣",
"rightharpoondown": "⇁",
"rightharpoonup": "⇀",
"rightleftarrows": "⇄",
"rightleftharpoons": "⇌",
"rightrightarrows": "⇉",
"rightsquigarrow": "↝",
"rightthreetimes": "⋌",
"ring": "˚",
"risingdotseq": "≓",
"rlarr": "⇄",
"rlhar": "⇌",
"rlm": "‏",
"rmoust": "⎱",
"rmoustache": "⎱",
"rnmid": "⫮",
"roang": "⟭",
"roarr": "⇾",
"robrk": "⟧",
"ropar": "⦆",
"ropf": "𝕣",
"roplus": "⨮",
"rotimes": "⨵",
"rpar": ")",
"rpargt": "⦔",
"rppolint": "⨒",
"rrarr": "⇉",
"rsaquo": "›",
"rscr": "𝓇",
"rsh": "↱",
"rsqb": "]",
"rsquo": "’",
"rsquor": "’",
"rthree": "⋌",
"rtimes": "⋊",
"rtri": "▹",
"rtrie": "⊵",
"rtrif": "▸",
"rtriltri": "⧎",
"ruluhar": "⥨",
"rx": "℞",
"sacute": "ś",
"sbquo": "‚",
"sc": "≻",
"scE": "⪴",
"scap": "⪸",
"scaron": "š",
"sccue": "≽",
"sce": "⪰",
"scedil": "ş",
"scirc": "ŝ",
"scnE": "⪶",
"scnap": "⪺",
"scnsim": "⋩",
"scpolint": "⨓",
"scsim": "≿",
"scy": "с",
"sdot": "⋅",
"sdotb": "⊡",
"sdote": "⩦",
"seArr": "⇘",
"searhk": "⤥",
"searr": "↘",
"searrow": "↘",
"sec": "§",
"sect": "§",
"semi": ";",
"seswar": "⤩",
"setminus": "∖",
"setmn": "∖",
"sext": "✶",
"sfr": "𝔰",
"sfrown": "⌢",
"sharp": "♯",
"shchcy": "щ",
"shcy": "ш",
"shortmid": "∣",
"shortparallel": "∥",
"sh": "­",
"shy": "­",
"sigma": "σ",
"sigmaf": "ς",
"sigmav": "ς",
"sim": "∼",
"simdot": "⩪",
"sime": "≃",
"simeq": "≃",
"simg": "⪞",
"simgE": "⪠",
"siml": "⪝",
"simlE": "⪟",
"simne": "≆",
"simplus": "⨤",
"simrarr": "⥲",
"slarr": "←",
"smallsetminus": "∖",
"smashp": "⨳",
"smeparsl": "⧤",
"smid": "∣",
"smile": "⌣",
"smt": "⪪",
"smte": "⪬",
"smtes": "⪬︀",
"softcy": "ь",
"sol": "/",
"solb": "⧄",
"solbar": "⌿",
"sopf": "𝕤",
"spades": "♠",
"spadesuit": "♠",
"spar": "∥",
"sqcap": "⊓",
"sqcaps": "⊓︀",
"sqcup": "⊔",
"sqcups": "⊔︀",
"sqsub": "⊏",
"sqsube": "⊑",
"sqsubset": "⊏",
"sqsubseteq": "⊑",
"sqsup": "⊐",
"sqsupe": "⊒",
"sqsupset": "⊐",
"sqsupseteq": "⊒",
"squ": "□",
"square": "□",
"squarf": "▪",
"squf": "▪",
"srarr": "→",
"sscr": "𝓈",
"ssetmn": "∖",
"ssmile": "⌣",
"sstarf": "⋆",
"star": "☆",
"starf": "★",
"straightepsilon": "ϵ",
"straightphi": "ϕ",
"strns": "¯",
"sub": "⊂",
"subE": "⫅",
"subdot": "⪽",
"sube": "⊆",
"subedot": "⫃",
"submult": "⫁",
"subnE": "⫋",
"subne": "⊊",
"subplus": "⪿",
"subrarr": "⥹",
"subset": "⊂",
"subseteq": "⊆",
"subseteqq": "⫅",
"subsetneq": "⊊",
"subsetneqq": "⫋",
"subsim": "⫇",
"subsub": "⫕",
"subsup": "⫓",
"succ": "≻",
"succapprox": "⪸",
"succcurlyeq": "≽",
"succeq": "⪰",
"succnapprox": "⪺",
"succneqq": "⪶",
"succnsim": "⋩",
"succsim": "≿",
"sum": "∑",
"sung": "♪",
"sup": "⊃",
"sup1": "¹",
"sup2": "²",
"sup3": "³",
"supE": "⫆",
"supdot": "⪾",
"supdsub": "⫘",
"supe": "⊇",
"supedot": "⫄",
"suphsol": "⟉",
"suphsub": "⫗",
"suplarr": "⥻",
"supmult": "⫂",
"supnE": "⫌",
"supne": "⊋",
"supplus": "⫀",
"supset": "⊃",
"supseteq": "⊇",
"supseteqq": "⫆",
"supsetneq": "⊋",
"supsetneqq": "⫌",
"supsim": "⫈",
"supsub": "⫔",
"supsup": "⫖",
"swArr": "⇙",
"swarhk": "⤦",
"swarr": "↙",
"swarrow": "↙",
"swnwar": "⤪",
"szli": "ß",
"szlig": "ß",
"target": "⌖",
"tau": "τ",
"tbrk": "⎴",
"tcaron": "ť",
"tcedil": "ţ",
"tcy": "т",
"tdot": "⃛",
"telrec": "⌕",
"tfr": "𝔱",
"there4": "∴",
"therefore": "∴",
"theta": "θ",
"thetasym": "ϑ",
"thetav": "ϑ",
"thickapprox": "≈",
"thicksim": "∼",
"thinsp": " ",
"thkap": "≈",
"thksim": "∼",
"thor": "þ",
"thorn": "þ",
"tilde": "˜",
"time": "×",
"times": "×",
"timesb": "⊠",
"timesbar": "⨱",
"timesd": "⨰",
"tint": "∭",
"toea": "⤨",
"top": "⊤",
"topbot": "⌶",
"topcir": "⫱",
"topf": "𝕥",
"topfork": "⫚",
"tosa": "⤩",
"tprime": "‴",
"trade": "™",
"triangle": "▵",
"triangledown": "▿",
"triangleleft": "◃",
"trianglelefteq": "⊴",
"triangleq": "≜",
"triangleright": "▹",
"trianglerighteq": "⊵",
"tridot": "◬",
"trie": "≜",
"triminus": "⨺",
"triplus": "⨹",
"trisb": "⧍",
"tritime": "⨻",
"trpezium": "⏢",
"tscr": "𝓉",
"tscy": "ц",
"tshcy": "ћ",
"tstrok": "ŧ",
"twixt": "≬",
"twoheadleftarrow": "↞",
"twoheadrightarrow": "↠",
"uArr": "⇑",
"uHar": "⥣",
"uacut": "ú",
"uacute": "ú",
"uarr": "↑",
"ubrcy": "ў",
"ubreve": "ŭ",
"ucir": "û",
"ucirc": "û",
"ucy": "у",
"udarr": "⇅",
"udblac": "ű",
"udhar": "⥮",
"ufisht": "⥾",
"ufr": "𝔲",
"ugrav": "ù",
"ugrave": "ù",
"uharl": "↿",
"uharr": "↾",
"uhblk": "▀",
"ulcorn": "⌜",
"ulcorner": "⌜",
"ulcrop": "⌏",
"ultri": "◸",
"umacr": "ū",
"um": "¨",
"uml": "¨",
"uogon": "ų",
"uopf": "𝕦",
"uparrow": "↑",
"updownarrow": "↕",
"upharpoonleft": "↿",
"upharpoonright": "↾",
"uplus": "⊎",
"upsi": "υ",
"upsih": "ϒ",
"upsilon": "υ",
"upuparrows": "⇈",
"urcorn": "⌝",
"urcorner": "⌝",
"urcrop": "⌎",
"uring": "ů",
"urtri": "◹",
"uscr": "𝓊",
"utdot": "⋰",
"utilde": "ũ",
"utri": "▵",
"utrif": "▴",
"uuarr": "⇈",
"uum": "ü",
"uuml": "ü",
"uwangle": "⦧",
"vArr": "⇕",
"vBar": "⫨",
"vBarv": "⫩",
"vDash": "⊨",
"vangrt": "⦜",
"varepsilon": "ϵ",
"varkappa": "ϰ",
"varnothing": "∅",
"varphi": "ϕ",
"varpi": "ϖ",
"varpropto": "∝",
"varr": "↕",
"varrho": "ϱ",
"varsigma": "ς",
"varsubsetneq": "⊊︀",
"varsubsetneqq": "⫋︀",
"varsupsetneq": "⊋︀",
"varsupsetneqq": "⫌︀",
"vartheta": "ϑ",
"vartriangleleft": "⊲",
"vartriangleright": "⊳",
"vcy": "в",
"vdash": "⊢",
"vee": "∨",
"veebar": "⊻",
"veeeq": "≚",
"vellip": "⋮",
"verbar": "|",
"vert": "|",
"vfr": "𝔳",
"vltri": "⊲",
"vnsub": "⊂⃒",
"vnsup": "⊃⃒",
"vopf": "𝕧",
"vprop": "∝",
"vrtri": "⊳",
"vscr": "𝓋",
"vsubnE": "⫋︀",
"vsubne": "⊊︀",
"vsupnE": "⫌︀",
"vsupne": "⊋︀",
"vzigzag": "⦚",
"wcirc": "ŵ",
"wedbar": "⩟",
"wedge": "∧",
"wedgeq": "≙",
"weierp": "℘",
"wfr": "𝔴",
"wopf": "𝕨",
"wp": "℘",
"wr": "≀",
"wreath": "≀",
"wscr": "𝓌",
"xcap": "⋂",
"xcirc": "◯",
"xcup": "⋃",
"xdtri": "▽",
"xfr": "𝔵",
"xhArr": "⟺",
"xharr": "⟷",
"xi": "ξ",
"xlArr": "⟸",
"xlarr": "⟵",
"xmap": "⟼",
"xnis": "⋻",
"xodot": "⨀",
"xopf": "𝕩",
"xoplus": "⨁",
"xotime": "⨂",
"xrArr": "⟹",
"xrarr": "⟶",
"xscr": "𝓍",
"xsqcup": "⨆",
"xuplus": "⨄",
"xutri": "△",
"xvee": "⋁",
"xwedge": "⋀",
"yacut": "ý",
"yacute": "ý",
"yacy": "я",
"ycirc": "ŷ",
"ycy": "ы",
"ye": "¥",
"yen": "¥",
"yfr": "𝔶",
"yicy": "ї",
"yopf": "𝕪",
"yscr": "𝓎",
"yucy": "ю",
"yum": "ÿ",
"yuml": "ÿ",
"zacute": "ź",
"zcaron": "ž",
"zcy": "з",
"zdot": "ż",
"zeetrf": "ℨ",
"zeta": "ζ",
"zfr": "𝔷",
"zhcy": "ж",
"zigrarr": "⇝",
"zopf": "𝕫",
"zscr": "𝓏",
"zwj": "‍",
"zwnj": "‌"
}
},{}],57:[function(require,module,exports){
module.exports={
"0": "�",
"128": "€",
"130": "‚",
"131": "ƒ",
"132": "„",
"133": "…",
"134": "†",
"135": "‡",
"136": "ˆ",
"137": "‰",
"138": "Š",
"139": "‹",
"140": "Œ",
"142": "Ž",
"145": "‘",
"146": "’",
"147": "“",
"148": "”",
"149": "•",
"150": "–",
"151": "—",
"152": "˜",
"153": "™",
"154": "š",
"155": "›",
"156": "œ",
"158": "ž",
"159": "Ÿ"
}
},{}],58:[function(require,module,exports){
'use strict';
var alphabetical = require('is-alphabetical');
var decimal = require('is-decimal');
module.exports = alphanumerical;
/* Check if the given character code, or the character
* code at the first character, is alphanumerical. */
function alphanumerical(character) {
return alphabetical(character) || decimal(character);
}
},{"is-alphabetical":49,"is-decimal":50}],59:[function(require,module,exports){
'use strict';
module.exports = hexadecimal;
/* Check if the given character code, or the character
* code at the first character, is hexadecimal. */
function hexadecimal(character) {
var code = typeof character === 'string' ?
character.charCodeAt(0) : character;
return (code >= 97 /* a */ && code <= 102 /* z */) ||
(code >= 65 /* A */ && code <= 70 /* Z */) ||
(code >= 48 /* A */ && code <= 57 /* Z */);
}
},{}],60:[function(require,module,exports){
/*!
* repeat-string <https://github.com/jonschlinkert/repeat-string>
*
* Copyright (c) 2014-2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
/**
* Results cache
*/
var res = '';
var cache;
/**
* Expose `repeat`
*/
module.exports = repeat;
/**
* Repeat the given `string` the specified `number`
* of times.
*
* **Example:**
*
* ```js
* var repeat = require('repeat-string');
* repeat('A', 5);
* //=> AAAAA
* ```
*
* @param {String} `string` The string to repeat
* @param {Number} `number` The number of times to repeat the string
* @return {String} Repeated string
* @api public
*/
function repeat(str, num) {
if (typeof str !== 'string') {
throw new TypeError('expected a string');
}
// cover common, quick use cases
if (num === 1) return str;
if (num === 2) return str + str;
var max = str.length * num;
if (cache !== str || typeof cache === 'undefined') {
cache = str;
res = '';
} else if (res.length >= max) {
return res.substr(0, max);
}
while (max > res.length && num > 1) {
if (num & 1) {
res += str;
}
num >>= 1;
str += str;
}
res += str;
res = res.substr(0, max);
return res;
}
},{}],61:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module state-toggle
* @fileoverview Enter/exit a state.
*/
'use strict';
/* eslint-env commonjs */
/* Expose. */
module.exports = factory;
/**
* Construct a state `toggler`: a function which inverses
* `property` in context based on its current value.
* The by `toggler` returned function restores that value.
*
* @param {string} key - Property to toggle.
* @param {boolean} state - Default state.
* @param {Object?} [ctx] - Context object.
* @return {Function} - Enter.
*/
function factory(key, state, ctx) {
/**
* Enter a state.
*
* @return {Function} - Exit state.
*/
return function () {
var context = ctx || this;
var current = context[key];
context[key] = !state;
/**
* Cancel state to its value before entering.
*/
return function () {
context[key] = current;
};
};
}
},{}],62:[function(require,module,exports){
'use strict';
module.exports = trimTrailingLines;
var line = '\n';
/* Remove final newline characters from `value`. */
function trimTrailingLines(value) {
var val = String(value);
var index = val.length;
while (val.charAt(--index) === line) { /* empty */ }
return val.slice(0, index + 1);
}
},{}],63:[function(require,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],64:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2015 Titus Wormer
* @license MIT
* @module unherit
* @fileoverview Create a custom constructor which can be modified
* without affecting the original class.
*/
'use strict';
/* Dependencies. */
var xtend = require('xtend');
var inherits = require('inherits');
/* Expose. */
module.exports = unherit;
/**
* Create a custom constructor which can be modified
* without affecting the original class.
*
* @param {Function} Super - Super-class.
* @return {Function} - Constructor acting like `Super`,
* which can be modified without affecting the original
* class.
*/
function unherit(Super) {
var result;
var key;
var value;
inherits(Of, Super);
inherits(From, Of);
/* Clone values. */
result = Of.prototype;
for (key in result) {
value = result[key];
if (value && typeof value === 'object') {
result[key] = 'concat' in value ? value.concat() : xtend(value);
}
}
return Of;
/**
* Constructor accepting a single argument,
* which itself is an `arguments` object.
*/
function From(parameters) {
return Super.apply(this, parameters);
}
/**
* Constructor accepting variadic arguments.
*/
function Of() {
if (!(this instanceof Of)) {
return new From(arguments);
}
return Super.apply(this, arguments);
}
}
},{"inherits":65,"xtend":69}],65:[function(require,module,exports){
if (typeof Object.create === 'function') {
// implementation from standard node.js 'util' module
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
};
} else {
// old school shim for old browsers
module.exports = function inherits(ctor, superCtor) {
ctor.super_ = superCtor
var TempCtor = function () {}
TempCtor.prototype = superCtor.prototype
ctor.prototype = new TempCtor()
ctor.prototype.constructor = ctor
}
}
},{}],66:[function(require,module,exports){
'use strict';
var visit = require('unist-util-visit');
module.exports = removePosition;
/* Remove `position`s from `tree`. */
function removePosition(node, force) {
visit(node, force ? hard : soft);
return node;
}
function hard(node) {
delete node.position;
}
function soft(node) {
node.position = undefined;
}
},{"unist-util-visit":67}],67:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = visit;
/* Visit. */
function visit(tree, type, visitor, reverse) {
if (typeof type === 'function') {
reverse = visitor;
visitor = type;
type = null;
}
one(tree);
/* Visit a single node. */
function one(node, index, parent) {
var result;
index = index || (parent ? 0 : null);
if (!type || node.type === type) {
result = visitor(node, index, parent || null);
}
if (node.children && result !== false) {
return all(node.children, node);
}
return result;
}
/* Visit children in `parent`. */
function all(children, parent) {
var step = reverse ? -1 : 1;
var max = children.length;
var min = -1;
var index = (reverse ? max : min) + step;
var child;
while (index > min && index < max) {
child = children[index];
if (child && one(child, index, parent) === false) {
return false;
}
index += step;
}
return true;
}
}
},{}],68:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = factory;
/* Factory. */
function factory(file) {
var contents = indices(String(file));
return {
toPosition: offsetToPositionFactory(contents),
toOffset: positionToOffsetFactory(contents)
};
}
/* Factory to get the line and column-based `position` for
* `offset` in the bound indices. */
function offsetToPositionFactory(indices) {
return offsetToPosition;
/* Get the line and column-based `position` for
* `offset` in the bound indices. */
function offsetToPosition(offset) {
var index = -1;
var length = indices.length;
if (offset < 0) {
return {};
}
while (++index < length) {
if (indices[index] > offset) {
return {
line: index + 1,
column: (offset - (indices[index - 1] || 0)) + 1,
offset: offset
};
}
}
return {};
}
}
/* Factory to get the `offset` for a line and column-based
* `position` in the bound indices. */
function positionToOffsetFactory(indices) {
return positionToOffset;
/* Get the `offset` for a line and column-based
* `position` in the bound indices. */
function positionToOffset(position) {
var line = position && position.line;
var column = position && position.column;
if (!isNaN(line) && !isNaN(column) && line - 1 in indices) {
return ((indices[line - 2] || 0) + column - 1) || 0;
}
return -1;
}
}
/* Get indices of line-breaks in `value`. */
function indices(value) {
var result = [];
var index = value.indexOf('\n');
while (index !== -1) {
result.push(index + 1);
index = value.indexOf('\n', index + 1);
}
result.push(value.length + 1);
return result;
}
},{}],69:[function(require,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],"remark-parse":[function(require,module,exports){
'use strict';
var unherit = require('unherit');
var xtend = require('xtend');
var Parser = require('./lib/parser.js');
module.exports = parse;
parse.Parser = Parser;
function parse(options) {
var Local = unherit(Parser);
Local.prototype.options = xtend(Local.prototype.options, this.data('settings'), options);
this.Parser = Local;
}
},{"./lib/parser.js":14,"unherit":64,"xtend":69}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImxpYi9ibG9jay1lbGVtZW50cy5qc29uIiwibGliL2RlY29kZS5qcyIsImxpYi9kZWZhdWx0cy5qcyIsImxpYi9sb2NhdGUvYnJlYWsuanMiLCJsaWIvbG9jYXRlL2NvZGUtaW5saW5lLmpzIiwibGliL2xvY2F0ZS9kZWxldGUuanMiLCJsaWIvbG9jYXRlL2VtcGhhc2lzLmpzIiwibGliL2xvY2F0ZS9lc2NhcGUuanMiLCJsaWIvbG9jYXRlL2xpbmsuanMiLCJsaWIvbG9jYXRlL3N0cm9uZy5qcyIsImxpYi9sb2NhdGUvdGFnLmpzIiwibGliL2xvY2F0ZS91cmwuanMiLCJsaWIvcGFyc2UuanMiLCJsaWIvcGFyc2VyLmpzIiwibGliL3NldC1vcHRpb25zLmpzIiwibGliL3Rva2VuaXplL2F1dG8tbGluay5qcyIsImxpYi90b2tlbml6ZS9ibG9ja3F1b3RlLmpzIiwibGliL3Rva2VuaXplL2JyZWFrLmpzIiwibGliL3Rva2VuaXplL2NvZGUtZmVuY2VkLmpzIiwibGliL3Rva2VuaXplL2NvZGUtaW5kZW50ZWQuanMiLCJsaWIvdG9rZW5pemUvY29kZS1pbmxpbmUuanMiLCJsaWIvdG9rZW5pemUvZGVmaW5pdGlvbi5qcyIsImxpYi90b2tlbml6ZS9kZWxldGUuanMiLCJsaWIvdG9rZW5pemUvZW1waGFzaXMuanMiLCJsaWIvdG9rZW5pemUvZXNjYXBlLmpzIiwibGliL3Rva2VuaXplL2Zvb3Rub3RlLWRlZmluaXRpb24uanMiLCJsaWIvdG9rZW5pemUvaGVhZGluZy1hdHguanMiLCJsaWIvdG9rZW5pemUvaGVhZGluZy1zZXRleHQuanMiLCJsaWIvdG9rZW5pemUvaHRtbC1ibG9jay5qcyIsImxpYi90b2tlbml6ZS9odG1sLWlubGluZS5qcyIsImxpYi90b2tlbml6ZS9saW5rLmpzIiwibGliL3Rva2VuaXplL2xpc3QuanMiLCJsaWIvdG9rZW5pemUvbmV3bGluZS5qcyIsImxpYi90b2tlbml6ZS9wYXJhZ3JhcGguanMiLCJsaWIvdG9rZW5pemUvcmVmZXJlbmNlLmpzIiwibGliL3Rva2VuaXplL3N0cm9uZy5qcyIsImxpYi90b2tlbml6ZS90YWJsZS5qcyIsImxpYi90b2tlbml6ZS90ZXh0LmpzIiwibGliL3Rva2VuaXplL3RoZW1hdGljLWJyZWFrLmpzIiwibGliL3Rva2VuaXplL3VybC5qcyIsImxpYi90b2tlbml6ZXIuanMiLCJsaWIvdW5lc2NhcGUuanMiLCJsaWIvdXRpbC9nZXQtaW5kZW50YXRpb24uanMiLCJsaWIvdXRpbC9odG1sLmpzIiwibGliL3V0aWwvaW50ZXJydXB0LmpzIiwibGliL3V0aWwvbm9ybWFsaXplLmpzIiwibGliL3V0aWwvcmVtb3ZlLWluZGVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvbGxhcHNlLXdoaXRlLXNwYWNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWFscGhhYmV0aWNhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pcy1kZWNpbWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2lzLXdvcmQtY2hhcmFjdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcmtkb3duLWVzY2FwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3kvaW5kZXguanNvbiIsIm5vZGVfbW9kdWxlcy9wYXJzZS1lbnRpdGllcy9ub2RlX21vZHVsZXMvY2hhcmFjdGVyLWVudGl0aWVzL2luZGV4Lmpzb24iLCJub2RlX21vZHVsZXMvcGFyc2UtZW50aXRpZXMvbm9kZV9tb2R1bGVzL2NoYXJhY3Rlci1yZWZlcmVuY2UtaW52YWxpZC9pbmRleC5qc29uIiwibm9kZV9tb2R1bGVzL3BhcnNlLWVudGl0aWVzL25vZGVfbW9kdWxlcy9pcy1hbHBoYW51bWVyaWNhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZS1lbnRpdGllcy9ub2RlX21vZHVsZXMvaXMtaGV4YWRlY2ltYWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVwZWF0LXN0cmluZy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zdGF0ZS10b2dnbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHJpbS10cmFpbGluZy1saW5lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy90cmltL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaGVyaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5oZXJpdC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZmlsZS1sb2NhdGlvbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94dGVuZC9pbW11dGFibGUuanMiLCJyZW1hcmstcGFyc2UiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6ZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaHJFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzPVtcbiAgXCJhZGRyZXNzXCIsXG4gIFwiYXJ0aWNsZVwiLFxuICBcImFzaWRlXCIsXG4gIFwiYmFzZVwiLFxuICBcImJhc2Vmb250XCIsXG4gIFwiYmxvY2txdW90ZVwiLFxuICBcImJvZHlcIixcbiAgXCJjYXB0aW9uXCIsXG4gIFwiY2VudGVyXCIsXG4gIFwiY29sXCIsXG4gIFwiY29sZ3JvdXBcIixcbiAgXCJkZFwiLFxuICBcImRldGFpbHNcIixcbiAgXCJkaWFsb2dcIixcbiAgXCJkaXJcIixcbiAgXCJkaXZcIixcbiAgXCJkbFwiLFxuICBcImR0XCIsXG4gIFwiZmllbGRzZXRcIixcbiAgXCJmaWdjYXB0aW9uXCIsXG4gIFwiZmlndXJlXCIsXG4gIFwiZm9vdGVyXCIsXG4gIFwiZm9ybVwiLFxuICBcImZyYW1lXCIsXG4gIFwiZnJhbWVzZXRcIixcbiAgXCJoMVwiLFxuICBcImgyXCIsXG4gIFwiaDNcIixcbiAgXCJoNFwiLFxuICBcImg1XCIsXG4gIFwiaDZcIixcbiAgXCJoZWFkXCIsXG4gIFwiaGVhZGVyXCIsXG4gIFwiaGdyb3VwXCIsXG4gIFwiaHJcIixcbiAgXCJodG1sXCIsXG4gIFwiaWZyYW1lXCIsXG4gIFwibGVnZW5kXCIsXG4gIFwibGlcIixcbiAgXCJsaW5rXCIsXG4gIFwibWFpblwiLFxuICBcIm1lbnVcIixcbiAgXCJtZW51aXRlbVwiLFxuICBcIm1ldGFcIixcbiAgXCJuYXZcIixcbiAgXCJub2ZyYW1lc1wiLFxuICBcIm9sXCIsXG4gIFwib3B0Z3JvdXBcIixcbiAgXCJvcHRpb25cIixcbiAgXCJwXCIsXG4gIFwicGFyYW1cIixcbiAgXCJwcmVcIixcbiAgXCJzZWN0aW9uXCIsXG4gIFwic291cmNlXCIsXG4gIFwidGl0bGVcIixcbiAgXCJzdW1tYXJ5XCIsXG4gIFwidGFibGVcIixcbiAgXCJ0Ym9keVwiLFxuICBcInRkXCIsXG4gIFwidGZvb3RcIixcbiAgXCJ0aFwiLFxuICBcInRoZWFkXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0clwiLFxuICBcInRyYWNrXCIsXG4gIFwidWxcIlxuXVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW50aXRpZXMgPSByZXF1aXJlKCdwYXJzZS1lbnRpdGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cbi8qIEZhY3RvcnkgdG8gY3JlYXRlIGFuIGVudGl0eSBkZWNvZGVyLiAqL1xuZnVuY3Rpb24gZmFjdG9yeShjdHgpIHtcbiAgZGVjb2Rlci5yYXcgPSBkZWNvZGVSYXc7XG5cbiAgcmV0dXJuIGRlY29kZXI7XG5cbiAgLyogTm9ybWFsaXplIGBwb3NpdGlvbmAgdG8gYWRkIGFuIGBpbmRlbnRgLiAqL1xuICBmdW5jdGlvbiBub3JtYWxpemUocG9zaXRpb24pIHtcbiAgICB2YXIgb2Zmc2V0cyA9IGN0eC5vZmZzZXQ7XG4gICAgdmFyIGxpbmUgPSBwb3NpdGlvbi5saW5lO1xuICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2xpbmUpIHtcbiAgICAgIGlmICghKGxpbmUgaW4gb2Zmc2V0cykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdC5wdXNoKChvZmZzZXRzW2xpbmVdIHx8IDApICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBwb3NpdGlvbixcbiAgICAgIGluZGVudDogcmVzdWx0XG4gICAgfTtcbiAgfVxuXG4gIC8qIEhhbmRsZSBhIHdhcm5pbmcuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vd29vb3JtL3BhcnNlLWVudGl0aWVzXG4gICAqIGZvciB0aGUgd2FybmluZ3MuICovXG4gIGZ1bmN0aW9uIGhhbmRsZVdhcm5pbmcocmVhc29uLCBwb3NpdGlvbiwgY29kZSkge1xuICAgIGlmIChjb2RlID09PSAzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY3R4LmZpbGUubWVzc2FnZShyZWFzb24sIHBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qIERlY29kZSBgdmFsdWVgIChhdCBgcG9zaXRpb25gKSBpbnRvIHRleHQtbm9kZXMuICovXG4gIGZ1bmN0aW9uIGRlY29kZXIodmFsdWUsIHBvc2l0aW9uLCBoYW5kbGVyKSB7XG4gICAgZW50aXRpZXModmFsdWUsIHtcbiAgICAgIHBvc2l0aW9uOiBub3JtYWxpemUocG9zaXRpb24pLFxuICAgICAgd2FybmluZzogaGFuZGxlV2FybmluZyxcbiAgICAgIHRleHQ6IGhhbmRsZXIsXG4gICAgICByZWZlcmVuY2U6IGhhbmRsZXIsXG4gICAgICB0ZXh0Q29udGV4dDogY3R4LFxuICAgICAgcmVmZXJlbmNlQ29udGV4dDogY3R4XG4gICAgfSk7XG4gIH1cblxuICAvKiBEZWNvZGUgYHZhbHVlYCAoYXQgYHBvc2l0aW9uYCkgaW50byBhIHN0cmluZy4gKi9cbiAgZnVuY3Rpb24gZGVjb2RlUmF3KHZhbHVlLCBwb3NpdGlvbikge1xuICAgIHJldHVybiBlbnRpdGllcyh2YWx1ZSwge1xuICAgICAgcG9zaXRpb246IG5vcm1hbGl6ZShwb3NpdGlvbiksXG4gICAgICB3YXJuaW5nOiBoYW5kbGVXYXJuaW5nXG4gICAgfSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBvc2l0aW9uOiB0cnVlLFxuICBnZm06IHRydWUsXG4gIGNvbW1vbm1hcms6IGZhbHNlLFxuICBmb290bm90ZXM6IGZhbHNlLFxuICBwZWRhbnRpYzogZmFsc2UsXG4gIGJsb2NrczogcmVxdWlyZSgnLi9ibG9jay1lbGVtZW50cy5qc29uJylcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCdcXG4nLCBmcm9tSW5kZXgpO1xuXG4gIHdoaWxlIChpbmRleCA+IGZyb21JbmRleCkge1xuICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXggLSAxKSAhPT0gJyAnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpbmRleC0tO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvY2F0ZTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlLmluZGV4T2YoJ2AnLCBmcm9tSW5kZXgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvY2F0ZTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlLmluZGV4T2YoJ35+JywgZnJvbUluZGV4KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBsb2NhdGU7XG5cbmZ1bmN0aW9uIGxvY2F0ZSh2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBhc3RlcmlzayA9IHZhbHVlLmluZGV4T2YoJyonLCBmcm9tSW5kZXgpO1xuICB2YXIgdW5kZXJzY29yZSA9IHZhbHVlLmluZGV4T2YoJ18nLCBmcm9tSW5kZXgpO1xuXG4gIGlmICh1bmRlcnNjb3JlID09PSAtMSkge1xuICAgIHJldHVybiBhc3RlcmlzaztcbiAgfVxuXG4gIGlmIChhc3RlcmlzayA9PT0gLTEpIHtcbiAgICByZXR1cm4gdW5kZXJzY29yZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlcnNjb3JlIDwgYXN0ZXJpc2sgPyB1bmRlcnNjb3JlIDogYXN0ZXJpc2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUuaW5kZXhPZignXFxcXCcsIGZyb21JbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgbGluayA9IHZhbHVlLmluZGV4T2YoJ1snLCBmcm9tSW5kZXgpO1xuICB2YXIgaW1hZ2UgPSB2YWx1ZS5pbmRleE9mKCchWycsIGZyb21JbmRleCk7XG5cbiAgaWYgKGltYWdlID09PSAtMSkge1xuICAgIHJldHVybiBsaW5rO1xuICB9XG5cbiAgLyogTGluayBjYW4gbmV2ZXIgYmUgYC0xYCBpZiBhbiBpbWFnZSBpcyBmb3VuZCwgc28gd2UgZG9u4oCZdCBuZWVkXG4gICAqIHRvIGNoZWNrIGZvciB0aGF0IDopICovXG4gIHJldHVybiBsaW5rIDwgaW1hZ2UgPyBsaW5rIDogaW1hZ2U7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICB2YXIgYXN0ZXJpc2sgPSB2YWx1ZS5pbmRleE9mKCcqKicsIGZyb21JbmRleCk7XG4gIHZhciB1bmRlcnNjb3JlID0gdmFsdWUuaW5kZXhPZignX18nLCBmcm9tSW5kZXgpO1xuXG4gIGlmICh1bmRlcnNjb3JlID09PSAtMSkge1xuICAgIHJldHVybiBhc3RlcmlzaztcbiAgfVxuXG4gIGlmIChhc3RlcmlzayA9PT0gLTEpIHtcbiAgICByZXR1cm4gdW5kZXJzY29yZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlcnNjb3JlIDwgYXN0ZXJpc2sgPyB1bmRlcnNjb3JlIDogYXN0ZXJpc2s7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBsb2NhdGUodmFsdWUsIGZyb21JbmRleCkge1xuICByZXR1cm4gdmFsdWUuaW5kZXhPZignPCcsIGZyb21JbmRleCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYXRlO1xuXG52YXIgUFJPVE9DT0xTID0gWydodHRwczovLycsICdodHRwOi8vJywgJ21haWx0bzonXTtcblxuZnVuY3Rpb24gbG9jYXRlKHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgdmFyIGxlbmd0aCA9IFBST1RPQ09MUy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbWluID0gLTE7XG4gIHZhciBwb3NpdGlvbjtcblxuICBpZiAoIXRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHBvc2l0aW9uID0gdmFsdWUuaW5kZXhPZihQUk9UT0NPTFNbaW5kZXhdLCBmcm9tSW5kZXgpO1xuXG4gICAgaWYgKHBvc2l0aW9uICE9PSAtMSAmJiAocG9zaXRpb24gPCBtaW4gfHwgbWluID09PSAtMSkpIHtcbiAgICAgIG1pbiA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaW47XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgcmVtb3ZlUG9zaXRpb24gPSByZXF1aXJlKCd1bmlzdC11dGlsLXJlbW92ZS1wb3NpdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuXG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgRVhQUkVTU0lPTl9MSU5FX0JSRUFLUyA9IC9cXHJcXG58XFxyL2c7XG5cbi8qIFBhcnNlIHRoZSBib3VuZCBmaWxlLiAqL1xuZnVuY3Rpb24gcGFyc2UoKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIHZhbHVlID0gU3RyaW5nKHNlbGYuZmlsZSk7XG4gIHZhciBzdGFydCA9IHtsaW5lOiAxLCBjb2x1bW46IDEsIG9mZnNldDogMH07XG4gIHZhciBjb250ZW50ID0geHRlbmQoc3RhcnQpO1xuICB2YXIgbm9kZTtcblxuICAvKiBDbGVhbiBub24tdW5peCBuZXdsaW5lczogYFxcclxcbmAgYW5kIGBcXHJgIGFyZSBhbGxcbiAgICogY2hhbmdlZCB0byBgXFxuYC4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgcG9zaXRpb25hbFxuICAgKiBpbmZvcm1hdGlvbi4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fTElORV9CUkVBS1MsIENfTkVXTElORSk7XG5cbiAgaWYgKHZhbHVlLmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG5cbiAgICBjb250ZW50LmNvbHVtbisrO1xuICAgIGNvbnRlbnQub2Zmc2V0Kys7XG4gIH1cblxuICBub2RlID0ge1xuICAgIHR5cGU6ICdyb290JyxcbiAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUJsb2NrKHZhbHVlLCBjb250ZW50KSxcbiAgICBwb3NpdGlvbjoge1xuICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgZW5kOiBzZWxmLmVvZiB8fCB4dGVuZChzdGFydClcbiAgICB9XG4gIH07XG5cbiAgaWYgKCFzZWxmLm9wdGlvbnMucG9zaXRpb24pIHtcbiAgICByZW1vdmVQb3NpdGlvbihub2RlLCB0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIHRvZ2dsZSA9IHJlcXVpcmUoJ3N0YXRlLXRvZ2dsZScpO1xudmFyIHZmaWxlTG9jYXRpb24gPSByZXF1aXJlKCd2ZmlsZS1sb2NhdGlvbicpO1xudmFyIHVuZXNjYXBlID0gcmVxdWlyZSgnLi91bmVzY2FwZScpO1xudmFyIGRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG52YXIgdG9rZW5pemVyID0gcmVxdWlyZSgnLi90b2tlbml6ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG5cbmZ1bmN0aW9uIFBhcnNlcihkb2MsIGZpbGUpIHtcbiAgdGhpcy5maWxlID0gZmlsZTtcbiAgdGhpcy5vZmZzZXQgPSB7fTtcbiAgdGhpcy5vcHRpb25zID0geHRlbmQodGhpcy5vcHRpb25zKTtcbiAgdGhpcy5zZXRPcHRpb25zKHt9KTtcblxuICB0aGlzLmluTGlzdCA9IGZhbHNlO1xuICB0aGlzLmluQmxvY2sgPSBmYWxzZTtcbiAgdGhpcy5pbkxpbmsgPSBmYWxzZTtcbiAgdGhpcy5hdFN0YXJ0ID0gdHJ1ZTtcblxuICB0aGlzLnRvT2Zmc2V0ID0gdmZpbGVMb2NhdGlvbihmaWxlKS50b09mZnNldDtcbiAgdGhpcy51bmVzY2FwZSA9IHVuZXNjYXBlKHRoaXMsICdlc2NhcGUnKTtcbiAgdGhpcy5kZWNvZGUgPSBkZWNvZGUodGhpcyk7XG59XG5cbnZhciBwcm90byA9IFBhcnNlci5wcm90b3R5cGU7XG5cbi8qIEV4cG9zZSBjb3JlLiAqL1xucHJvdG8uc2V0T3B0aW9ucyA9IHJlcXVpcmUoJy4vc2V0LW9wdGlvbnMnKTtcbnByb3RvLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xuXG4vKiBFeHBvc2UgYGRlZmF1bHRzYC4gKi9cbnByb3RvLm9wdGlvbnMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbi8qIEVudGVyIGFuZCBleGl0IGhlbHBlcnMuICovXG5wcm90by5leGl0U3RhcnQgPSB0b2dnbGUoJ2F0U3RhcnQnLCB0cnVlKTtcbnByb3RvLmVudGVyTGlzdCA9IHRvZ2dsZSgnaW5MaXN0JywgZmFsc2UpO1xucHJvdG8uZW50ZXJMaW5rID0gdG9nZ2xlKCdpbkxpbmsnLCBmYWxzZSk7XG5wcm90by5lbnRlckJsb2NrID0gdG9nZ2xlKCdpbkJsb2NrJywgZmFsc2UpO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIHBhcmFncmFwaDpcbiAqXG4gKiBgYGBtYXJrZG93blxuICogQSBwYXJhZ3JhcGgsIGZvbGxvd2VkIGJ5IGEgdGhlbWF0aWMgYnJlYWsuXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgcGFyYWdyYXBoLiAqL1xucHJvdG8uaW50ZXJydXB0UGFyYWdyYXBoID0gW1xuICBbJ3RoZW1hdGljQnJlYWsnXSxcbiAgWydhdHhIZWFkaW5nJ10sXG4gIFsnZmVuY2VkQ29kZSddLFxuICBbJ2Jsb2NrcXVvdGUnXSxcbiAgWydodG1sJ10sXG4gIFsnc2V0ZXh0SGVhZGluZycsIHtjb21tb25tYXJrOiBmYWxzZX1dLFxuICBbJ2RlZmluaXRpb24nLCB7Y29tbW9ubWFyazogZmFsc2V9XSxcbiAgWydmb290bm90ZScsIHtjb21tb25tYXJrOiBmYWxzZX1dXG5dO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIGxpc3Q6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIC0gT25lXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgbGlzdC4gKi9cbnByb3RvLmludGVycnVwdExpc3QgPSBbXG4gIFsnZmVuY2VkQ29kZScsIHtwZWRhbnRpYzogZmFsc2V9XSxcbiAgWyd0aGVtYXRpY0JyZWFrJywge3BlZGFudGljOiBmYWxzZX1dLFxuICBbJ2RlZmluaXRpb24nLCB7Y29tbW9ubWFyazogZmFsc2V9XSxcbiAgWydmb290bm90ZScsIHtjb21tb25tYXJrOiBmYWxzZX1dXG5dO1xuXG4vKiBOb2RlcyB0aGF0IGNhbiBpbnRlcnVwdCBhIGJsb2NrcXVvdGU6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqID4gQSBwYXJhZ3JhcGguXG4gKiBfX19cbiAqIGBgYFxuICpcbiAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgdGhlbWF0aWMgYnJlYWsg4oCcaW50ZXJ1cHRz4oCdXG4gKiB0aGUgYmxvY2txdW90ZS4gKi9cbnByb3RvLmludGVycnVwdEJsb2NrcXVvdGUgPSBbXG4gIFsnaW5kZW50ZWRDb2RlJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydmZW5jZWRDb2RlJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydhdHhIZWFkaW5nJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydzZXRleHRIZWFkaW5nJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWyd0aGVtYXRpY0JyZWFrJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydodG1sJywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydsaXN0Jywge2NvbW1vbm1hcms6IHRydWV9XSxcbiAgWydkZWZpbml0aW9uJywge2NvbW1vbm1hcms6IGZhbHNlfV0sXG4gIFsnZm9vdG5vdGUnLCB7Y29tbW9ubWFyazogZmFsc2V9XVxuXTtcblxuLyogSGFuZGxlcnMuICovXG5wcm90by5ibG9ja1Rva2VuaXplcnMgPSB7XG4gIG5ld2xpbmU6IHJlcXVpcmUoJy4vdG9rZW5pemUvbmV3bGluZScpLFxuICBpbmRlbnRlZENvZGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmRlbnRlZCcpLFxuICBmZW5jZWRDb2RlOiByZXF1aXJlKCcuL3Rva2VuaXplL2NvZGUtZmVuY2VkJyksXG4gIGJsb2NrcXVvdGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvYmxvY2txdW90ZScpLFxuICBhdHhIZWFkaW5nOiByZXF1aXJlKCcuL3Rva2VuaXplL2hlYWRpbmctYXR4JyksXG4gIHRoZW1hdGljQnJlYWs6IHJlcXVpcmUoJy4vdG9rZW5pemUvdGhlbWF0aWMtYnJlYWsnKSxcbiAgbGlzdDogcmVxdWlyZSgnLi90b2tlbml6ZS9saXN0JyksXG4gIHNldGV4dEhlYWRpbmc6IHJlcXVpcmUoJy4vdG9rZW5pemUvaGVhZGluZy1zZXRleHQnKSxcbiAgaHRtbDogcmVxdWlyZSgnLi90b2tlbml6ZS9odG1sLWJsb2NrJyksXG4gIGZvb3Rub3RlOiByZXF1aXJlKCcuL3Rva2VuaXplL2Zvb3Rub3RlLWRlZmluaXRpb24nKSxcbiAgZGVmaW5pdGlvbjogcmVxdWlyZSgnLi90b2tlbml6ZS9kZWZpbml0aW9uJyksXG4gIHRhYmxlOiByZXF1aXJlKCcuL3Rva2VuaXplL3RhYmxlJyksXG4gIHBhcmFncmFwaDogcmVxdWlyZSgnLi90b2tlbml6ZS9wYXJhZ3JhcGgnKVxufTtcblxucHJvdG8uaW5saW5lVG9rZW5pemVycyA9IHtcbiAgZXNjYXBlOiByZXF1aXJlKCcuL3Rva2VuaXplL2VzY2FwZScpLFxuICBhdXRvTGluazogcmVxdWlyZSgnLi90b2tlbml6ZS9hdXRvLWxpbmsnKSxcbiAgdXJsOiByZXF1aXJlKCcuL3Rva2VuaXplL3VybCcpLFxuICBodG1sOiByZXF1aXJlKCcuL3Rva2VuaXplL2h0bWwtaW5saW5lJyksXG4gIGxpbms6IHJlcXVpcmUoJy4vdG9rZW5pemUvbGluaycpLFxuICByZWZlcmVuY2U6IHJlcXVpcmUoJy4vdG9rZW5pemUvcmVmZXJlbmNlJyksXG4gIHN0cm9uZzogcmVxdWlyZSgnLi90b2tlbml6ZS9zdHJvbmcnKSxcbiAgZW1waGFzaXM6IHJlcXVpcmUoJy4vdG9rZW5pemUvZW1waGFzaXMnKSxcbiAgZGVsZXRpb246IHJlcXVpcmUoJy4vdG9rZW5pemUvZGVsZXRlJyksXG4gIGNvZGU6IHJlcXVpcmUoJy4vdG9rZW5pemUvY29kZS1pbmxpbmUnKSxcbiAgYnJlYWs6IHJlcXVpcmUoJy4vdG9rZW5pemUvYnJlYWsnKSxcbiAgdGV4dDogcmVxdWlyZSgnLi90b2tlbml6ZS90ZXh0Jylcbn07XG5cbi8qIEV4cG9zZSBwcmVjZWRlbmNlLiAqL1xucHJvdG8uYmxvY2tNZXRob2RzID0ga2V5cyhwcm90by5ibG9ja1Rva2VuaXplcnMpO1xucHJvdG8uaW5saW5lTWV0aG9kcyA9IGtleXMocHJvdG8uaW5saW5lVG9rZW5pemVycyk7XG5cbi8qIFRva2VuaXplcnMuICovXG5wcm90by50b2tlbml6ZUJsb2NrID0gdG9rZW5pemVyKCdibG9jaycpO1xucHJvdG8udG9rZW5pemVJbmxpbmUgPSB0b2tlbml6ZXIoJ2lubGluZScpO1xucHJvdG8udG9rZW5pemVGYWN0b3J5ID0gdG9rZW5pemVyO1xuXG4vKiBHZXQgYWxsIGtleXMgaW4gYHZhbHVlYC4gKi9cbmZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuXG4gIGZvciAoa2V5IGluIHZhbHVlKSB7XG4gICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgZXNjYXBlcyA9IHJlcXVpcmUoJ21hcmtkb3duLWVzY2FwZXMnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRPcHRpb25zO1xuXG5mdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY3VycmVudCA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGtleTtcbiAgdmFyIHZhbHVlO1xuXG4gIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHh0ZW5kKG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZhbHVlIGAnICsgb3B0aW9ucyArICdgICcgK1xuICAgICAgJ2ZvciBzZXR0aW5nIGBvcHRpb25zYCdcbiAgICApO1xuICB9XG5cbiAgZm9yIChrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTtcblxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAoa2V5ICE9PSAnYmxvY2tzJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgfHxcbiAgICAgIChrZXkgPT09ICdibG9ja3MnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgYCcgKyB2YWx1ZSArICdgIGZvciBzZXR0aW5nIGBvcHRpb25zLicgKyBrZXkgKyAnYCcpO1xuICAgIH1cblxuICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgc2VsZi5vcHRpb25zID0gb3B0aW9ucztcbiAgc2VsZi5lc2NhcGUgPSBlc2NhcGVzKG9wdGlvbnMpO1xuXG4gIHJldHVybiBzZWxmO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgZGVjb2RlID0gcmVxdWlyZSgncGFyc2UtZW50aXRpZXMnKTtcbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvdGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b0xpbms7XG5hdXRvTGluay5sb2NhdG9yID0gbG9jYXRlO1xuYXV0b0xpbmsubm90SW5MaW5rID0gdHJ1ZTtcblxudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcbnZhciBDX0FUX1NJR04gPSAnQCc7XG52YXIgQ19TTEFTSCA9ICcvJztcbnZhciBNQUlMVE8gPSAnbWFpbHRvOic7XG52YXIgTUFJTFRPX0xFTkdUSCA9IE1BSUxUTy5sZW5ndGg7XG5cbi8qIFRva2VuaXNlIGEgbGluay4gKi9cbmZ1bmN0aW9uIGF1dG9MaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZjtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgaW5kZXg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGhhc0F0Q2hhcmFjdGVyO1xuICB2YXIgbGluaztcbiAgdmFyIG5vdztcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciB0b2tlbml6ZTtcbiAgdmFyIGV4aXQ7XG5cbiAgaWYgKHZhbHVlLmNoYXJBdCgwKSAhPT0gQ19MVCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNlbGYgPSB0aGlzO1xuICBzdWJ2YWx1ZSA9ICcnO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIGluZGV4ID0gMDtcbiAgcXVldWUgPSAnJztcbiAgaGFzQXRDaGFyYWN0ZXIgPSBmYWxzZTtcbiAgbGluayA9ICcnO1xuXG4gIGluZGV4Kys7XG4gIHN1YnZhbHVlID0gQ19MVDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKFxuICAgICAgd2hpdGVzcGFjZShjaGFyYWN0ZXIpIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09IENfR1QgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19BVF9TSUdOIHx8XG4gICAgICAoY2hhcmFjdGVyID09PSAnOicgJiYgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfU0xBU0gpXG4gICAgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmICghcXVldWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5rICs9IHF1ZXVlO1xuICBxdWV1ZSA9ICcnO1xuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gIGxpbmsgKz0gY2hhcmFjdGVyO1xuICBpbmRleCsrO1xuXG4gIGlmIChjaGFyYWN0ZXIgPT09IENfQVRfU0lHTikge1xuICAgIGhhc0F0Q2hhcmFjdGVyID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgIT09ICc6JyB8fFxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgIT09IENfU0xBU0hcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsaW5rICs9IENfU0xBU0g7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpIHx8IGNoYXJhY3RlciA9PT0gQ19HVCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmICghcXVldWUgfHwgY2hhcmFjdGVyICE9PSBDX0dUKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsaW5rICs9IHF1ZXVlO1xuICBjb250ZW50ID0gbGluaztcbiAgc3VidmFsdWUgKz0gbGluayArIGNoYXJhY3RlcjtcbiAgbm93ID0gZWF0Lm5vdygpO1xuICBub3cuY29sdW1uKys7XG4gIG5vdy5vZmZzZXQrKztcblxuICBpZiAoaGFzQXRDaGFyYWN0ZXIpIHtcbiAgICBpZiAobGluay5zbGljZSgwLCBNQUlMVE9fTEVOR1RIKS50b0xvd2VyQ2FzZSgpID09PSBNQUlMVE8pIHtcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cihNQUlMVE9fTEVOR1RIKTtcbiAgICAgIG5vdy5jb2x1bW4gKz0gTUFJTFRPX0xFTkdUSDtcbiAgICAgIG5vdy5vZmZzZXQgKz0gTUFJTFRPX0xFTkdUSDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluayA9IE1BSUxUTyArIGxpbms7XG4gICAgfVxuICB9XG5cbiAgLyogVGVtcG9yYXJpbHkgcmVtb3ZlIHN1cHBvcnQgZm9yIGVzY2FwZXMgaW4gYXV0b2xpbmtzLiAqL1xuICB0b2tlbml6ZSA9IHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGU7XG4gIHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGUgPSBudWxsO1xuICBleGl0ID0gc2VsZi5lbnRlckxpbmsoKTtcblxuICBjb250ZW50ID0gc2VsZi50b2tlbml6ZUlubGluZShjb250ZW50LCBub3cpO1xuXG4gIHNlbGYuaW5saW5lVG9rZW5pemVycy5lc2NhcGUgPSB0b2tlbml6ZTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBlYXQoc3VidmFsdWUpKHtcbiAgICB0eXBlOiAnbGluaycsXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdXJsOiBkZWNvZGUobGluayksXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0cmltID0gcmVxdWlyZSgndHJpbScpO1xudmFyIGludGVycnVwdCA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJydXB0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmxvY2txdW90ZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0dUID0gJz4nO1xuXG4vKiBUb2tlbmlzZSBhIGJsb2NrcXVvdGUuICovXG5mdW5jdGlvbiBibG9ja3F1b3RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvZmZzZXRzID0gc2VsZi5vZmZzZXQ7XG4gIHZhciB0b2tlbml6ZXJzID0gc2VsZi5ibG9ja1Rva2VuaXplcnM7XG4gIHZhciBpbnRlcnJ1cHRvcnMgPSBzZWxmLmludGVycnVwdEJsb2NrcXVvdGU7XG4gIHZhciBub3cgPSBlYXQubm93KCk7XG4gIHZhciBjdXJyZW50TGluZSA9IG5vdy5saW5lO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgdmFsdWVzID0gW107XG4gIHZhciBjb250ZW50cyA9IFtdO1xuICB2YXIgaW5kZW50cyA9IFtdO1xuICB2YXIgYWRkO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgcmVzdDtcbiAgdmFyIG5leHRJbmRleDtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBsaW5lO1xuICB2YXIgc3RhcnRJbmRleDtcbiAgdmFyIHByZWZpeGVkO1xuICB2YXIgZXhpdDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJiBjaGFyYWN0ZXIgIT09IENfVEFCKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfR1QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgbmV4dEluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4KTtcbiAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgcHJlZml4ZWQgPSBmYWxzZTtcblxuICAgIGlmIChuZXh0SW5kZXggPT09IC0xKSB7XG4gICAgICBuZXh0SW5kZXggPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgPT09IENfR1QpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBwcmVmaXhlZCA9IHRydWU7XG5cbiAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX1NQQUNFKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB9XG5cbiAgICBjb250ZW50ID0gdmFsdWUuc2xpY2UoaW5kZXgsIG5leHRJbmRleCk7XG5cbiAgICBpZiAoIXByZWZpeGVkICYmICF0cmltKGNvbnRlbnQpKSB7XG4gICAgICBpbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIXByZWZpeGVkKSB7XG4gICAgICByZXN0ID0gdmFsdWUuc2xpY2UoaW5kZXgpO1xuXG4gICAgICAvKiBDaGVjayBpZiB0aGUgZm9sbG93aW5nIGNvZGUgY29udGFpbnMgYSBwb3NzaWJsZVxuICAgICAgICogYmxvY2suICovXG4gICAgICBpZiAoaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgc2VsZiwgW2VhdCwgcmVzdCwgdHJ1ZV0pKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxpbmUgPSBzdGFydEluZGV4ID09PSBpbmRleCA/IGNvbnRlbnQgOiB2YWx1ZS5zbGljZShzdGFydEluZGV4LCBuZXh0SW5kZXgpO1xuXG4gICAgaW5kZW50cy5wdXNoKGluZGV4IC0gc3RhcnRJbmRleCk7XG4gICAgdmFsdWVzLnB1c2gobGluZSk7XG4gICAgY29udGVudHMucHVzaChjb250ZW50KTtcblxuICAgIGluZGV4ID0gbmV4dEluZGV4ICsgMTtcbiAgfVxuXG4gIGluZGV4ID0gLTE7XG4gIGxlbmd0aCA9IGluZGVudHMubGVuZ3RoO1xuICBhZGQgPSBlYXQodmFsdWVzLmpvaW4oQ19ORVdMSU5FKSk7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBvZmZzZXRzW2N1cnJlbnRMaW5lXSA9IChvZmZzZXRzW2N1cnJlbnRMaW5lXSB8fCAwKSArIGluZGVudHNbaW5kZXhdO1xuICAgIGN1cnJlbnRMaW5lKys7XG4gIH1cblxuICBleGl0ID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGNvbnRlbnRzID0gc2VsZi50b2tlbml6ZUJsb2NrKGNvbnRlbnRzLmpvaW4oQ19ORVdMSU5FKSwgbm93KTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBhZGQoe1xuICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICBjaGlsZHJlbjogY29udGVudHNcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvYnJlYWsnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBoYXJkQnJlYWs7XG5oYXJkQnJlYWsubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIE1JTl9CUkVBS19MRU5HVEggPSAyO1xuXG5mdW5jdGlvbiBoYXJkQnJlYWsoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgcXVldWUgPSAnJztcbiAgdmFyIGNoYXJhY3RlcjtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgaWYgKGluZGV4IDwgTUlOX0JSRUFLX0xFTkdUSCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcblxuICAgICAgcmV0dXJuIGVhdChxdWV1ZSkoe3R5cGU6ICdicmVhayd9KTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSAnICcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltLXRyYWlsaW5nLWxpbmVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmVuY2VkQ29kZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX1RJTERFID0gJ34nO1xudmFyIENfVElDSyA9ICdgJztcblxudmFyIE1JTl9GRU5DRV9DT1VOVCA9IDM7XG52YXIgQ09ERV9JTkRFTlRfQ09VTlQgPSA0O1xuXG5mdW5jdGlvbiBmZW5jZWRDb2RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCArIDE7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgZmVuY2VDb3VudDtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGZsYWc7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBleGRlbnRlZENvbnRlbnQ7XG4gIHZhciBjbG9zaW5nO1xuICB2YXIgZXhkZW50ZWRDbG9zaW5nO1xuICB2YXIgaW5kZW50O1xuICB2YXIgbm93O1xuXG4gIGlmICghc2V0dGluZ3MuZ2ZtKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogRWF0IGluaXRpYWwgc3BhY2luZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpbmRlbnQgPSBpbmRleDtcblxuICAvKiBFYXQgdGhlIGZlbmNlLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmIChjaGFyYWN0ZXIgIT09IENfVElMREUgJiYgY2hhcmFjdGVyICE9PSBDX1RJQ0spIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbmRleCsrO1xuICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIGZlbmNlQ291bnQgPSAxO1xuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGZlbmNlQ291bnQrKztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKGZlbmNlQ291bnQgPCBNSU5fRkVOQ0VfQ09VTlQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBFYXQgc3BhY2luZyBiZWZvcmUgZmxhZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICAvKiBFYXQgZmxhZy4gKi9cbiAgZmxhZyA9ICcnO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgPT09IENfTkVXTElORSB8fFxuICAgICAgY2hhcmFjdGVyID09PSBDX1RJTERFIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09IENfVElDS1xuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSB8fCBjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsYWcgKz0gcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIGlmIChjaGFyYWN0ZXIgJiYgY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gc3VidmFsdWUubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IHN1YnZhbHVlLmxlbmd0aDtcblxuICBzdWJ2YWx1ZSArPSBmbGFnO1xuICBmbGFnID0gc2VsZi5kZWNvZGUucmF3KHNlbGYudW5lc2NhcGUoZmxhZyksIG5vdyk7XG5cbiAgaWYgKHF1ZXVlKSB7XG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gIH1cblxuICBxdWV1ZSA9ICcnO1xuICBjbG9zaW5nID0gJyc7XG4gIGV4ZGVudGVkQ2xvc2luZyA9ICcnO1xuICBjb250ZW50ID0gJyc7XG4gIGV4ZGVudGVkQ29udGVudCA9ICcnO1xuXG4gIC8qIEVhdCBjb250ZW50LiAqL1xuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIGNvbnRlbnQgKz0gY2xvc2luZztcbiAgICBleGRlbnRlZENvbnRlbnQgKz0gZXhkZW50ZWRDbG9zaW5nO1xuICAgIGNsb3NpbmcgPSAnJztcbiAgICBleGRlbnRlZENsb3NpbmcgPSAnJztcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfTkVXTElORSkge1xuICAgICAgY29udGVudCArPSBjaGFyYWN0ZXI7XG4gICAgICBleGRlbnRlZENsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIEFkZCB0aGUgbmV3bGluZSB0byBgc3VidmFsdWVgIGlmIGl0cyB0aGUgZmlyc3RcbiAgICAgKiBjaGFyYWN0ZXIuICBPdGhlcndpc2UsIGFkZCBpdCB0byB0aGUgYGNsb3NpbmdgXG4gICAgICogcXVldWUuICovXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGNsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgZXhkZW50ZWRDbG9zaW5nICs9IGNoYXJhY3RlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIHF1ZXVlID0gJyc7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBjbG9zaW5nICs9IHF1ZXVlO1xuICAgIGV4ZGVudGVkQ2xvc2luZyArPSBxdWV1ZS5zbGljZShpbmRlbnQpO1xuXG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBDT0RFX0lOREVOVF9DT1VOVCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcXVldWUgPSAnJztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNsb3NpbmcgKz0gcXVldWU7XG4gICAgZXhkZW50ZWRDbG9zaW5nICs9IHF1ZXVlO1xuXG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA8IGZlbmNlQ291bnQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHF1ZXVlID0gJyc7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2xvc2luZyArPSBjaGFyYWN0ZXI7XG4gICAgICBleGRlbnRlZENsb3NpbmcgKz0gY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc3VidmFsdWUgKz0gY29udGVudCArIGNsb3Npbmc7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdjb2RlJyxcbiAgICBsYW5nOiBmbGFnIHx8IG51bGwsXG4gICAgdmFsdWU6IHRyaW0oZXhkZW50ZWRDb250ZW50KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbnZhciB0cmltID0gcmVxdWlyZSgndHJpbS10cmFpbGluZy1saW5lcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluZGVudGVkQ29kZTtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcblxudmFyIENPREVfSU5ERU5UX0NPVU5UID0gNDtcbnZhciBDT0RFX0lOREVOVCA9IHJlcGVhdChDX1NQQUNFLCBDT0RFX0lOREVOVF9DT1VOVCk7XG5cbi8qIFRva2VuaXNlIGluZGVudGVkIGNvZGUuICovXG5mdW5jdGlvbiBpbmRlbnRlZENvZGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGNvbnRlbnQgPSAnJztcbiAgdmFyIHN1YnZhbHVlUXVldWUgPSAnJztcbiAgdmFyIGNvbnRlbnRRdWV1ZSA9ICcnO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgYmxhbmtRdWV1ZTtcbiAgdmFyIGluZGVudDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoaW5kZW50KSB7XG4gICAgICBpbmRlbnQgPSBmYWxzZTtcblxuICAgICAgc3VidmFsdWUgKz0gc3VidmFsdWVRdWV1ZTtcbiAgICAgIGNvbnRlbnQgKz0gY29udGVudFF1ZXVlO1xuICAgICAgc3VidmFsdWVRdWV1ZSA9ICcnO1xuICAgICAgY29udGVudFF1ZXVlID0gJyc7XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgICBzdWJ2YWx1ZVF1ZXVlID0gY2hhcmFjdGVyO1xuICAgICAgICBjb250ZW50UXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICAgIGlmICghY2hhcmFjdGVyIHx8IGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICAgICAgICBjb250ZW50UXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBzdWJ2YWx1ZVF1ZXVlID0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgIGNvbnRlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19TUEFDRSAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IGNoYXJhY3RlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMikgPT09IGNoYXJhY3RlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMykgPT09IGNoYXJhY3RlclxuICAgICkge1xuICAgICAgc3VidmFsdWVRdWV1ZSArPSBDT0RFX0lOREVOVDtcbiAgICAgIGluZGV4ICs9IDM7XG4gICAgICBpbmRlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgc3VidmFsdWVRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRlbnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBibGFua1F1ZXVlID0gJyc7XG5cbiAgICAgIHdoaWxlIChjaGFyYWN0ZXIgPT09IENfVEFCIHx8IGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICBibGFua1F1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN1YnZhbHVlUXVldWUgKz0gYmxhbmtRdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgIGNvbnRlbnRRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRlbnQpIHtcbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgICB0eXBlOiAnY29kZScsXG4gICAgICBsYW5nOiBudWxsLFxuICAgICAgdmFsdWU6IHRyaW0oY29udGVudClcbiAgICB9KTtcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2NvZGUtaW5saW5lJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5saW5lQ29kZTtcbmlubGluZUNvZGUubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIENfVElDSyA9ICdgJztcblxuLyogVG9rZW5pc2UgaW5saW5lIGNvZGUuICovXG5mdW5jdGlvbiBpbmxpbmVDb2RlKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcXVldWUgPSAnJztcbiAgdmFyIHRpY2tRdWV1ZSA9ICcnO1xuICB2YXIgY29udGVudFF1ZXVlO1xuICB2YXIgc3VicXVldWU7XG4gIHZhciBjb3VudDtcbiAgdmFyIG9wZW5pbmdDb3VudDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgZm91bmQ7XG4gIHZhciBuZXh0O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1RJQ0spIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IENfVElDSztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gcXVldWU7XG4gIG9wZW5pbmdDb3VudCA9IGluZGV4O1xuICBxdWV1ZSA9ICcnO1xuICBuZXh0ID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgY291bnQgPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IG5leHQ7XG4gICAgbmV4dCA9IHZhbHVlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19USUNLKSB7XG4gICAgICBjb3VudCsrO1xuICAgICAgdGlja1F1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSAwO1xuICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIH1cblxuICAgIGlmIChjb3VudCAmJiBuZXh0ICE9PSBDX1RJQ0spIHtcbiAgICAgIGlmIChjb3VudCA9PT0gb3BlbmluZ0NvdW50KSB7XG4gICAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgdGlja1F1ZXVlO1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSB0aWNrUXVldWU7XG4gICAgICB0aWNrUXVldWUgPSAnJztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIGlmIChvcGVuaW5nQ291bnQgJSAyICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVldWUgPSAnJztcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29udGVudFF1ZXVlID0gJyc7XG4gIHN1YnF1ZXVlID0gJyc7XG4gIGxlbmd0aCA9IHF1ZXVlLmxlbmd0aDtcbiAgaW5kZXggPSAtMTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHF1ZXVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3VicXVldWUpIHtcbiAgICAgIGlmIChjb250ZW50UXVldWUpIHtcbiAgICAgICAgY29udGVudFF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgfVxuXG4gICAgICBzdWJxdWV1ZSA9ICcnO1xuICAgIH1cblxuICAgIGNvbnRlbnRRdWV1ZSArPSBjaGFyYWN0ZXI7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgdHlwZTogJ2lubGluZUNvZGUnLFxuICAgIHZhbHVlOiBjb250ZW50UXVldWVcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb247XG5kZWZpbml0aW9uLm5vdEluTGlzdCA9IHRydWU7XG5kZWZpbml0aW9uLm5vdEluQmxvY2sgPSB0cnVlO1xuXG52YXIgQ19ET1VCTEVfUVVPVEUgPSAnXCInO1xudmFyIENfU0lOR0xFX1FVT1RFID0gJ1xcJyc7XG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfQlJBQ0tFVF9PUEVOID0gJ1snO1xudmFyIENfQlJBQ0tFVF9DTE9TRSA9ICddJztcbnZhciBDX1BBUkVOX09QRU4gPSAnKCc7XG52YXIgQ19QQVJFTl9DTE9TRSA9ICcpJztcbnZhciBDX0NPTE9OID0gJzonO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcblxuZnVuY3Rpb24gZGVmaW5pdGlvbihlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY29tbW9ubWFyayA9IHNlbGYub3B0aW9ucy5jb21tb25tYXJrO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGJlZm9yZVVSTDtcbiAgdmFyIGJlZm9yZVRpdGxlO1xuICB2YXIgcXVldWU7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciB0ZXN0O1xuICB2YXIgaWRlbnRpZmllcjtcbiAgdmFyIHVybDtcbiAgdmFyIHRpdGxlO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmIGNoYXJhY3RlciAhPT0gQ19UQUIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX0JSQUNLRVRfT1BFTikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluZGV4Kys7XG4gIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgICFxdWV1ZSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX0NPTE9OXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlkZW50aWZpZXIgPSBxdWV1ZTtcbiAgc3VidmFsdWUgKz0gcXVldWUgKyBDX0JSQUNLRVRfQ0xPU0UgKyBDX0NPTE9OO1xuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKFxuICAgICAgY2hhcmFjdGVyICE9PSBDX1RBQiAmJlxuICAgICAgY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfTkVXTElORVxuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBxdWV1ZSA9ICcnO1xuICBiZWZvcmVVUkwgPSBzdWJ2YWx1ZTtcblxuICBpZiAoY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKCFpc0VuY2xvc2VkVVJMQ2hhcmFjdGVyKGNoYXJhY3RlcikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IGlzRW5jbG9zZWRVUkxDaGFyYWN0ZXIuZGVsaW1pdGVyKSB7XG4gICAgICBzdWJ2YWx1ZSArPSBDX0xUICsgcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGluZGV4IC09IHF1ZXVlLmxlbmd0aCArIDE7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcXVldWUpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmICghaXNVbmNsb3NlZFVSTENoYXJhY3RlcihjaGFyYWN0ZXIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHVybCA9IHF1ZXVlO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiZcbiAgICAgIGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FXG4gICAgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gIHRlc3QgPSBudWxsO1xuXG4gIGlmIChjaGFyYWN0ZXIgPT09IENfRE9VQkxFX1FVT1RFKSB7XG4gICAgdGVzdCA9IENfRE9VQkxFX1FVT1RFO1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TSU5HTEVfUVVPVEUpIHtcbiAgICB0ZXN0ID0gQ19TSU5HTEVfUVVPVEU7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4pIHtcbiAgICB0ZXN0ID0gQ19QQVJFTl9DTE9TRTtcbiAgfVxuXG4gIGlmICghdGVzdCkge1xuICAgIHF1ZXVlID0gJyc7XG4gICAgaW5kZXggPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIH0gZWxzZSBpZiAocXVldWUpIHtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICBxdWV1ZSA9ICcnO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSB0ZXN0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX05FV0xJTkUgfHwgY2hhcmFjdGVyID09PSB0ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gQ19ORVdMSU5FO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSB0ZXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYmVmb3JlVGl0bGUgPSBzdWJ2YWx1ZTtcbiAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICAgIHRpdGxlID0gcXVldWU7XG4gICAgcXVldWUgPSAnJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19UQUIgJiYgY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgaWYgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpIHtcbiAgICBpZiAoc2lsZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBiZWZvcmVVUkwgPSBlYXQoYmVmb3JlVVJMKS50ZXN0KCkuZW5kO1xuICAgIHVybCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKHVybCksIGJlZm9yZVVSTCk7XG5cbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgICAgdGl0bGUgPSBzZWxmLmRlY29kZS5yYXcoc2VsZi51bmVzY2FwZSh0aXRsZSksIGJlZm9yZVRpdGxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7XG4gICAgICB0eXBlOiAnZGVmaW5pdGlvbicsXG4gICAgICBpZGVudGlmaWVyOiBub3JtYWxpemUoaWRlbnRpZmllciksXG4gICAgICB0aXRsZTogdGl0bGUgfHwgbnVsbCxcbiAgICAgIHVybDogdXJsXG4gICAgfSk7XG4gIH1cbn1cblxuLyogQ2hlY2sgaWYgYGNoYXJhY3RlcmAgY2FuIGJlIGluc2lkZSBhbiBlbmNsb3NlZCBVUkkuICovXG5mdW5jdGlvbiBpc0VuY2xvc2VkVVJMQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICByZXR1cm4gY2hhcmFjdGVyICE9PSBDX0dUICYmXG4gICAgY2hhcmFjdGVyICE9PSBDX0JSQUNLRVRfT1BFTiAmJlxuICAgIGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFO1xufVxuXG5pc0VuY2xvc2VkVVJMQ2hhcmFjdGVyLmRlbGltaXRlciA9IENfR1Q7XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGNhbiBiZSBpbnNpZGUgYW4gdW5jbG9zZWQgVVJJLiAqL1xuZnVuY3Rpb24gaXNVbmNsb3NlZFVSTENoYXJhY3RlcihjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX09QRU4gJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9DTE9TRSAmJlxuICAgICF3aGl0ZXNwYWNlKGNoYXJhY3Rlcik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcbnZhciBsb2NhdGUgPSByZXF1aXJlKCcuLi9sb2NhdGUvZGVsZXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWtldGhyb3VnaDtcbnN0cmlrZXRocm91Z2gubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIENfVElMREUgPSAnfic7XG52YXIgRE9VQkxFID0gJ35+JztcblxuZnVuY3Rpb24gc3RyaWtldGhyb3VnaChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgY2hhcmFjdGVyID0gJyc7XG4gIHZhciBwcmV2aW91cyA9ICcnO1xuICB2YXIgcHJlY2VkaW5nID0gJyc7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgaW5kZXg7XG4gIHZhciBsZW5ndGg7XG4gIHZhciBub3c7XG5cbiAgaWYgKFxuICAgICFzZWxmLm9wdGlvbnMuZ2ZtIHx8XG4gICAgdmFsdWUuY2hhckF0KDApICE9PSBDX1RJTERFIHx8XG4gICAgdmFsdWUuY2hhckF0KDEpICE9PSBDX1RJTERFIHx8XG4gICAgd2hpdGVzcGFjZSh2YWx1ZS5jaGFyQXQoMikpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluZGV4ID0gMTtcbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gMjtcbiAgbm93Lm9mZnNldCArPSAyO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gQ19USUxERSAmJlxuICAgICAgcHJldmlvdXMgPT09IENfVElMREUgJiZcbiAgICAgICghcHJlY2VkaW5nIHx8ICF3aGl0ZXNwYWNlKHByZWNlZGluZykpXG4gICAgKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZWF0KERPVUJMRSArIHN1YnZhbHVlICsgRE9VQkxFKSh7XG4gICAgICAgIHR5cGU6ICdkZWxldGUnLFxuICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShzdWJ2YWx1ZSwgbm93KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcHJldmlvdXM7XG4gICAgcHJlY2VkaW5nID0gcHJldmlvdXM7XG4gICAgcHJldmlvdXMgPSBjaGFyYWN0ZXI7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgd29yZCA9IHJlcXVpcmUoJ2lzLXdvcmQtY2hhcmFjdGVyJyk7XG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2VtcGhhc2lzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZW1waGFzaXM7XG5lbXBoYXNpcy5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG5cbmZ1bmN0aW9uIGVtcGhhc2lzKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICB2YXIgbm93O1xuICB2YXIgcGVkYW50aWM7XG4gIHZhciBtYXJrZXI7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgcHJldjtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX0FTVEVSSVNLICYmIGNoYXJhY3RlciAhPT0gQ19VTkRFUlNDT1JFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgaW5kZXgrKztcbiAgcXVldWUgPSAnJztcbiAgY2hhcmFjdGVyID0gJyc7XG5cbiAgaWYgKHBlZGFudGljICYmIHdoaXRlc3BhY2UodmFsdWUuY2hhckF0KGluZGV4KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcmV2ID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBtYXJrZXIgJiYgKCFwZWRhbnRpYyB8fCAhd2hpdGVzcGFjZShwcmV2KSkpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIGlmICghdHJpbShxdWV1ZSkgfHwgcHJldiA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwZWRhbnRpYyAmJiBtYXJrZXIgPT09IENfVU5ERVJTQ09SRSAmJiB3b3JkKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICBxdWV1ZSArPSBtYXJrZXI7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vdyA9IGVhdC5ub3coKTtcbiAgICAgICAgbm93LmNvbHVtbisrO1xuICAgICAgICBub3cub2Zmc2V0Kys7XG5cbiAgICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSArIHF1ZXVlICsgbWFya2VyKSh7XG4gICAgICAgICAgdHlwZTogJ2VtcGhhc2lzJyxcbiAgICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShxdWV1ZSwgbm93KVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gbWFya2VyO1xuICAgIH1cblxuICAgIGlmICghcGVkYW50aWMgJiYgY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2VzY2FwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZTtcbmVzY2FwZS5sb2NhdG9yID0gbG9jYXRlO1xuXG5mdW5jdGlvbiBlc2NhcGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIG5vZGU7XG5cbiAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PT0gJ1xcXFwnKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KDEpO1xuXG4gICAgaWYgKHNlbGYuZXNjYXBlLmluZGV4T2YoY2hhcmFjdGVyKSAhPT0gLTEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXG4nKSB7XG4gICAgICAgIG5vZGUgPSB7dHlwZTogJ2JyZWFrJ307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0ge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB2YWx1ZTogY2hhcmFjdGVyXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlYXQoJ1xcXFwnICsgY2hhcmFjdGVyKShub2RlKTtcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJy4uL3V0aWwvbm9ybWFsaXplJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9vdG5vdGVEZWZpbml0aW9uO1xuZm9vdG5vdGVEZWZpbml0aW9uLm5vdEluTGlzdCA9IHRydWU7XG5mb290bm90ZURlZmluaXRpb24ubm90SW5CbG9jayA9IHRydWU7XG5cbnZhciBDX0JBQ0tTTEFTSCA9ICdcXFxcJztcbnZhciBDX05FV0xJTkUgPSAnXFxuJztcbnZhciBDX1RBQiA9ICdcXHQnO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfQ0FSRVQgPSAnXic7XG52YXIgQ19DT0xPTiA9ICc6JztcblxudmFyIEVYUFJFU1NJT05fSU5JVElBTF9UQUIgPSAvXiggezR9fFxcdCk/L2dtO1xuXG5mdW5jdGlvbiBmb290bm90ZURlZmluaXRpb24oZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG9mZnNldHMgPSBzZWxmLm9mZnNldDtcbiAgdmFyIGluZGV4O1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBub3c7XG4gIHZhciBjdXJyZW50TGluZTtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHN1YnF1ZXVlO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgaWRlbnRpZmllcjtcbiAgdmFyIGFkZDtcbiAgdmFyIGV4aXQ7XG5cbiAgaWYgKCFzZWxmLm9wdGlvbnMuZm9vdG5vdGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXggPSAwO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHN1YnZhbHVlID0gJyc7XG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgY3VycmVudExpbmUgPSBub3cubGluZTtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9PUEVOIHx8XG4gICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgIT09IENfQ0FSRVRcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3VidmFsdWUgKz0gQ19CUkFDS0VUX09QRU4gKyBDX0NBUkVUO1xuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgcXVldWUgPSAnJztcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKFxuICAgICFxdWV1ZSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfQlJBQ0tFVF9DTE9TRSB8fFxuICAgIHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX0NPTE9OXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlkZW50aWZpZXIgPSBub3JtYWxpemUocXVldWUpO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZSArIENfQlJBQ0tFVF9DTE9TRSArIENfQ09MT047XG4gIGluZGV4ID0gc3VidmFsdWUubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgbm93LmNvbHVtbiArPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIG5vdy5vZmZzZXQgKz0gc3VidmFsdWUubGVuZ3RoO1xuICBxdWV1ZSA9ICcnO1xuICBjb250ZW50ID0gJyc7XG4gIHN1YnF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgc3VicXVldWUgPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgcXVldWUgKz0gc3VicXVldWU7XG4gICAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdWJxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZSkge1xuICAgICAgY29udGVudCArPSBxdWV1ZTtcbiAgICAgIHF1ZXVlID0gJyc7XG4gICAgfVxuXG4gICAgY29udGVudCArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHN1YnZhbHVlICs9IGNvbnRlbnQ7XG5cbiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShFWFBSRVNTSU9OX0lOSVRJQUxfVEFCLCBmdW5jdGlvbiAobGluZSkge1xuICAgIG9mZnNldHNbY3VycmVudExpbmVdID0gKG9mZnNldHNbY3VycmVudExpbmVdIHx8IDApICsgbGluZS5sZW5ndGg7XG4gICAgY3VycmVudExpbmUrKztcblxuICAgIHJldHVybiAnJztcbiAgfSk7XG5cbiAgYWRkID0gZWF0KHN1YnZhbHVlKTtcblxuICBleGl0ID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGNvbnRlbnQgPSBzZWxmLnRva2VuaXplQmxvY2soY29udGVudCwgbm93KTtcbiAgZXhpdCgpO1xuXG4gIHJldHVybiBhZGQoe1xuICAgIHR5cGU6ICdmb290bm90ZURlZmluaXRpb24nLFxuICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gYXR4SGVhZGluZztcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0hBU0ggPSAnIyc7XG5cbnZhciBNQVhfQVRYX0NPVU5UID0gNjtcblxuZnVuY3Rpb24gYXR4SGVhZGluZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc2V0dGluZ3MgPSBzZWxmLm9wdGlvbnM7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIG5vdyA9IGVhdC5ub3coKTtcbiAgdmFyIHN1YnZhbHVlID0gJyc7XG4gIHZhciBjb250ZW50ID0gJyc7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIEVhdCBpbml0aWFsIHNwYWNpbmcuICovXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEVhdCBoYXNoZXMuICovXG4gIGRlcHRoID0gMDtcblxuICB3aGlsZSAoKytpbmRleCA8PSBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciAhPT0gQ19IQVNIKSB7XG4gICAgICBpbmRleC0tO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIGRlcHRoKys7XG4gIH1cblxuICBpZiAoZGVwdGggPiBNQVhfQVRYX0NPVU5UKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgICFkZXB0aCB8fFxuICAgICghc2V0dGluZ3MucGVkYW50aWMgJiYgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfSEFTSClcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoICsgMTtcblxuICAvKiBFYXQgaW50ZXJtZWRpYXRlIHdoaXRlLXNwYWNlLiAqL1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfU1BBQ0UgJiYgY2hhcmFjdGVyICE9PSBDX1RBQikge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEV4aXQgd2hlbiBub3QgaW4gcGVkYW50aWMgbW9kZSB3aXRob3V0IHNwYWNpbmcuICovXG4gIGlmIChcbiAgICAhc2V0dGluZ3MucGVkYW50aWMgJiZcbiAgICBxdWV1ZS5sZW5ndGggPT09IDAgJiZcbiAgICBjaGFyYWN0ZXIgJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfTkVXTElORVxuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiBFYXQgY29udGVudC4gKi9cbiAgc3VidmFsdWUgKz0gcXVldWU7XG4gIHF1ZXVlID0gJyc7XG4gIGNvbnRlbnQgPSAnJztcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIWNoYXJhY3RlciB8fCBjaGFyYWN0ZXIgPT09IENfTkVXTElORSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhcmFjdGVyICE9PSBDX1NQQUNFICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfVEFCICYmXG4gICAgICBjaGFyYWN0ZXIgIT09IENfSEFTSFxuICAgICkge1xuICAgICAgY29udGVudCArPSBxdWV1ZSArIGNoYXJhY3RlcjtcbiAgICAgIHF1ZXVlID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX0hBU0gpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2hhcmFjdGVyID09PSBDX1NQQUNFIHx8IGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBpbmRleC0tO1xuICB9XG5cbiAgbm93LmNvbHVtbiArPSBzdWJ2YWx1ZS5sZW5ndGg7XG4gIG5vdy5vZmZzZXQgKz0gc3VidmFsdWUubGVuZ3RoO1xuICBzdWJ2YWx1ZSArPSBjb250ZW50ICsgcXVldWU7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICBkZXB0aDogZGVwdGgsXG4gICAgY2hpbGRyZW46IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRleHRIZWFkaW5nO1xuXG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfRVFVQUxTID0gJz0nO1xudmFyIENfREFTSCA9ICctJztcblxudmFyIE1BWF9IRUFESU5HX0lOREVOVCA9IDM7XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgc2V0ZXh0XG4gKiBoZWFkZXJzLCBtYXBwaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZGVwdGguICovXG52YXIgU0VURVhUX01BUktFUlMgPSB7fTtcblxuU0VURVhUX01BUktFUlNbQ19FUVVBTFNdID0gMTtcblNFVEVYVF9NQVJLRVJTW0NfREFTSF0gPSAyO1xuXG5mdW5jdGlvbiBzZXRleHRIZWFkaW5nKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBub3cgPSBlYXQubm93KCk7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgc3VidmFsdWUgPSAnJztcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIEVhdCBpbml0aWFsIGluZGVudGF0aW9uLiAqL1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1NQQUNFIHx8IGluZGV4ID49IE1BWF9IRUFESU5HX0lOREVOVCkge1xuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIC8qIEVhdCBjb250ZW50LiAqL1xuICBjb250ZW50ID0gJyc7XG4gIHF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19ORVdMSU5FKSB7XG4gICAgICBpbmRleC0tO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSB8fCBjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgKz0gcXVldWUgKyBjaGFyYWN0ZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIG5vdy5jb2x1bW4gKz0gc3VidmFsdWUubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgc3VidmFsdWUgKz0gY29udGVudCArIHF1ZXVlO1xuXG4gIC8qIEVuc3VyZSB0aGUgY29udGVudCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUgYW5kIGFcbiAgICogdmFsaWQgbWFya2VyLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gIG1hcmtlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcblxuICBpZiAoY2hhcmFjdGVyICE9PSBDX05FV0xJTkUgfHwgIVNFVEVYVF9NQVJLRVJTW21hcmtlcl0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG5cbiAgLyogRWF0IFNldGV4dC1saW5lLiAqL1xuICBxdWV1ZSA9IG1hcmtlcjtcbiAgZGVwdGggPSBTRVRFWFRfTUFSS0VSU1ttYXJrZXJdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IG1hcmtlcikge1xuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaW5kZXgtLTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBlYXQoc3VidmFsdWUgKyBxdWV1ZSkoe1xuICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICBkZXB0aDogZGVwdGgsXG4gICAgY2hpbGRyZW46IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KVxuICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG9wZW5DbG9zZVRhZyA9IHJlcXVpcmUoJy4uL3V0aWwvaHRtbCcpLm9wZW5DbG9zZVRhZztcblxubW9kdWxlLmV4cG9ydHMgPSBibG9ja0hUTUw7XG5cbnZhciBDX1RBQiA9ICdcXHQnO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19MVCA9ICc8JztcblxuZnVuY3Rpb24gYmxvY2tIVE1MKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBibG9ja3MgPSBzZWxmLm9wdGlvbnMuYmxvY2tzO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbmV4dDtcbiAgdmFyIGxpbmU7XG4gIHZhciBvZmZzZXQ7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBjb3VudDtcbiAgdmFyIHNlcXVlbmNlO1xuICB2YXIgc3VidmFsdWU7XG5cbiAgdmFyIHNlcXVlbmNlcyA9IFtcbiAgICBbL148KHNjcmlwdHxwcmV8c3R5bGUpKD89KFxcc3w+fCQpKS9pLCAvPFxcLyhzY3JpcHR8cHJlfHN0eWxlKT4vaSwgdHJ1ZV0sXG4gICAgWy9ePCEtLS8sIC8tLT4vLCB0cnVlXSxcbiAgICBbL148XFw/LywgL1xcPz4vLCB0cnVlXSxcbiAgICBbL148IVtBLVphLXpdLywgLz4vLCB0cnVlXSxcbiAgICBbL148IVxcW0NEQVRBXFxbLywgL1xcXVxcXT4vLCB0cnVlXSxcbiAgICBbbmV3IFJlZ0V4cCgnXjwvPygnICsgYmxvY2tzLmpvaW4oJ3wnKSArICcpKD89KFxcXFxzfC8/PnwkKSknLCAnaScpLCAvXiQvLCB0cnVlXSxcbiAgICBbbmV3IFJlZ0V4cChvcGVuQ2xvc2VUYWcuc291cmNlICsgJ1xcXFxzKiQnKSwgL14kLywgZmFsc2VdXG4gIF07XG5cbiAgLyogRWF0IGluaXRpYWwgc3BhY2luZy4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmIChjaGFyYWN0ZXIgIT09IENfVEFCICYmIGNoYXJhY3RlciAhPT0gQ19TUEFDRSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX0xUKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbmV4dCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCArIDEpO1xuICBuZXh0ID0gbmV4dCA9PT0gLTEgPyBsZW5ndGggOiBuZXh0O1xuICBsaW5lID0gdmFsdWUuc2xpY2UoaW5kZXgsIG5leHQpO1xuICBvZmZzZXQgPSAtMTtcbiAgY291bnQgPSBzZXF1ZW5jZXMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7XG4gICAgaWYgKHNlcXVlbmNlc1tvZmZzZXRdWzBdLnRlc3QobGluZSkpIHtcbiAgICAgIHNlcXVlbmNlID0gc2VxdWVuY2VzW29mZnNldF07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiBzZXF1ZW5jZVsyXTtcbiAgfVxuXG4gIGluZGV4ID0gbmV4dDtcblxuICBpZiAoIXNlcXVlbmNlWzFdLnRlc3QobGluZSkpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIG5leHQgPSB2YWx1ZS5pbmRleE9mKENfTkVXTElORSwgaW5kZXggKyAxKTtcbiAgICAgIG5leHQgPSBuZXh0ID09PSAtMSA/IGxlbmd0aCA6IG5leHQ7XG4gICAgICBsaW5lID0gdmFsdWUuc2xpY2UoaW5kZXggKyAxLCBuZXh0KTtcblxuICAgICAgaWYgKHNlcXVlbmNlWzFdLnRlc3QobGluZSkpIHtcbiAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICBpbmRleCA9IG5leHQ7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBuZXh0O1xuICAgIH1cbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpO1xuXG4gIHJldHVybiBlYXQoc3VidmFsdWUpKHt0eXBlOiAnaHRtbCcsIHZhbHVlOiBzdWJ2YWx1ZX0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWxwaGFiZXRpY2FsID0gcmVxdWlyZSgnaXMtYWxwaGFiZXRpY2FsJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL3RhZycpO1xudmFyIHRhZyA9IHJlcXVpcmUoJy4uL3V0aWwvaHRtbCcpLnRhZztcblxubW9kdWxlLmV4cG9ydHMgPSBpbmxpbmVIVE1MO1xuaW5saW5lSFRNTC5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgRVhQUkVTU0lPTl9IVE1MX0xJTktfT1BFTiA9IC9ePGEgL2k7XG52YXIgRVhQUkVTU0lPTl9IVE1MX0xJTktfQ0xPU0UgPSAvXjxcXC9hPi9pO1xuXG5mdW5jdGlvbiBpbmxpbmVIVE1MKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBzdWJ2YWx1ZTtcblxuICBpZiAodmFsdWUuY2hhckF0KDApICE9PSAnPCcgfHwgbGVuZ3RoIDwgMykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgxKTtcblxuICBpZiAoXG4gICAgIWFscGhhYmV0aWNhbChjaGFyYWN0ZXIpICYmXG4gICAgY2hhcmFjdGVyICE9PSAnPycgJiZcbiAgICBjaGFyYWN0ZXIgIT09ICchJyAmJlxuICAgIGNoYXJhY3RlciAhPT0gJy8nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUubWF0Y2godGFnKTtcblxuICBpZiAoIXN1YnZhbHVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbm90IHVzZWQgeWV0LiAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHN1YnZhbHVlWzBdO1xuXG4gIGlmICghc2VsZi5pbkxpbmsgJiYgRVhQUkVTU0lPTl9IVE1MX0xJTktfT1BFTi50ZXN0KHN1YnZhbHVlKSkge1xuICAgIHNlbGYuaW5MaW5rID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChzZWxmLmluTGluayAmJiBFWFBSRVNTSU9OX0hUTUxfTElOS19DTE9TRS50ZXN0KHN1YnZhbHVlKSkge1xuICAgIHNlbGYuaW5MaW5rID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKSh7dHlwZTogJ2h0bWwnLCB2YWx1ZTogc3VidmFsdWV9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIGxvY2F0ZSA9IHJlcXVpcmUoJy4uL2xvY2F0ZS9saW5rJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbGluaztcbmxpbmsubG9jYXRvciA9IGxvY2F0ZTtcblxudmFyIG93biA9IHt9Lmhhc093blByb3BlcnR5O1xuXG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfUEFSRU5fT1BFTiA9ICcoJztcbnZhciBDX1BBUkVOX0NMT1NFID0gJyknO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19HVCA9ICc+JztcbnZhciBDX1RJQ0sgPSAnYCc7XG52YXIgQ19ET1VCTEVfUVVPVEUgPSAnXCInO1xudmFyIENfU0lOR0xFX1FVT1RFID0gJ1xcJyc7XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzLCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrIGxpbmtcbiAqIGFuZCBpbWFnZSB0aXRsZXMuICovXG52YXIgTElOS19NQVJLRVJTID0ge307XG5cbkxJTktfTUFSS0VSU1tDX0RPVUJMRV9RVU9URV0gPSBDX0RPVUJMRV9RVU9URTtcbkxJTktfTUFSS0VSU1tDX1NJTkdMRV9RVU9URV0gPSBDX1NJTkdMRV9RVU9URTtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmsgbGlua1xuICogYW5kIGltYWdlIHRpdGxlcyBpbiBjb21tb25tYXJrLW1vZGUuICovXG52YXIgQ09NTU9OTUFSS19MSU5LX01BUktFUlMgPSB7fTtcblxuQ09NTU9OTUFSS19MSU5LX01BUktFUlNbQ19ET1VCTEVfUVVPVEVdID0gQ19ET1VCTEVfUVVPVEU7XG5DT01NT05NQVJLX0xJTktfTUFSS0VSU1tDX1NJTkdMRV9RVU9URV0gPSBDX1NJTkdMRV9RVU9URTtcbkNPTU1PTk1BUktfTElOS19NQVJLRVJTW0NfUEFSRU5fT1BFTl0gPSBDX1BBUkVOX0NMT1NFO1xuXG5mdW5jdGlvbiBsaW5rKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KDApO1xuICB2YXIgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIHZhciBjb21tb25tYXJrID0gc2VsZi5vcHRpb25zLmNvbW1vbm1hcms7XG4gIHZhciBnZm0gPSBzZWxmLm9wdGlvbnMuZ2ZtO1xuICB2YXIgY2xvc2VkO1xuICB2YXIgY291bnQ7XG4gIHZhciBvcGVuaW5nO1xuICB2YXIgYmVmb3JlVVJMO1xuICB2YXIgYmVmb3JlVGl0bGU7XG4gIHZhciBzdWJxdWV1ZTtcbiAgdmFyIGhhc01hcmtlcjtcbiAgdmFyIG1hcmtlcnM7XG4gIHZhciBpc0ltYWdlO1xuICB2YXIgY29udGVudDtcbiAgdmFyIG1hcmtlcjtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHRpdGxlO1xuICB2YXIgZGVwdGg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHVybDtcbiAgdmFyIG5vdztcbiAgdmFyIGV4aXQ7XG4gIHZhciBub2RlO1xuXG4gIC8qIERldGVjdCB3aGV0aGVyIHRoaXMgaXMgYW4gaW1hZ2UuICovXG4gIGlmIChjaGFyYWN0ZXIgPT09ICchJykge1xuICAgIGlzSW1hZ2UgPSB0cnVlO1xuICAgIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgfVxuXG4gIC8qIEVhdCB0aGUgb3BlbmluZy4gKi9cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX09QRU4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBFeGl0IHdoZW4gdGhpcyBpcyBhIGxpbmsgYW5kIHdl4oCZcmUgYWxyZWFkeSBpbnNpZGVcbiAgICogYSBsaW5rLiAqL1xuICBpZiAoIWlzSW1hZ2UgJiYgc2VsZi5pbkxpbmspIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gIHF1ZXVlID0gJyc7XG4gIGluZGV4Kys7XG5cbiAgLyogRWF0IHRoZSBjb250ZW50LiAqL1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgZGVwdGggPSAwO1xuXG4gIG5vdy5jb2x1bW4gKz0gaW5kZXg7XG4gIG5vdy5vZmZzZXQgKz0gaW5kZXg7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICBzdWJxdWV1ZSA9IGNoYXJhY3RlcjtcblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgLyogSW5saW5lLWNvZGUgaW4gbGluayBjb250ZW50LiAqL1xuICAgICAgY291bnQgPSAxO1xuXG4gICAgICB3aGlsZSAodmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IENfVElDSykge1xuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3BlbmluZykge1xuICAgICAgICBvcGVuaW5nID0gY291bnQ7XG4gICAgICB9IGVsc2UgaWYgKGNvdW50ID49IG9wZW5pbmcpIHtcbiAgICAgICAgb3BlbmluZyA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAvKiBBbGxvdyBicmFja2V0cyB0byBiZSBlc2NhcGVkLiAqL1xuICAgICAgaW5kZXgrKztcbiAgICAgIHN1YnF1ZXVlICs9IHZhbHVlLmNoYXJBdChpbmRleCk7XG4gICAgLyogSW4gR0ZNIG1vZGUsIGJyYWNrZXRzIGluIGNvZGUgc3RpbGwgY291bnQuXG4gICAgICogSW4gYWxsIG90aGVyIG1vZGVzLCB0aGV5IGRvbuKAmXQuICBUaGlzIGVtcHR5XG4gICAgICogYmxvY2sgcHJldmVudHMgdGhlIG5leHQgc3RhdGVtZW50cyBhcmVcbiAgICAgKiBlbnRlcmVkLiAqL1xuICAgIH0gZWxzZSBpZiAoKCFvcGVuaW5nIHx8IGdmbSkgJiYgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgZGVwdGgrKztcbiAgICB9IGVsc2UgaWYgKCghb3BlbmluZyB8fCBnZm0pICYmIGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgICBpZiAoZGVwdGgpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEFsbG93IHdoaXRlLXNwYWNlIGJldHdlZW4gY29udGVudCBhbmRcbiAgICAgICAgICogdXJsIGluIEdGTSBtb2RlLiAqL1xuICAgICAgICBpZiAoIXBlZGFudGljKSB7XG4gICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKTtcblxuICAgICAgICAgICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1YnF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpICE9PSBDX1BBUkVOX09QRU4pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBDX1BBUkVOX09QRU47XG4gICAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVldWUgKz0gc3VicXVldWU7XG4gICAgc3VicXVldWUgPSAnJztcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgLyogRWF0IHRoZSBjb250ZW50IGNsb3NpbmcuICovXG4gIGlmICghY2xvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGVudCA9IHF1ZXVlO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZSArIHN1YnF1ZXVlO1xuICBpbmRleCsrO1xuXG4gIC8qIEVhdCB3aGl0ZS1zcGFjZS4gKi9cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgIGlmICghd2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIC8qIEVhdCB0aGUgVVJMLiAqL1xuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBtYXJrZXJzID0gY29tbW9ubWFyayA/IENPTU1PTk1BUktfTElOS19NQVJLRVJTIDogTElOS19NQVJLRVJTO1xuICBxdWV1ZSA9ICcnO1xuICBiZWZvcmVVUkwgPSBzdWJ2YWx1ZTtcblxuICBpZiAoY2hhcmFjdGVyID09PSBDX0xUKSB7XG4gICAgaW5kZXgrKztcbiAgICBiZWZvcmVVUkwgKz0gQ19MVDtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19HVCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1vbm1hcmsgJiYgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfR1QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJ2YWx1ZSArPSBDX0xUICsgcXVldWUgKyBDX0dUO1xuICAgIHVybCA9IHF1ZXVlO1xuICAgIGluZGV4Kys7XG4gIH0gZWxzZSB7XG4gICAgY2hhcmFjdGVyID0gbnVsbDtcbiAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoc3VicXVldWUgJiYgb3duLmNhbGwobWFya2VycywgY2hhcmFjdGVyKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgICBpZiAoIXBlZGFudGljKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4pIHtcbiAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19QQVJFTl9DTE9TRSkge1xuICAgICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlICs9IHN1YnF1ZXVlO1xuICAgICAgICBzdWJxdWV1ZSA9ICcnO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgcXVldWUgKz0gQ19CQUNLU0xBU0g7XG4gICAgICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KCsraW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgfVxuXG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICAgIHVybCA9IHF1ZXVlO1xuICAgIGluZGV4ID0gc3VidmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgLyogRWF0IHdoaXRlLXNwYWNlLiAqL1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICBzdWJ2YWx1ZSArPSBxdWV1ZTtcblxuICAvKiBFYXQgdGhlIHRpdGxlLiAqL1xuICBpZiAocXVldWUgJiYgb3duLmNhbGwobWFya2VycywgY2hhcmFjdGVyKSkge1xuICAgIGluZGV4Kys7XG4gICAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICAgIHF1ZXVlID0gJyc7XG4gICAgbWFya2VyID0gbWFya2Vyc1tjaGFyYWN0ZXJdO1xuICAgIGJlZm9yZVRpdGxlID0gc3VidmFsdWU7XG5cbiAgICAvKiBJbiBjb21tb25tYXJrLW1vZGUsIHRoaW5ncyBhcmUgcHJldHR5IGVhc3k6IHRoZVxuICAgICAqIG1hcmtlciBjYW5ub3Qgb2NjdXIgaW5zaWRlIHRoZSB0aXRsZS5cbiAgICAgKlxuICAgICAqIE5vbi1jb21tb25tYXJrIGRvZXMsIGhvd2V2ZXIsIHN1cHBvcnQgbmVzdGVkXG4gICAgICogZGVsaW1pdGVycy4gKi9cbiAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHF1ZXVlICs9IENfQkFDS1NMQVNIO1xuICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIH1cblxuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciAhPT0gbWFya2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGl0bGUgPSBxdWV1ZTtcbiAgICAgIHN1YnZhbHVlICs9IHF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgaW5kZXgrKztcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKCF3aGl0ZXNwYWNlKGNoYXJhY3RlcikpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VicXVldWUgPSAnJztcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICAgICAgaWYgKGhhc01hcmtlcikge1xuICAgICAgICAgICAgcXVldWUgKz0gbWFya2VyICsgc3VicXVldWU7XG4gICAgICAgICAgICBzdWJxdWV1ZSA9ICcnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhc01hcmtlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc01hcmtlcikge1xuICAgICAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fQ0xPU0UpIHtcbiAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZSArIG1hcmtlciArIHN1YnF1ZXVlO1xuICAgICAgICAgIHRpdGxlID0gcXVldWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAod2hpdGVzcGFjZShjaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgc3VicXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXVlICs9IG1hcmtlciArIHN1YnF1ZXVlICsgY2hhcmFjdGVyO1xuICAgICAgICAgIHN1YnF1ZXVlID0gJyc7XG4gICAgICAgICAgaGFzTWFya2VyID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZS5jaGFyQXQoaW5kZXgpICE9PSBDX1BBUkVOX0NMT1NFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmIC0gbmV2ZXIgdXNlZCAoeWV0KSAqL1xuICBpZiAoc2lsZW50KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdWJ2YWx1ZSArPSBDX1BBUkVOX0NMT1NFO1xuXG4gIHVybCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKHVybCksIGVhdChiZWZvcmVVUkwpLnRlc3QoKS5lbmQpO1xuXG4gIGlmICh0aXRsZSkge1xuICAgIGJlZm9yZVRpdGxlID0gZWF0KGJlZm9yZVRpdGxlKS50ZXN0KCkuZW5kO1xuICAgIHRpdGxlID0gc2VsZi5kZWNvZGUucmF3KHNlbGYudW5lc2NhcGUodGl0bGUpLCBiZWZvcmVUaXRsZSk7XG4gIH1cblxuICBub2RlID0ge1xuICAgIHR5cGU6IGlzSW1hZ2UgPyAnaW1hZ2UnIDogJ2xpbmsnLFxuICAgIHRpdGxlOiB0aXRsZSB8fCBudWxsLFxuICAgIHVybDogdXJsXG4gIH07XG5cbiAgaWYgKGlzSW1hZ2UpIHtcbiAgICBub2RlLmFsdCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKGNvbnRlbnQpLCBub3cpIHx8IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgZXhpdCA9IHNlbGYuZW50ZXJMaW5rKCk7XG4gICAgbm9kZS5jaGlsZHJlbiA9IHNlbGYudG9rZW5pemVJbmxpbmUoY29udGVudCwgbm93KTtcbiAgICBleGl0KCk7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKShub2RlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LXBhcmFtcyAqL1xuXG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciBnZXRJbmRlbnQgPSByZXF1aXJlKCcuLi91dGlsL2dldC1pbmRlbnRhdGlvbicpO1xudmFyIHJlbW92ZUluZGVudCA9IHJlcXVpcmUoJy4uL3V0aWwvcmVtb3ZlLWluZGVudGF0aW9uJyk7XG52YXIgaW50ZXJydXB0ID0gcmVxdWlyZSgnLi4vdXRpbC9pbnRlcnJ1cHQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0O1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG52YXIgQ19QTFVTID0gJysnO1xudmFyIENfREFTSCA9ICctJztcbnZhciBDX0RPVCA9ICcuJztcbnZhciBDX1NQQUNFID0gJyAnO1xudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19QQVJFTl9DTE9TRSA9ICcpJztcbnZhciBDX1hfTE9XRVIgPSAneCc7XG5cbnZhciBUQUJfU0laRSA9IDQ7XG52YXIgRVhQUkVTU0lPTl9MT09TRV9MSVNUX0lURU0gPSAvXFxuXFxuKD8hXFxzKiQpLztcbnZhciBFWFBSRVNTSU9OX1RBU0tfSVRFTSA9IC9eXFxbKFsgXFx0XXx4fFgpXVsgXFx0XS87XG52YXIgRVhQUkVTU0lPTl9CVUxMRVQgPSAvXihbIFxcdF0qKShbKistXXxcXGQrWy4pXSkoIHsxLDR9KD8hICl8IHxcXHR8JHwoPz1cXG4pKShbXlxcbl0qKS87XG52YXIgRVhQUkVTU0lPTl9QRURBTlRJQ19CVUxMRVQgPSAvXihbIFxcdF0qKShbKistXXxcXGQrWy4pXSkoWyBcXHRdKykvO1xudmFyIEVYUFJFU1NJT05fSU5JVElBTF9JTkRFTlQgPSAvXiggezEsNH18XFx0KT8vZ207XG5cbi8qIE1hcCBvZiBjaGFyYWN0ZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hcmtcbiAqIGxpc3QtaXRlbXMuICovXG52YXIgTElTVF9VTk9SREVSRURfTUFSS0VSUyA9IHt9O1xuXG5MSVNUX1VOT1JERVJFRF9NQVJLRVJTW0NfQVNURVJJU0tdID0gdHJ1ZTtcbkxJU1RfVU5PUkRFUkVEX01BUktFUlNbQ19QTFVTXSA9IHRydWU7XG5MSVNUX1VOT1JERVJFRF9NQVJLRVJTW0NfREFTSF0gPSB0cnVlO1xuXG4vKiBNYXAgb2YgY2hhcmFjdGVycyB3aGljaCBjYW4gYmUgdXNlZCB0byBtYXJrXG4gKiBsaXN0LWl0ZW1zIGFmdGVyIGEgZGlnaXQuICovXG52YXIgTElTVF9PUkRFUkVEX01BUktFUlMgPSB7fTtcblxuTElTVF9PUkRFUkVEX01BUktFUlNbQ19ET1RdID0gdHJ1ZTtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFya1xuICogbGlzdC1pdGVtcyBhZnRlciBhIGRpZ2l0LiAqL1xudmFyIExJU1RfT1JERVJFRF9DT01NT05NQVJLX01BUktFUlMgPSB7fTtcblxuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX0RPVF0gPSB0cnVlO1xuTElTVF9PUkRFUkVEX0NPTU1PTk1BUktfTUFSS0VSU1tDX1BBUkVOX0NMT1NFXSA9IHRydWU7XG5cbmZ1bmN0aW9uIGxpc3QoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNvbW1vbm1hcmsgPSBzZWxmLm9wdGlvbnMuY29tbW9ubWFyaztcbiAgdmFyIHBlZGFudGljID0gc2VsZi5vcHRpb25zLnBlZGFudGljO1xuICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICB2YXIgaW50ZXJ1cHRvcnMgPSBzZWxmLmludGVycnVwdExpc3Q7XG4gIHZhciBtYXJrZXJzO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBudWxsO1xuICB2YXIgc2l6ZSA9IDA7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIG9yZGVyZWQ7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBtYXJrZXI7XG4gIHZhciBuZXh0SW5kZXg7XG4gIHZhciBzdGFydEluZGV4O1xuICB2YXIgcHJlZml4ZWQ7XG4gIHZhciBjdXJyZW50TWFya2VyO1xuICB2YXIgY29udGVudDtcbiAgdmFyIGxpbmU7XG4gIHZhciBwcmV2RW1wdHk7XG4gIHZhciBlbXB0eTtcbiAgdmFyIGl0ZW1zO1xuICB2YXIgYWxsTGluZXM7XG4gIHZhciBlbXB0eUxpbmVzO1xuICB2YXIgaXRlbTtcbiAgdmFyIGVudGVyVG9wO1xuICB2YXIgZXhpdEJsb2NrcXVvdGU7XG4gIHZhciBpc0xvb3NlO1xuICB2YXIgbm9kZTtcbiAgdmFyIG5vdztcbiAgdmFyIGVuZDtcbiAgdmFyIGluZGVudGVkO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgc2l6ZSArPSBUQUJfU0laRSAtIChzaXplICUgVEFCX1NJWkUpO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICBzaXplKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAoc2l6ZSA+PSBUQUJfU0laRSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgbWFya2VycyA9IGNvbW1vbm1hcmsgP1xuICAgIExJU1RfT1JERVJFRF9DT01NT05NQVJLX01BUktFUlMgOlxuICAgIExJU1RfT1JERVJFRF9NQVJLRVJTO1xuXG4gIGlmIChMSVNUX1VOT1JERVJFRF9NQVJLRVJTW2NoYXJhY3Rlcl0gPT09IHRydWUpIHtcbiAgICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gICAgb3JkZXJlZCA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG9yZGVyZWQgPSB0cnVlO1xuICAgIHF1ZXVlID0gJyc7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgIGlmICghZGVjaW1hbChjaGFyYWN0ZXIpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXF1ZXVlIHx8IG1hcmtlcnNbY2hhcmFjdGVyXSAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN0YXJ0ID0gcGFyc2VJbnQocXVldWUsIDEwKTtcbiAgICBtYXJrZXIgPSBjaGFyYWN0ZXI7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG5cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19TUEFDRSAmJiBjaGFyYWN0ZXIgIT09IENfVEFCKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaW5kZXggPSAwO1xuICBpdGVtcyA9IFtdO1xuICBhbGxMaW5lcyA9IFtdO1xuICBlbXB0eUxpbmVzID0gW107XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgbmV4dEluZGV4ID0gdmFsdWUuaW5kZXhPZihDX05FV0xJTkUsIGluZGV4KTtcbiAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgcHJlZml4ZWQgPSBmYWxzZTtcbiAgICBpbmRlbnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgIG5leHRJbmRleCA9IGxlbmd0aDtcbiAgICB9XG5cbiAgICBlbmQgPSBpbmRleCArIFRBQl9TSVpFO1xuICAgIHNpemUgPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQikge1xuICAgICAgICBzaXplICs9IFRBQl9TSVpFIC0gKHNpemUgJSBUQUJfU0laRSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19TUEFDRSkge1xuICAgICAgICBzaXplKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA+PSBUQUJfU0laRSkge1xuICAgICAgaW5kZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpdGVtICYmIHNpemUgPj0gaXRlbS5pbmRlbnQpIHtcbiAgICAgIGluZGVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgIGN1cnJlbnRNYXJrZXIgPSBudWxsO1xuXG4gICAgaWYgKCFpbmRlbnRlZCkge1xuICAgICAgaWYgKExJU1RfVU5PUkRFUkVEX01BUktFUlNbY2hhcmFjdGVyXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjdXJyZW50TWFya2VyID0gY2hhcmFjdGVyO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBzaXplKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZSA9ICcnO1xuXG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICAgICAgICBpZiAoIWRlY2ltYWwoY2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICAgICAgICBpbmRleCsrO1xuXG4gICAgICAgIGlmIChxdWV1ZSAmJiBtYXJrZXJzW2NoYXJhY3Rlcl0gPT09IHRydWUpIHtcbiAgICAgICAgICBjdXJyZW50TWFya2VyID0gY2hhcmFjdGVyO1xuICAgICAgICAgIHNpemUgKz0gcXVldWUubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudE1hcmtlcikge1xuICAgICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVEFCKSB7XG4gICAgICAgICAgc2l6ZSArPSBUQUJfU0laRSAtIChzaXplICUgVEFCX1NJWkUpO1xuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgZW5kID0gaW5kZXggKyBUQUJfU0laRTtcblxuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCkgIT09IENfU1BBQ0UpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGluZGV4ID09PSBlbmQgJiYgdmFsdWUuY2hhckF0KGluZGV4KSA9PT0gQ19TUEFDRSkge1xuICAgICAgICAgICAgaW5kZXggLT0gVEFCX1NJWkUgLSAxO1xuICAgICAgICAgICAgc2l6ZSAtPSBUQUJfU0laRSAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciAhPT0gQ19ORVdMSU5FICYmIGNoYXJhY3RlciAhPT0gJycpIHtcbiAgICAgICAgICBjdXJyZW50TWFya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50TWFya2VyKSB7XG4gICAgICBpZiAoIXBlZGFudGljICYmIG1hcmtlciAhPT0gY3VycmVudE1hcmtlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcHJlZml4ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWNvbW1vbm1hcmsgJiYgIWluZGVudGVkICYmIHZhbHVlLmNoYXJBdChzdGFydEluZGV4KSA9PT0gQ19TUEFDRSkge1xuICAgICAgICBpbmRlbnRlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbW1vbm1hcmsgJiYgaXRlbSkge1xuICAgICAgICBpbmRlbnRlZCA9IHNpemUgPj0gaXRlbS5pbmRlbnQgfHwgc2l6ZSA+IFRBQl9TSVpFO1xuICAgICAgfVxuXG4gICAgICBwcmVmaXhlZCA9IGZhbHNlO1xuICAgICAgaW5kZXggPSBzdGFydEluZGV4O1xuICAgIH1cblxuICAgIGxpbmUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4LCBuZXh0SW5kZXgpO1xuICAgIGNvbnRlbnQgPSBzdGFydEluZGV4ID09PSBpbmRleCA/IGxpbmUgOiB2YWx1ZS5zbGljZShpbmRleCwgbmV4dEluZGV4KTtcblxuICAgIGlmIChcbiAgICAgIGN1cnJlbnRNYXJrZXIgPT09IENfQVNURVJJU0sgfHxcbiAgICAgIGN1cnJlbnRNYXJrZXIgPT09IENfVU5ERVJTQ09SRSB8fFxuICAgICAgY3VycmVudE1hcmtlciA9PT0gQ19EQVNIXG4gICAgKSB7XG4gICAgICBpZiAodG9rZW5pemVycy50aGVtYXRpY0JyZWFrLmNhbGwoc2VsZiwgZWF0LCBsaW5lLCB0cnVlKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2RW1wdHkgPSBlbXB0eTtcbiAgICBlbXB0eSA9ICF0cmltKGNvbnRlbnQpLmxlbmd0aDtcblxuICAgIGlmIChpbmRlbnRlZCAmJiBpdGVtKSB7XG4gICAgICBpdGVtLnZhbHVlID0gaXRlbS52YWx1ZS5jb25jYXQoZW1wdHlMaW5lcywgbGluZSk7XG4gICAgICBhbGxMaW5lcyA9IGFsbExpbmVzLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgIGVtcHR5TGluZXMgPSBbXTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeGVkKSB7XG4gICAgICBpZiAoZW1wdHlMaW5lcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgaXRlbS52YWx1ZS5wdXNoKCcnKTtcbiAgICAgICAgaXRlbS50cmFpbCA9IGVtcHR5TGluZXMuY29uY2F0KCk7XG4gICAgICB9XG5cbiAgICAgIGl0ZW0gPSB7XG4gICAgICAgIHZhbHVlOiBbbGluZV0sXG4gICAgICAgIGluZGVudDogc2l6ZSxcbiAgICAgICAgdHJhaWw6IFtdXG4gICAgICB9O1xuXG4gICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgYWxsTGluZXMgPSBhbGxMaW5lcy5jb25jYXQoZW1wdHlMaW5lcywgbGluZSk7XG4gICAgICBlbXB0eUxpbmVzID0gW107XG4gICAgfSBlbHNlIGlmIChlbXB0eSkge1xuICAgICAgaWYgKHByZXZFbXB0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZW1wdHlMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldkVtcHR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW50ZXJydXB0KGludGVydXB0b3JzLCB0b2tlbml6ZXJzLCBzZWxmLCBbZWF0LCBsaW5lLCB0cnVlXSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGl0ZW0udmFsdWUgPSBpdGVtLnZhbHVlLmNvbmNhdChlbXB0eUxpbmVzLCBsaW5lKTtcbiAgICAgIGFsbExpbmVzID0gYWxsTGluZXMuY29uY2F0KGVtcHR5TGluZXMsIGxpbmUpO1xuICAgICAgZW1wdHlMaW5lcyA9IFtdO1xuICAgIH1cblxuICAgIGluZGV4ID0gbmV4dEluZGV4ICsgMTtcbiAgfVxuXG4gIG5vZGUgPSBlYXQoYWxsTGluZXMuam9pbihDX05FV0xJTkUpKS5yZXNldCh7XG4gICAgdHlwZTogJ2xpc3QnLFxuICAgIG9yZGVyZWQ6IG9yZGVyZWQsXG4gICAgc3RhcnQ6IHN0YXJ0LFxuICAgIGxvb3NlOiBudWxsLFxuICAgIGNoaWxkcmVuOiBbXVxuICB9KTtcblxuICBlbnRlclRvcCA9IHNlbGYuZW50ZXJMaXN0KCk7XG4gIGV4aXRCbG9ja3F1b3RlID0gc2VsZi5lbnRlckJsb2NrKCk7XG4gIGlzTG9vc2UgPSBmYWxzZTtcbiAgaW5kZXggPSAtMTtcbiAgbGVuZ3RoID0gaXRlbXMubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaXRlbSA9IGl0ZW1zW2luZGV4XS52YWx1ZS5qb2luKENfTkVXTElORSk7XG4gICAgbm93ID0gZWF0Lm5vdygpO1xuXG4gICAgaXRlbSA9IGVhdChpdGVtKShsaXN0SXRlbShzZWxmLCBpdGVtLCBub3cpLCBub2RlKTtcblxuICAgIGlmIChpdGVtLmxvb3NlKSB7XG4gICAgICBpc0xvb3NlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpdGVtID0gaXRlbXNbaW5kZXhdLnRyYWlsLmpvaW4oQ19ORVdMSU5FKTtcblxuICAgIGlmIChpbmRleCAhPT0gbGVuZ3RoIC0gMSkge1xuICAgICAgaXRlbSArPSBDX05FV0xJTkU7XG4gICAgfVxuXG4gICAgZWF0KGl0ZW0pO1xuICB9XG5cbiAgZW50ZXJUb3AoKTtcbiAgZXhpdEJsb2NrcXVvdGUoKTtcblxuICBub2RlLmxvb3NlID0gaXNMb29zZTtcblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gbGlzdEl0ZW0oY3R4LCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgdmFyIG9mZnNldHMgPSBjdHgub2Zmc2V0O1xuICB2YXIgZm4gPSBjdHgub3B0aW9ucy5wZWRhbnRpYyA/IHBlZGFudGljTGlzdEl0ZW0gOiBub3JtYWxMaXN0SXRlbTtcbiAgdmFyIGNoZWNrZWQgPSBudWxsO1xuICB2YXIgdGFzaztcbiAgdmFyIGluZGVudDtcblxuICB2YWx1ZSA9IGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cbiAgaWYgKGN0eC5vcHRpb25zLmdmbSkge1xuICAgIHRhc2sgPSB2YWx1ZS5tYXRjaChFWFBSRVNTSU9OX1RBU0tfSVRFTSk7XG5cbiAgICBpZiAodGFzaykge1xuICAgICAgaW5kZW50ID0gdGFza1swXS5sZW5ndGg7XG4gICAgICBjaGVja2VkID0gdGFza1sxXS50b0xvd2VyQ2FzZSgpID09PSBDX1hfTE9XRVI7XG4gICAgICBvZmZzZXRzW3Bvc2l0aW9uLmxpbmVdICs9IGluZGVudDtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoaW5kZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgbG9vc2U6IEVYUFJFU1NJT05fTE9PU0VfTElTVF9JVEVNLnRlc3QodmFsdWUpIHx8XG4gICAgICB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoIC0gMSkgPT09IENfTkVXTElORSxcbiAgICBjaGVja2VkOiBjaGVja2VkLFxuICAgIGNoaWxkcmVuOiBjdHgudG9rZW5pemVCbG9jayh2YWx1ZSwgcG9zaXRpb24pXG4gIH07XG59XG5cbi8qIENyZWF0ZSBhIGxpc3QtaXRlbSB1c2luZyBvdmVybHkgc2ltcGxlIG1lY2hhbmljcy4gKi9cbmZ1bmN0aW9uIHBlZGFudGljTGlzdEl0ZW0oY3R4LCB2YWx1ZSwgcG9zaXRpb24pIHtcbiAgdmFyIG9mZnNldHMgPSBjdHgub2Zmc2V0O1xuICB2YXIgbGluZSA9IHBvc2l0aW9uLmxpbmU7XG5cbiAgLyogUmVtb3ZlIHRoZSBsaXN0LWl0ZW3igJlzIGJ1bGxldC4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fUEVEQU5USUNfQlVMTEVULCByZXBsYWNlcik7XG5cbiAgLyogVGhlIGluaXRpYWwgbGluZSB3YXMgYWxzbyBtYXRjaGVkIGJ5IHRoZSBiZWxvdywgc29cbiAgICogd2UgcmVzZXQgdGhlIGBsaW5lYC4gKi9cbiAgbGluZSA9IHBvc2l0aW9uLmxpbmU7XG5cbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoRVhQUkVTU0lPTl9JTklUSUFMX0lOREVOVCwgcmVwbGFjZXIpO1xuXG4gIC8qIEEgc2ltcGxlIHJlcGxhY2VyIHdoaWNoIHJlbW92ZWQgYWxsIG1hdGNoZXMsXG4gICAqIGFuZCBhZGRzIHRoZWlyIGxlbmd0aCB0byBgb2Zmc2V0YC4gKi9cbiAgZnVuY3Rpb24gcmVwbGFjZXIoJDApIHtcbiAgICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgKyAkMC5sZW5ndGg7XG4gICAgbGluZSsrO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qIENyZWF0ZSBhIGxpc3QtaXRlbSB1c2luZyBzYW5lIG1lY2hhbmljcy4gKi9cbmZ1bmN0aW9uIG5vcm1hbExpc3RJdGVtKGN0eCwgdmFsdWUsIHBvc2l0aW9uKSB7XG4gIHZhciBvZmZzZXRzID0gY3R4Lm9mZnNldDtcbiAgdmFyIGxpbmUgPSBwb3NpdGlvbi5saW5lO1xuICB2YXIgbWF4O1xuICB2YXIgYnVsbGV0O1xuICB2YXIgcmVzdDtcbiAgdmFyIGxpbmVzO1xuICB2YXIgdHJpbW1lZExpbmVzO1xuICB2YXIgaW5kZXg7XG4gIHZhciBsZW5ndGg7XG5cbiAgLyogUmVtb3ZlIHRoZSBsaXN0LWl0ZW3igJlzIGJ1bGxldC4gKi9cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKEVYUFJFU1NJT05fQlVMTEVULCByZXBsYWNlcik7XG5cbiAgbGluZXMgPSB2YWx1ZS5zcGxpdChDX05FV0xJTkUpO1xuXG4gIHRyaW1tZWRMaW5lcyA9IHJlbW92ZUluZGVudCh2YWx1ZSwgZ2V0SW5kZW50KG1heCkuaW5kZW50KS5zcGxpdChDX05FV0xJTkUpO1xuXG4gIC8qIFdlIHJlcGxhY2VkIHRoZSBpbml0aWFsIGJ1bGxldCB3aXRoIHNvbWV0aGluZ1xuICAgKiBlbHNlIGFib3ZlLCB3aGljaCB3YXMgdXNlZCB0byB0cmlja1xuICAgKiBgcmVtb3ZlSW5kZW50YXRpb25gIGludG8gcmVtb3Zpbmcgc29tZSBtb3JlXG4gICAqIGNoYXJhY3RlcnMgd2hlbiBwb3NzaWJsZS4gIEhvd2V2ZXIsIHRoYXQgY291bGRcbiAgICogcmVzdWx0IGluIHRoZSBpbml0aWFsIGxpbmUgdG8gYmUgc3RyaXBwZWQgbW9yZVxuICAgKiB0aGFuIGl0IHNob3VsZCBiZS4gKi9cbiAgdHJpbW1lZExpbmVzWzBdID0gcmVzdDtcblxuICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgKyBidWxsZXQubGVuZ3RoO1xuICBsaW5lKys7XG5cbiAgaW5kZXggPSAwO1xuICBsZW5ndGggPSBsaW5lcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBvZmZzZXRzW2xpbmVdID0gKG9mZnNldHNbbGluZV0gfHwgMCkgK1xuICAgICAgbGluZXNbaW5kZXhdLmxlbmd0aCAtIHRyaW1tZWRMaW5lc1tpbmRleF0ubGVuZ3RoO1xuICAgIGxpbmUrKztcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkTGluZXMuam9pbihDX05FV0xJTkUpO1xuXG4gIGZ1bmN0aW9uIHJlcGxhY2VyKCQwLCAkMSwgJDIsICQzLCAkNCkge1xuICAgIGJ1bGxldCA9ICQxICsgJDIgKyAkMztcbiAgICByZXN0ID0gJDQ7XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgbmluZSBudW1iZXJlZCBsaXN0IGl0ZW1zXG4gICAgICogY2FuIGluZGVudCB3aXRoIGFuIGV4dHJhIHNwYWNlLiAgVGhhdCBpcywgd2hlblxuICAgICAqIHRoZSBidWxsZXQgZGlkIG5vdCByZWNlaXZlIGFuIGV4dHJhIGZpbmFsIHNwYWNlLiAqL1xuICAgIGlmIChOdW1iZXIoJDIpIDwgMTAgJiYgYnVsbGV0Lmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICQyID0gQ19TUEFDRSArICQyO1xuICAgIH1cblxuICAgIG1heCA9ICQxICsgcmVwZWF0KENfU1BBQ0UsICQyLmxlbmd0aCkgKyAkMztcblxuICAgIHJldHVybiBtYXggKyByZXN0O1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB3aGl0ZXNwYWNlID0gcmVxdWlyZSgnaXMtd2hpdGVzcGFjZS1jaGFyYWN0ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXdsaW5lO1xuXG4vKiBUb2tlbmlzZSBuZXdsaW5lLiAqL1xuZnVuY3Rpb24gbmV3bGluZShlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgwKTtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcXVldWU7XG4gIHZhciBpbmRleDtcblxuICBpZiAoY2hhcmFjdGVyICE9PSAnXFxuJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaW5kZXggPSAxO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHN1YnZhbHVlID0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicpIHtcbiAgICAgIHN1YnZhbHVlICs9IHF1ZXVlO1xuICAgICAgcXVldWUgPSAnJztcbiAgICB9XG5cbiAgICBpbmRleCsrO1xuICB9XG5cbiAgZWF0KHN1YnZhbHVlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciB0cmltVHJhaWxpbmdMaW5lcyA9IHJlcXVpcmUoJ3RyaW0tdHJhaWxpbmctbGluZXMnKTtcbnZhciBpbnRlcnJ1cHQgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycnVwdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcmFncmFwaDtcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcblxudmFyIFRBQl9TSVpFID0gNDtcblxuLyogVG9rZW5pc2UgcGFyYWdyYXBoLiAqL1xuZnVuY3Rpb24gcGFyYWdyYXBoKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBzZXR0aW5ncyA9IHNlbGYub3B0aW9ucztcbiAgdmFyIGNvbW1vbm1hcmsgPSBzZXR0aW5ncy5jb21tb25tYXJrO1xuICB2YXIgZ2ZtID0gc2V0dGluZ3MuZ2ZtO1xuICB2YXIgdG9rZW5pemVycyA9IHNlbGYuYmxvY2tUb2tlbml6ZXJzO1xuICB2YXIgaW50ZXJydXB0b3JzID0gc2VsZi5pbnRlcnJ1cHRQYXJhZ3JhcGg7XG4gIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FKTtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciBzaXplO1xuICB2YXIgbm93O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIC8qIEVhdCBldmVyeXRoaW5nIGlmIHRoZXJl4oCZcyBubyBmb2xsb3dpbmcgbmV3bGluZS4gKi9cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIFN0b3AgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIE5FV0xJTkUuICovXG4gICAgaWYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09PSBDX05FV0xJTkUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIEluIGNvbW1vbm1hcmstbW9kZSwgZm9sbG93aW5nIGluZGVudGVkIGxpbmVzXG4gICAgICogYXJlIHBhcnQgb2YgdGhlIHBhcmFncmFwaC4gKi9cbiAgICBpZiAoY29tbW9ubWFyaykge1xuICAgICAgc2l6ZSA9IDA7XG4gICAgICBwb3NpdGlvbiA9IGluZGV4ICsgMTtcblxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwb3NpdGlvbik7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19UQUIpIHtcbiAgICAgICAgICBzaXplID0gVEFCX1NJWkU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICAgICAgc2l6ZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpb24rKztcbiAgICAgIH1cblxuICAgICAgaWYgKHNpemUgPj0gVEFCX1NJWkUpIHtcbiAgICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKENfTkVXTElORSwgaW5kZXggKyAxKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VidmFsdWUgPSB2YWx1ZS5zbGljZShpbmRleCArIDEpO1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZvbGxvd2luZyBjb2RlIGNvbnRhaW5zIGEgcG9zc2libGVcbiAgICAgKiBibG9jay4gKi9cbiAgICBpZiAoaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgc2VsZiwgW2VhdCwgc3VidmFsdWUsIHRydWVdKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogQnJlYWsgaWYgdGhlIGZvbGxvd2luZyBsaW5lIHN0YXJ0cyBhIGxpc3QsIHdoZW5cbiAgICAgKiBhbHJlYWR5IGluIGEgbGlzdCwgb3Igd2hlbiBpbiBjb21tb25tYXJrLCBvciB3aGVuXG4gICAgICogaW4gZ2ZtIG1vZGUgYW5kIHRoZSBidWxsZXQgaXMgKm5vdCogbnVtZXJpYy4gKi9cbiAgICBpZiAoXG4gICAgICB0b2tlbml6ZXJzLmxpc3QuY2FsbChzZWxmLCBlYXQsIHN1YnZhbHVlLCB0cnVlKSAmJlxuICAgICAgKFxuICAgICAgICBzZWxmLmluTGlzdCB8fFxuICAgICAgICBjb21tb25tYXJrIHx8XG4gICAgICAgIChnZm0gJiYgIWRlY2ltYWwodHJpbS5sZWZ0KHN1YnZhbHVlKS5jaGFyQXQoMCkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSBpbmRleDtcbiAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCArIDEpO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSAmJiB0cmltKHZhbHVlLnNsaWNlKHBvc2l0aW9uLCBpbmRleCkpID09PSAnJykge1xuICAgICAgaW5kZXggPSBwb3NpdGlvbjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN1YnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpO1xuXG4gIGlmICh0cmltKHN1YnZhbHVlKSA9PT0gJycpIHtcbiAgICBlYXQoc3VidmFsdWUpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG5vdyA9IGVhdC5ub3coKTtcbiAgc3VidmFsdWUgPSB0cmltVHJhaWxpbmdMaW5lcyhzdWJ2YWx1ZSk7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdwYXJhZ3JhcGgnLFxuICAgIGNoaWxkcmVuOiBzZWxmLnRva2VuaXplSW5saW5lKHN1YnZhbHVlLCBub3cpXG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL2xpbmsnKTtcbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCcuLi91dGlsL25vcm1hbGl6ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZmVyZW5jZTtcbnJlZmVyZW5jZS5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgVF9MSU5LID0gJ2xpbmsnO1xudmFyIFRfSU1BR0UgPSAnaW1hZ2UnO1xudmFyIFRfRk9PVE5PVEUgPSAnZm9vdG5vdGUnO1xudmFyIFJFRkVSRU5DRV9UWVBFX1NIT1JUQ1VUID0gJ3Nob3J0Y3V0JztcbnZhciBSRUZFUkVOQ0VfVFlQRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJztcbnZhciBSRUZFUkVOQ0VfVFlQRV9GVUxMID0gJ2Z1bGwnO1xudmFyIENfQ0FSRVQgPSAnXic7XG52YXIgQ19CQUNLU0xBU0ggPSAnXFxcXCc7XG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xuXG5mdW5jdGlvbiByZWZlcmVuY2UoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgwKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlID0gJyc7XG4gIHZhciBpbnRybyA9ICcnO1xuICB2YXIgdHlwZSA9IFRfTElOSztcbiAgdmFyIHJlZmVyZW5jZVR5cGUgPSBSRUZFUkVOQ0VfVFlQRV9TSE9SVENVVDtcbiAgdmFyIGNvbnRlbnQ7XG4gIHZhciBpZGVudGlmaWVyO1xuICB2YXIgbm93O1xuICB2YXIgbm9kZTtcbiAgdmFyIGV4aXQ7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGJyYWNrZXRlZDtcbiAgdmFyIGRlcHRoO1xuXG4gIC8qIENoZWNrIHdoZXRoZXIgd2XigJlyZSBlYXRpbmcgYW4gaW1hZ2UuICovXG4gIGlmIChjaGFyYWN0ZXIgPT09ICchJykge1xuICAgIHR5cGUgPSBUX0lNQUdFO1xuICAgIGludHJvID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgfVxuXG4gIGlmIChjaGFyYWN0ZXIgIT09IENfQlJBQ0tFVF9PUEVOKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXgrKztcbiAgaW50cm8gKz0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIC8qIENoZWNrIHdoZXRoZXIgd2XigJlyZSBlYXRpbmcgYSBmb290bm90ZS4gKi9cbiAgaWYgKFxuICAgIHNlbGYub3B0aW9ucy5mb290bm90ZXMgJiZcbiAgICB0eXBlID09PSBUX0xJTksgJiZcbiAgICB2YWx1ZS5jaGFyQXQoaW5kZXgpID09PSBDX0NBUkVUXG4gICkge1xuICAgIGludHJvICs9IENfQ0FSRVQ7XG4gICAgaW5kZXgrKztcbiAgICB0eXBlID0gVF9GT09UTk9URTtcbiAgfVxuXG4gIC8qIEVhdCB0aGUgdGV4dC4gKi9cbiAgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgYnJhY2tldGVkID0gdHJ1ZTtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09IENfQlJBQ0tFVF9DTE9TRSkge1xuICAgICAgaWYgKCFkZXB0aCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVwdGgtLTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JBQ0tTTEFTSCkge1xuICAgICAgcXVldWUgKz0gQ19CQUNLU0xBU0g7XG4gICAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHF1ZXVlO1xuICBjb250ZW50ID0gcXVldWU7XG4gIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgaWYgKGNoYXJhY3RlciAhPT0gQ19CUkFDS0VUX0NMT1NFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaW5kZXgrKztcbiAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICBxdWV1ZSA9ICcnO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gIC8qIElubGluZSBmb290bm90ZXMgY2Fubm90IGhhdmUgYW4gaWRlbnRpZmllci4gKi9cbiAgaWYgKHR5cGUgIT09IFRfRk9PVE5PVEUgJiYgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgIGlkZW50aWZpZXIgPSAnJztcbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CUkFDS0VUX09QRU4gfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfQkFDS1NMQVNIKSB7XG4gICAgICAgIGlkZW50aWZpZXIgKz0gQ19CQUNLU0xBU0g7XG4gICAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICAgIH1cblxuICAgICAgaWRlbnRpZmllciArPSBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgIHJlZmVyZW5jZVR5cGUgPSBpZGVudGlmaWVyID8gUkVGRVJFTkNFX1RZUEVfRlVMTCA6IFJFRkVSRU5DRV9UWVBFX0NPTExBUFNFRDtcbiAgICAgIHF1ZXVlICs9IGlkZW50aWZpZXIgKyBjaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZGVudGlmaWVyID0gJyc7XG4gICAgfVxuXG4gICAgc3VidmFsdWUgKz0gcXVldWU7XG4gICAgcXVldWUgPSAnJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVyID0gY29udGVudDtcbiAgfVxuXG4gIC8qIEJyYWNrZXRzIGNhbm5vdCBiZSBpbnNpZGUgdGhlIGlkZW50aWZpZXIuICovXG4gIGlmIChyZWZlcmVuY2VUeXBlICE9PSBSRUZFUkVOQ0VfVFlQRV9GVUxMICYmIGJyYWNrZXRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlID0gaW50cm8gKyBzdWJ2YWx1ZTtcblxuICBpZiAodHlwZSA9PT0gVF9MSU5LICYmIHNlbGYuaW5MaW5rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBUX0ZPT1ROT1RFICYmIGNvbnRlbnQuaW5kZXhPZignICcpICE9PSAtMSkge1xuICAgIHJldHVybiBlYXQoc3VidmFsdWUpKHtcbiAgICAgIHR5cGU6ICdmb290bm90ZScsXG4gICAgICBjaGlsZHJlbjogdGhpcy50b2tlbml6ZUlubGluZShjb250ZW50LCBlYXQubm93KCkpXG4gICAgfSk7XG4gIH1cblxuICBub3cgPSBlYXQubm93KCk7XG4gIG5vdy5jb2x1bW4gKz0gaW50cm8ubGVuZ3RoO1xuICBub3cub2Zmc2V0ICs9IGludHJvLmxlbmd0aDtcbiAgaWRlbnRpZmllciA9IHJlZmVyZW5jZVR5cGUgPT09IFJFRkVSRU5DRV9UWVBFX0ZVTEwgPyBpZGVudGlmaWVyIDogY29udGVudDtcblxuICBub2RlID0ge1xuICAgIHR5cGU6IHR5cGUgKyAnUmVmZXJlbmNlJyxcbiAgICBpZGVudGlmaWVyOiBub3JtYWxpemUoaWRlbnRpZmllcilcbiAgfTtcblxuICBpZiAodHlwZSA9PT0gVF9MSU5LIHx8IHR5cGUgPT09IFRfSU1BR0UpIHtcbiAgICBub2RlLnJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFRfTElOSykge1xuICAgIGV4aXQgPSBzZWxmLmVudGVyTGluaygpO1xuICAgIG5vZGUuY2hpbGRyZW4gPSBzZWxmLnRva2VuaXplSW5saW5lKGNvbnRlbnQsIG5vdyk7XG4gICAgZXhpdCgpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFRfSU1BR0UpIHtcbiAgICBub2RlLmFsdCA9IHNlbGYuZGVjb2RlLnJhdyhzZWxmLnVuZXNjYXBlKGNvbnRlbnQpLCBub3cpIHx8IG51bGw7XG4gIH1cblxuICByZXR1cm4gZWF0KHN1YnZhbHVlKShub2RlKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRyaW0gPSByZXF1aXJlKCd0cmltJyk7XG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG52YXIgbG9jYXRlID0gcmVxdWlyZSgnLi4vbG9jYXRlL3N0cm9uZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cm9uZztcbnN0cm9uZy5sb2NhdG9yID0gbG9jYXRlO1xuXG52YXIgQ19BU1RFUklTSyA9ICcqJztcbnZhciBDX1VOREVSU0NPUkUgPSAnXyc7XG5cbmZ1bmN0aW9uIHN0cm9uZyhlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgdmFyIG5vdztcbiAgdmFyIHBlZGFudGljO1xuICB2YXIgbWFya2VyO1xuICB2YXIgcXVldWU7XG4gIHZhciBzdWJ2YWx1ZTtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHByZXY7XG5cbiAgaWYgKFxuICAgIChjaGFyYWN0ZXIgIT09IENfQVNURVJJU0sgJiYgY2hhcmFjdGVyICE9PSBDX1VOREVSU0NPUkUpIHx8XG4gICAgdmFsdWUuY2hhckF0KCsraW5kZXgpICE9PSBjaGFyYWN0ZXJcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcGVkYW50aWMgPSBzZWxmLm9wdGlvbnMucGVkYW50aWM7XG4gIG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgc3VidmFsdWUgPSBtYXJrZXIgKyBtYXJrZXI7XG4gIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgaW5kZXgrKztcbiAgcXVldWUgPSAnJztcbiAgY2hhcmFjdGVyID0gJyc7XG5cbiAgaWYgKHBlZGFudGljICYmIHdoaXRlc3BhY2UodmFsdWUuY2hhckF0KGluZGV4KSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBwcmV2ID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoXG4gICAgICBjaGFyYWN0ZXIgPT09IG1hcmtlciAmJlxuICAgICAgdmFsdWUuY2hhckF0KGluZGV4ICsgMSkgPT09IG1hcmtlciAmJlxuICAgICAgKCFwZWRhbnRpYyB8fCAhd2hpdGVzcGFjZShwcmV2KSlcbiAgICApIHtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCArIDIpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyICE9PSBtYXJrZXIpIHtcbiAgICAgICAgaWYgKCF0cmltKHF1ZXVlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbm93ID0gZWF0Lm5vdygpO1xuICAgICAgICBub3cuY29sdW1uICs9IDI7XG4gICAgICAgIG5vdy5vZmZzZXQgKz0gMjtcblxuICAgICAgICByZXR1cm4gZWF0KHN1YnZhbHVlICsgcXVldWUgKyBzdWJ2YWx1ZSkoe1xuICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgIGNoaWxkcmVuOiBzZWxmLnRva2VuaXplSW5saW5lKHF1ZXVlLCBub3cpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcGVkYW50aWMgJiYgY2hhcmFjdGVyID09PSAnXFxcXCcpIHtcbiAgICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdCgrK2luZGV4KTtcbiAgICB9XG5cbiAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgaW5kZXgrKztcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2hpdGVzcGFjZSA9IHJlcXVpcmUoJ2lzLXdoaXRlc3BhY2UtY2hhcmFjdGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdGFibGU7XG5cbnZhciBDX0JBQ0tTTEFTSCA9ICdcXFxcJztcbnZhciBDX1RJQ0sgPSAnYCc7XG52YXIgQ19EQVNIID0gJy0nO1xudmFyIENfUElQRSA9ICd8JztcbnZhciBDX0NPTE9OID0gJzonO1xudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcblxudmFyIE1JTl9UQUJMRV9DT0xVTU5TID0gMTtcbnZhciBNSU5fVEFCTEVfUk9XUyA9IDI7XG5cbnZhciBUQUJMRV9BTElHTl9MRUZUID0gJ2xlZnQnO1xudmFyIFRBQkxFX0FMSUdOX0NFTlRFUiA9ICdjZW50ZXInO1xudmFyIFRBQkxFX0FMSUdOX1JJR0hUID0gJ3JpZ2h0JztcbnZhciBUQUJMRV9BTElHTl9OT05FID0gbnVsbDtcblxuZnVuY3Rpb24gdGFibGUoZWF0LCB2YWx1ZSwgc2lsZW50KSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGluZGV4O1xuICB2YXIgYWxpZ25tZW50cztcbiAgdmFyIGFsaWdubWVudDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcm93O1xuICB2YXIgbGVuZ3RoO1xuICB2YXIgbGluZXM7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIGNoYXJhY3RlcjtcbiAgdmFyIGhhc0Rhc2g7XG4gIHZhciBhbGlnbjtcbiAgdmFyIGNlbGw7XG4gIHZhciBwcmVhbWJsZTtcbiAgdmFyIGNvdW50O1xuICB2YXIgb3BlbmluZztcbiAgdmFyIG5vdztcbiAgdmFyIHBvc2l0aW9uO1xuICB2YXIgbGluZUNvdW50O1xuICB2YXIgbGluZTtcbiAgdmFyIHJvd3M7XG4gIHZhciB0YWJsZTtcbiAgdmFyIGxpbmVJbmRleDtcbiAgdmFyIHBpcGVJbmRleDtcbiAgdmFyIGZpcnN0O1xuXG4gIC8qIEV4aXQgd2hlbiBub3QgaW4gZ2ZtLW1vZGUuICovXG4gIGlmICghc2VsZi5vcHRpb25zLmdmbSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qIEdldCB0aGUgcm93cy5cbiAgICogRGV0ZWN0aW5nIHRhYmxlcyBzb29uIGlzIGhhcmQsIHNvIHRoZXJlIGFyZSBzb21lXG4gICAqIGNoZWNrcyBmb3IgcGVyZm9ybWFuY2UgaGVyZSwgc3VjaCBhcyB0aGUgbWluaW11bVxuICAgKiBudW1iZXIgb2Ygcm93cywgYW5kIGFsbG93ZWQgY2hhcmFjdGVycyBpbiB0aGVcbiAgICogYWxpZ25tZW50IHJvdy4gKi9cbiAgaW5kZXggPSAwO1xuICBsaW5lQ291bnQgPSAwO1xuICBsZW5ndGggPSB2YWx1ZS5sZW5ndGggKyAxO1xuICBsaW5lcyA9IFtdO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGxpbmVJbmRleCA9IHZhbHVlLmluZGV4T2YoQ19ORVdMSU5FLCBpbmRleCk7XG4gICAgcGlwZUluZGV4ID0gdmFsdWUuaW5kZXhPZihDX1BJUEUsIGluZGV4ICsgMSk7XG5cbiAgICBpZiAobGluZUluZGV4ID09PSAtMSkge1xuICAgICAgbGluZUluZGV4ID0gdmFsdWUubGVuZ3RoO1xuICAgIH1cblxuICAgIGlmIChwaXBlSW5kZXggPT09IC0xIHx8IHBpcGVJbmRleCA+IGxpbmVJbmRleCkge1xuICAgICAgaWYgKGxpbmVDb3VudCA8IE1JTl9UQUJMRV9ST1dTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCh2YWx1ZS5zbGljZShpbmRleCwgbGluZUluZGV4KSk7XG4gICAgbGluZUNvdW50Kys7XG4gICAgaW5kZXggPSBsaW5lSW5kZXggKyAxO1xuICB9XG5cbiAgLyogUGFyc2UgdGhlIGFsaWdubWVudCByb3cuICovXG4gIHN1YnZhbHVlID0gbGluZXMuam9pbihDX05FV0xJTkUpO1xuICBhbGlnbm1lbnRzID0gbGluZXMuc3BsaWNlKDEsIDEpWzBdIHx8IFtdO1xuICBpbmRleCA9IDA7XG4gIGxlbmd0aCA9IGFsaWdubWVudHMubGVuZ3RoO1xuICBsaW5lQ291bnQtLTtcbiAgYWxpZ25tZW50ID0gZmFsc2U7XG4gIGFsaWduID0gW107XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY2hhcmFjdGVyID0gYWxpZ25tZW50cy5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gQ19QSVBFKSB7XG4gICAgICBoYXNEYXNoID0gbnVsbDtcblxuICAgICAgaWYgKGFsaWdubWVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpcnN0ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWxpZ24ucHVzaChhbGlnbm1lbnQpO1xuICAgICAgICBhbGlnbm1lbnQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQ19EQVNIKSB7XG4gICAgICBoYXNEYXNoID0gdHJ1ZTtcbiAgICAgIGFsaWdubWVudCA9IGFsaWdubWVudCB8fCBUQUJMRV9BTElHTl9OT05FO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX0NPTE9OKSB7XG4gICAgICBpZiAoYWxpZ25tZW50ID09PSBUQUJMRV9BTElHTl9MRUZUKSB7XG4gICAgICAgIGFsaWdubWVudCA9IFRBQkxFX0FMSUdOX0NFTlRFUjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzRGFzaCAmJiBhbGlnbm1lbnQgPT09IFRBQkxFX0FMSUdOX05PTkUpIHtcbiAgICAgICAgYWxpZ25tZW50ID0gVEFCTEVfQUxJR05fUklHSFQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGlnbm1lbnQgPSBUQUJMRV9BTElHTl9MRUZUO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIXdoaXRlc3BhY2UoY2hhcmFjdGVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAoYWxpZ25tZW50ICE9PSBmYWxzZSkge1xuICAgIGFsaWduLnB1c2goYWxpZ25tZW50KTtcbiAgfVxuXG4gIC8qIEV4aXQgd2hlbiB3aXRob3V0IGVub3VnaCBjb2x1bW5zLiAqL1xuICBpZiAoYWxpZ24ubGVuZ3RoIDwgTUlOX1RBQkxFX0NPTFVNTlMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qIFBhcnNlIHRoZSByb3dzLiAqL1xuICBwb3NpdGlvbiA9IC0xO1xuICByb3dzID0gW107XG5cbiAgdGFibGUgPSBlYXQoc3VidmFsdWUpLnJlc2V0KHtcbiAgICB0eXBlOiAndGFibGUnLFxuICAgIGFsaWduOiBhbGlnbixcbiAgICBjaGlsZHJlbjogcm93c1xuICB9KTtcblxuICB3aGlsZSAoKytwb3NpdGlvbiA8IGxpbmVDb3VudCkge1xuICAgIGxpbmUgPSBsaW5lc1twb3NpdGlvbl07XG4gICAgcm93ID0ge3R5cGU6ICd0YWJsZVJvdycsIGNoaWxkcmVuOiBbXX07XG5cbiAgICAvKiBFYXQgYSBuZXdsaW5lIGNoYXJhY3RlciB3aGVuIHRoaXMgaXMgbm90IHRoZVxuICAgICAqIGZpcnN0IHJvdy4gKi9cbiAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgIGVhdChDX05FV0xJTkUpO1xuICAgIH1cblxuICAgIC8qIEVhdCB0aGUgcm93LiAqL1xuICAgIGVhdChsaW5lKS5yZXNldChyb3csIHRhYmxlKTtcblxuICAgIGxlbmd0aCA9IGxpbmUubGVuZ3RoICsgMTtcbiAgICBpbmRleCA9IDA7XG4gICAgcXVldWUgPSAnJztcbiAgICBjZWxsID0gJyc7XG4gICAgcHJlYW1ibGUgPSB0cnVlO1xuICAgIGNvdW50ID0gbnVsbDtcbiAgICBvcGVuaW5nID0gbnVsbDtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgY2hhcmFjdGVyID0gbGluZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBDX1RBQiB8fCBjaGFyYWN0ZXIgPT09IENfU1BBQ0UpIHtcbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWF0KGNoYXJhY3Rlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJycgfHwgY2hhcmFjdGVyID09PSBDX1BJUEUpIHtcbiAgICAgICAgaWYgKHByZWFtYmxlKSB7XG4gICAgICAgICAgZWF0KGNoYXJhY3Rlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoYXJhY3RlciAmJiBvcGVuaW5nKSB7XG4gICAgICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKChjZWxsIHx8IGNoYXJhY3RlcikgJiYgIXByZWFtYmxlKSB7XG4gICAgICAgICAgICBzdWJ2YWx1ZSA9IGNlbGw7XG5cbiAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZS5zbGljZSgwLCBxdWV1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLmNoYXJBdChxdWV1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcbiAgICAgICAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5vdyA9IGVhdC5ub3coKTtcblxuICAgICAgICAgICAgZWF0KHN1YnZhbHVlKSh7XG4gICAgICAgICAgICAgIHR5cGU6ICd0YWJsZUNlbGwnLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogc2VsZi50b2tlbml6ZUlubGluZShjZWxsLCBub3cpXG4gICAgICAgICAgICB9LCByb3cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVhdChxdWV1ZSArIGNoYXJhY3Rlcik7XG5cbiAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICAgIGNlbGwgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlKSB7XG4gICAgICAgICAgY2VsbCArPSBxdWV1ZTtcbiAgICAgICAgICBxdWV1ZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbCArPSBjaGFyYWN0ZXI7XG5cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gQ19CQUNLU0xBU0ggJiYgaW5kZXggIT09IGxlbmd0aCAtIDIpIHtcbiAgICAgICAgICBjZWxsICs9IGxpbmUuY2hhckF0KGluZGV4ICsgMSk7XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IENfVElDSykge1xuICAgICAgICAgIGNvdW50ID0gMTtcblxuICAgICAgICAgIHdoaWxlIChsaW5lLmNoYXJBdChpbmRleCArIDEpID09PSBjaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIGNlbGwgKz0gY2hhcmFjdGVyO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gY291bnQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA+PSBvcGVuaW5nKSB7XG4gICAgICAgICAgICBvcGVuaW5nID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJlYW1ibGUgPSBmYWxzZTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuXG4gICAgLyogRWF0IHRoZSBhbGlnbm1lbnQgcm93LiAqL1xuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIGVhdChDX05FV0xJTkUgKyBhbGlnbm1lbnRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdGV4dDtcblxuZnVuY3Rpb24gdGV4dChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbWV0aG9kcztcbiAgdmFyIHRva2VuaXplcnM7XG4gIHZhciBpbmRleDtcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIHN1YnZhbHVlO1xuICB2YXIgcG9zaXRpb247XG4gIHZhciB0b2tlbml6ZXI7XG4gIHZhciBuYW1lO1xuICB2YXIgbWluO1xuICB2YXIgbm93O1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAtIG5ldmVyIHVzZWQgKHlldCkgKi9cbiAgaWYgKHNpbGVudCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbWV0aG9kcyA9IHNlbGYuaW5saW5lTWV0aG9kcztcbiAgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7XG4gIHRva2VuaXplcnMgPSBzZWxmLmlubGluZVRva2VuaXplcnM7XG4gIGluZGV4ID0gLTE7XG4gIG1pbiA9IHZhbHVlLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIG5hbWUgPSBtZXRob2RzW2luZGV4XTtcblxuICAgIGlmIChuYW1lID09PSAndGV4dCcgfHwgIXRva2VuaXplcnNbbmFtZV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRva2VuaXplciA9IHRva2VuaXplcnNbbmFtZV0ubG9jYXRvcjtcblxuICAgIGlmICghdG9rZW5pemVyKSB7XG4gICAgICBlYXQuZmlsZS5mYWlsKCdNaXNzaW5nIGxvY2F0b3I6IGAnICsgbmFtZSArICdgJyk7XG4gICAgfVxuXG4gICAgcG9zaXRpb24gPSB0b2tlbml6ZXIuY2FsbChzZWxmLCB2YWx1ZSwgMSk7XG5cbiAgICBpZiAocG9zaXRpb24gIT09IC0xICYmIHBvc2l0aW9uIDwgbWluKSB7XG4gICAgICBtaW4gPSBwb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICBzdWJ2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIG1pbik7XG4gIG5vdyA9IGVhdC5ub3coKTtcblxuICBzZWxmLmRlY29kZShzdWJ2YWx1ZSwgbm93LCBmdW5jdGlvbiAoY29udGVudCwgcG9zaXRpb24sIHNvdXJjZSkge1xuICAgIGVhdChzb3VyY2UgfHwgY29udGVudCkoe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgdmFsdWU6IGNvbnRlbnRcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdGhlbWF0aWNCcmVhaztcblxudmFyIENfTkVXTElORSA9ICdcXG4nO1xudmFyIENfVEFCID0gJ1xcdCc7XG52YXIgQ19TUEFDRSA9ICcgJztcbnZhciBDX0FTVEVSSVNLID0gJyonO1xudmFyIENfVU5ERVJTQ09SRSA9ICdfJztcbnZhciBDX0RBU0ggPSAnLSc7XG5cbnZhciBUSEVNQVRJQ19CUkVBS19NQVJLRVJfQ09VTlQgPSAzO1xuXG5mdW5jdGlvbiB0aGVtYXRpY0JyZWFrKGVhdCwgdmFsdWUsIHNpbGVudCkge1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGxlbmd0aCA9IHZhbHVlLmxlbmd0aCArIDE7XG4gIHZhciBzdWJ2YWx1ZSA9ICcnO1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgbWFya2VyO1xuICB2YXIgbWFya2VyQ291bnQ7XG4gIHZhciBxdWV1ZTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCk7XG5cbiAgICBpZiAoY2hhcmFjdGVyICE9PSBDX1RBQiAmJiBjaGFyYWN0ZXIgIT09IENfU1BBQ0UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHN1YnZhbHVlICs9IGNoYXJhY3RlcjtcbiAgfVxuXG4gIGlmIChcbiAgICBjaGFyYWN0ZXIgIT09IENfQVNURVJJU0sgJiZcbiAgICBjaGFyYWN0ZXIgIT09IENfREFTSCAmJlxuICAgIGNoYXJhY3RlciAhPT0gQ19VTkRFUlNDT1JFXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG1hcmtlciA9IGNoYXJhY3RlcjtcbiAgc3VidmFsdWUgKz0gY2hhcmFjdGVyO1xuICBtYXJrZXJDb3VudCA9IDE7XG4gIHF1ZXVlID0gJyc7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNoYXJhY3RlciA9PT0gbWFya2VyKSB7XG4gICAgICBtYXJrZXJDb3VudCsrO1xuICAgICAgc3VidmFsdWUgKz0gcXVldWUgKyBtYXJrZXI7XG4gICAgICBxdWV1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSBDX1NQQUNFKSB7XG4gICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG1hcmtlckNvdW50ID49IFRIRU1BVElDX0JSRUFLX01BUktFUl9DT1VOVCAmJlxuICAgICAgKCFjaGFyYWN0ZXIgfHwgY2hhcmFjdGVyID09PSBDX05FV0xJTkUpXG4gICAgKSB7XG4gICAgICBzdWJ2YWx1ZSArPSBxdWV1ZTtcblxuICAgICAgaWYgKHNpbGVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe3R5cGU6ICd0aGVtYXRpY0JyZWFrJ30pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWNvZGUgPSByZXF1aXJlKCdwYXJzZS1lbnRpdGllcycpO1xudmFyIHdoaXRlc3BhY2UgPSByZXF1aXJlKCdpcy13aGl0ZXNwYWNlLWNoYXJhY3RlcicpO1xudmFyIGxvY2F0ZSA9IHJlcXVpcmUoJy4uL2xvY2F0ZS91cmwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1cmw7XG51cmwubG9jYXRvciA9IGxvY2F0ZTtcbnVybC5ub3RJbkxpbmsgPSB0cnVlO1xuXG52YXIgQ19CUkFDS0VUX09QRU4gPSAnWyc7XG52YXIgQ19CUkFDS0VUX0NMT1NFID0gJ10nO1xudmFyIENfUEFSRU5fT1BFTiA9ICcoJztcbnZhciBDX1BBUkVOX0NMT1NFID0gJyknO1xudmFyIENfTFQgPSAnPCc7XG52YXIgQ19BVF9TSUdOID0gJ0AnO1xuXG52YXIgSFRUUF9QUk9UT0NPTCA9ICdodHRwOi8vJztcbnZhciBIVFRQU19QUk9UT0NPTCA9ICdodHRwczovLyc7XG52YXIgTUFJTFRPX1BST1RPQ09MID0gJ21haWx0bzonO1xuXG52YXIgUFJPVE9DT0xTID0gW1xuICBIVFRQX1BST1RPQ09MLFxuICBIVFRQU19QUk9UT0NPTCxcbiAgTUFJTFRPX1BST1RPQ09MXG5dO1xuXG52YXIgUFJPVE9DT0xTX0xFTkdUSCA9IFBST1RPQ09MUy5sZW5ndGg7XG5cbmZ1bmN0aW9uIHVybChlYXQsIHZhbHVlLCBzaWxlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgc3VidmFsdWU7XG4gIHZhciBjb250ZW50O1xuICB2YXIgY2hhcmFjdGVyO1xuICB2YXIgaW5kZXg7XG4gIHZhciBwb3NpdGlvbjtcbiAgdmFyIHByb3RvY29sO1xuICB2YXIgbWF0Y2g7XG4gIHZhciBsZW5ndGg7XG4gIHZhciBxdWV1ZTtcbiAgdmFyIHBhcmVuQ291bnQ7XG4gIHZhciBuZXh0Q2hhcmFjdGVyO1xuICB2YXIgZXhpdDtcblxuICBpZiAoIXNlbGYub3B0aW9ucy5nZm0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdWJ2YWx1ZSA9ICcnO1xuICBpbmRleCA9IC0xO1xuICBsZW5ndGggPSBQUk9UT0NPTFNfTEVOR1RIO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcHJvdG9jb2wgPSBQUk9UT0NPTFNbaW5kZXhdO1xuICAgIG1hdGNoID0gdmFsdWUuc2xpY2UoMCwgcHJvdG9jb2wubGVuZ3RoKTtcblxuICAgIGlmIChtYXRjaC50b0xvd2VyQ2FzZSgpID09PSBwcm90b2NvbCkge1xuICAgICAgc3VidmFsdWUgPSBtYXRjaDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc3VidmFsdWUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbmRleCA9IHN1YnZhbHVlLmxlbmd0aDtcbiAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICBxdWV1ZSA9ICcnO1xuICBwYXJlbkNvdW50ID0gMDtcblxuICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuXG4gICAgaWYgKHdoaXRlc3BhY2UoY2hhcmFjdGVyKSB8fCBjaGFyYWN0ZXIgPT09IENfTFQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNoYXJhY3RlciA9PT0gJy4nIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICcsJyB8fFxuICAgICAgY2hhcmFjdGVyID09PSAnOicgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJzsnIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICdcIicgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJ1xcJycgfHxcbiAgICAgIGNoYXJhY3RlciA9PT0gJyknIHx8XG4gICAgICBjaGFyYWN0ZXIgPT09ICddJ1xuICAgICkge1xuICAgICAgbmV4dENoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChpbmRleCArIDEpO1xuXG4gICAgICBpZiAoIW5leHRDaGFyYWN0ZXIgfHwgd2hpdGVzcGFjZShuZXh0Q2hhcmFjdGVyKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhcmFjdGVyID09PSBDX1BBUkVOX09QRU4gfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfT1BFTikge1xuICAgICAgcGFyZW5Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjaGFyYWN0ZXIgPT09IENfUEFSRU5fQ0xPU0UgfHwgY2hhcmFjdGVyID09PSBDX0JSQUNLRVRfQ0xPU0UpIHtcbiAgICAgIHBhcmVuQ291bnQtLTtcblxuICAgICAgaWYgKHBhcmVuQ291bnQgPCAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHF1ZXVlICs9IGNoYXJhY3RlcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKCFxdWV1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN1YnZhbHVlICs9IHF1ZXVlO1xuICBjb250ZW50ID0gc3VidmFsdWU7XG5cbiAgaWYgKHByb3RvY29sID09PSBNQUlMVE9fUFJPVE9DT0wpIHtcbiAgICBwb3NpdGlvbiA9IHF1ZXVlLmluZGV4T2YoQ19BVF9TSUdOKTtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHIoTUFJTFRPX1BST1RPQ09MLmxlbmd0aCk7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgLSBuZXZlciB1c2VkICh5ZXQpICovXG4gIGlmIChzaWxlbnQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGV4aXQgPSBzZWxmLmVudGVyTGluaygpO1xuICBjb250ZW50ID0gc2VsZi50b2tlbml6ZUlubGluZShjb250ZW50LCBlYXQubm93KCkpO1xuICBleGl0KCk7XG5cbiAgcmV0dXJuIGVhdChzdWJ2YWx1ZSkoe1xuICAgIHR5cGU6ICdsaW5rJyxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB1cmw6IGRlY29kZShzdWJ2YWx1ZSksXG4gICAgY2hpbGRyZW46IGNvbnRlbnRcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxudmFyIE1FUkdFQUJMRV9OT0RFUyA9IHtcbiAgdGV4dDogbWVyZ2VUZXh0LFxuICBibG9ja3F1b3RlOiBtZXJnZUJsb2NrcXVvdGVcbn07XG5cbi8qIENoZWNrIHdoZXRoZXIgYSBub2RlIGlzIG1lcmdlYWJsZSB3aXRoIGFkamFjZW50IG5vZGVzLiAqL1xuZnVuY3Rpb24gbWVyZ2VhYmxlKG5vZGUpIHtcbiAgdmFyIHN0YXJ0O1xuICB2YXIgZW5kO1xuXG4gIGlmIChub2RlLnR5cGUgIT09ICd0ZXh0JyB8fCAhbm9kZS5wb3NpdGlvbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhcnQgPSBub2RlLnBvc2l0aW9uLnN0YXJ0O1xuICBlbmQgPSBub2RlLnBvc2l0aW9uLmVuZDtcblxuICAvKiBPbmx5IG1lcmdlIG5vZGVzIHdoaWNoIG9jY3VweSB0aGUgc2FtZSBzaXplIGFzIHRoZWlyXG4gICAqIGB2YWx1ZWAuICovXG4gIHJldHVybiBzdGFydC5saW5lICE9PSBlbmQubGluZSB8fFxuICAgICAgZW5kLmNvbHVtbiAtIHN0YXJ0LmNvbHVtbiA9PT0gbm9kZS52YWx1ZS5sZW5ndGg7XG59XG5cbi8qIE1lcmdlIHR3byB0ZXh0IG5vZGVzOiBgbm9kZWAgaW50byBgcHJldmAuICovXG5mdW5jdGlvbiBtZXJnZVRleHQocHJldiwgbm9kZSkge1xuICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG5cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8qIE1lcmdlIHR3byBibG9ja3F1b3RlczogYG5vZGVgIGludG8gYHByZXZgLCB1bmxlc3MgaW5cbiAqIENvbW1vbk1hcmsgbW9kZS4gKi9cbmZ1bmN0aW9uIG1lcmdlQmxvY2txdW90ZShwcmV2LCBub2RlKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuY29tbW9ubWFyaykge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgcHJldi5jaGlsZHJlbiA9IHByZXYuY2hpbGRyZW4uY29uY2F0KG5vZGUuY2hpbGRyZW4pO1xuXG4gIHJldHVybiBwcmV2O1xufVxuXG4vKiBDb25zdHJ1Y3QgYSB0b2tlbml6ZXIuICBUaGlzIGNyZWF0ZXMgYm90aFxuICogYHRva2VuaXplSW5saW5lYCBhbmQgYHRva2VuaXplQmxvY2tgLiAqL1xuZnVuY3Rpb24gZmFjdG9yeSh0eXBlKSB7XG4gIHJldHVybiB0b2tlbml6ZTtcblxuICAvKiBUb2tlbml6ZXIgZm9yIGEgYm91bmQgYHR5cGVgLiAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSwgbG9jYXRpb24pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9mZnNldCA9IHNlbGYub2Zmc2V0O1xuICAgIHZhciB0b2tlbnMgPSBbXTtcbiAgICB2YXIgbWV0aG9kcyA9IHNlbGZbdHlwZSArICdNZXRob2RzJ107XG4gICAgdmFyIHRva2VuaXplcnMgPSBzZWxmW3R5cGUgKyAnVG9rZW5pemVycyddO1xuICAgIHZhciBsaW5lID0gbG9jYXRpb24ubGluZTtcbiAgICB2YXIgY29sdW1uID0gbG9jYXRpb24uY29sdW1uO1xuICAgIHZhciBpbmRleDtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHZhciBtZXRob2Q7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIG1hdGNoZWQ7XG4gICAgdmFyIHZhbHVlTGVuZ3RoO1xuXG4gICAgLyogVHJpbSB3aGl0ZSBzcGFjZSBvbmx5IGxpbmVzLiAqL1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuXG4gICAgLyogRXhwb3NlIG9uIGBlYXRgLiAqL1xuICAgIGVhdC5ub3cgPSBub3c7XG4gICAgZWF0LmZpbGUgPSBzZWxmLmZpbGU7XG5cbiAgICAvKiBTeW5jIGluaXRpYWwgb2Zmc2V0LiAqL1xuICAgIHVwZGF0ZVBvc2l0aW9uKCcnKTtcblxuICAgIC8qIEl0ZXJhdGUgb3ZlciBgdmFsdWVgLCBhbmQgaXRlcmF0ZSBvdmVyIGFsbFxuICAgICAqIHRva2VuaXplcnMuICBXaGVuIG9uZSBlYXRzIHNvbWV0aGluZywgcmUtaXRlcmF0ZVxuICAgICAqIHdpdGggdGhlIHJlbWFpbmluZyB2YWx1ZS4gIElmIG5vIHRva2VuaXplciBlYXRzLFxuICAgICAqIHNvbWV0aGluZyBmYWlsZWQgKHNob3VsZCBub3QgaGFwcGVuKSBhbmQgYW5cbiAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLiAqL1xuICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgaW5kZXggPSAtMTtcbiAgICAgIGxlbmd0aCA9IG1ldGhvZHMubGVuZ3RoO1xuICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBuYW1lID0gbWV0aG9kc1tpbmRleF07XG4gICAgICAgIG1ldGhvZCA9IHRva2VuaXplcnNbbmFtZV07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldGhvZCAmJlxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovICghbWV0aG9kLm9ubHlBdFN0YXJ0IHx8IHNlbGYuYXRTdGFydCkgJiZcbiAgICAgICAgICAoIW1ldGhvZC5ub3RJbkxpc3QgfHwgIXNlbGYuaW5MaXN0KSAmJlxuICAgICAgICAgICghbWV0aG9kLm5vdEluQmxvY2sgfHwgIXNlbGYuaW5CbG9jaykgJiZcbiAgICAgICAgICAoIW1ldGhvZC5ub3RJbkxpbmsgfHwgIXNlbGYuaW5MaW5rKVxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgIG1ldGhvZC5hcHBseShzZWxmLCBbZWF0LCB2YWx1ZV0pO1xuXG4gICAgICAgICAgbWF0Y2hlZCA9IHZhbHVlTGVuZ3RoICE9PSB2YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgIHNlbGYuZmlsZS5mYWlsKG5ldyBFcnJvcignSW5maW5pdGUgbG9vcCcpLCBlYXQubm93KCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlbGYuZW9mID0gbm93KCk7XG5cbiAgICByZXR1cm4gdG9rZW5zO1xuXG4gICAgLyogVXBkYXRlIGxpbmUsIGNvbHVtbiwgYW5kIG9mZnNldCBiYXNlZCBvblxuICAgICAqIGB2YWx1ZWAuICovXG4gICAgZnVuY3Rpb24gdXBkYXRlUG9zaXRpb24oc3VidmFsdWUpIHtcbiAgICAgIHZhciBsYXN0SW5kZXggPSAtMTtcbiAgICAgIHZhciBpbmRleCA9IHN1YnZhbHVlLmluZGV4T2YoJ1xcbicpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxpbmUrKztcbiAgICAgICAgbGFzdEluZGV4ID0gaW5kZXg7XG4gICAgICAgIGluZGV4ID0gc3VidmFsdWUuaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxhc3RJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgY29sdW1uICs9IHN1YnZhbHVlLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbHVtbiA9IHN1YnZhbHVlLmxlbmd0aCAtIGxhc3RJbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmUgaW4gb2Zmc2V0KSB7XG4gICAgICAgIGlmIChsYXN0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgY29sdW1uICs9IG9mZnNldFtsaW5lXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4gPD0gb2Zmc2V0W2xpbmVdKSB7XG4gICAgICAgICAgY29sdW1uID0gb2Zmc2V0W2xpbmVdICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEdldCBvZmZzZXQuICBDYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNcbiAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2UncyBvZmZzZXRzLiAqL1xuICAgIGZ1bmN0aW9uIGdldE9mZnNldCgpIHtcbiAgICAgIHZhciBpbmRlbnRhdGlvbiA9IFtdO1xuICAgICAgdmFyIHBvcyA9IGxpbmUgKyAxO1xuXG4gICAgICAvKiBEb25lLiAgQ2FsbGVkIHdoZW4gdGhlIGxhc3QgY2hhcmFjdGVyIGlzXG4gICAgICAgKiBlYXRlbiB0byByZXRyaWV2ZSB0aGUgcmFuZ2XigJlzIG9mZnNldHMuICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdCA9IGxpbmUgKyAxO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPCBsYXN0KSB7XG4gICAgICAgICAgaW5kZW50YXRpb24ucHVzaCgob2Zmc2V0W3Bvc10gfHwgMCkgKyAxKTtcblxuICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGVudGF0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBHZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uICovXG4gICAgZnVuY3Rpb24gbm93KCkge1xuICAgICAgdmFyIHBvcyA9IHtsaW5lOiBsaW5lLCBjb2x1bW46IGNvbHVtbn07XG5cbiAgICAgIHBvcy5vZmZzZXQgPSBzZWxmLnRvT2Zmc2V0KHBvcyk7XG5cbiAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgLyogU3RvcmUgcG9zaXRpb24gaW5mb3JtYXRpb24gZm9yIGEgbm9kZS4gKi9cbiAgICBmdW5jdGlvbiBQb3NpdGlvbihzdGFydCkge1xuICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgdGhpcy5lbmQgPSBub3coKTtcbiAgICB9XG5cbiAgICAvKiBUaHJvdyB3aGVuIGEgdmFsdWUgaXMgaW5jb3JyZWN0bHkgZWF0ZW4uXG4gICAgICogVGhpcyBzaG91bGRu4oCZdCBoYXBwZW4gYnV0IHdpbGwgdGhyb3cgb24gbmV3LFxuICAgICAqIGluY29ycmVjdCBydWxlcy4gKi9cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUVhdChzdWJ2YWx1ZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAodmFsdWUuc3Vic3RyaW5nKDAsIHN1YnZhbHVlLmxlbmd0aCkgIT09IHN1YnZhbHVlKSB7XG4gICAgICAgIC8qIENhcHR1cmUgc3RhY2stdHJhY2UuICovXG4gICAgICAgIHNlbGYuZmlsZS5mYWlsKFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbmNvcnJlY3RseSBlYXRlbiB2YWx1ZTogcGxlYXNlIHJlcG9ydCB0aGlzICcgK1xuICAgICAgICAgICAgJ3dhcm5pbmcgb24gaHR0cDovL2dpdC5pby92ZzVGdCdcbiAgICAgICAgICApLFxuICAgICAgICAgIG5vdygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogTWFyayBwb3NpdGlvbiBhbmQgcGF0Y2ggYG5vZGUucG9zaXRpb25gLiAqL1xuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKCkge1xuICAgICAgdmFyIGJlZm9yZSA9IG5vdygpO1xuXG4gICAgICByZXR1cm4gdXBkYXRlO1xuXG4gICAgICAvKiBBZGQgdGhlIHBvc2l0aW9uIHRvIGEgbm9kZS4gKi9cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZShub2RlLCBpbmRlbnQpIHtcbiAgICAgICAgdmFyIHByZXYgPSBub2RlLnBvc2l0aW9uO1xuICAgICAgICB2YXIgc3RhcnQgPSBwcmV2ID8gcHJldi5zdGFydCA6IGJlZm9yZTtcbiAgICAgICAgdmFyIGNvbWJpbmVkID0gW107XG4gICAgICAgIHZhciBuID0gcHJldiAmJiBwcmV2LmVuZC5saW5lO1xuICAgICAgICB2YXIgbCA9IGJlZm9yZS5saW5lO1xuXG4gICAgICAgIG5vZGUucG9zaXRpb24gPSBuZXcgUG9zaXRpb24oc3RhcnQpO1xuXG4gICAgICAgIC8qIElmIHRoZXJlIHdhcyBhbHJlYWR5IGEgYHBvc2l0aW9uYCwgdGhpc1xuICAgICAgICAgKiBub2RlIHdhcyBtZXJnZWQuICBGaXhpbmcgYHN0YXJ0YCB3YXNu4oCZdFxuICAgICAgICAgKiBoYXJkLCBidXQgdGhlIGluZGVudCBpcyBkaWZmZXJlbnQuXG4gICAgICAgICAqIEVzcGVjaWFsbHkgYmVjYXVzZSBzb21lIGluZm9ybWF0aW9uLCB0aGVcbiAgICAgICAgICogaW5kZW50IGJldHdlZW4gYG5gIGFuZCBgbGAgd2FzbuKAmXRcbiAgICAgICAgICogdHJhY2tlZC4gIEx1Y2tpbHksIHRoYXQgc3BhY2UgaXNcbiAgICAgICAgICogKHNob3VsZCBiZT8pIGVtcHR5LCBzbyB3ZSBjYW4gc2FmZWx5XG4gICAgICAgICAqIGNoZWNrIGZvciBpdCBub3cuICovXG4gICAgICAgIGlmIChwcmV2ICYmIGluZGVudCAmJiBwcmV2LmluZGVudCkge1xuICAgICAgICAgIGNvbWJpbmVkID0gcHJldi5pbmRlbnQ7XG5cbiAgICAgICAgICBpZiAobiA8IGwpIHtcbiAgICAgICAgICAgIHdoaWxlICgrK24gPCBsKSB7XG4gICAgICAgICAgICAgIGNvbWJpbmVkLnB1c2goKG9mZnNldFtuXSB8fCAwKSArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb21iaW5lZC5wdXNoKGJlZm9yZS5jb2x1bW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGVudCA9IGNvbWJpbmVkLmNvbmNhdChpbmRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5wb3NpdGlvbi5pbmRlbnQgPSBpbmRlbnQgfHwgW107XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogQWRkIGBub2RlYCB0byBgcGFyZW50YHMgY2hpbGRyZW4gb3IgdG8gYHRva2Vuc2AuXG4gICAgICogUGVyZm9ybXMgbWVyZ2VzIHdoZXJlIHBvc3NpYmxlLiAqL1xuICAgIGZ1bmN0aW9uIGFkZChub2RlLCBwYXJlbnQpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbiA6IHRva2VucztcbiAgICAgIHZhciBwcmV2ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJldiAmJlxuICAgICAgICBub2RlLnR5cGUgPT09IHByZXYudHlwZSAmJlxuICAgICAgICBub2RlLnR5cGUgaW4gTUVSR0VBQkxFX05PREVTICYmXG4gICAgICAgIG1lcmdlYWJsZShwcmV2KSAmJlxuICAgICAgICBtZXJnZWFibGUobm9kZSlcbiAgICAgICkge1xuICAgICAgICBub2RlID0gTUVSR0VBQkxFX05PREVTW25vZGUudHlwZV0uY2FsbChzZWxmLCBwcmV2LCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUgIT09IHByZXYpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuYXRTdGFydCAmJiB0b2tlbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHNlbGYuZXhpdFN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8qIFJlbW92ZSBgc3VidmFsdWVgIGZyb20gYHZhbHVlYC5cbiAgICAgKiBgc3VidmFsdWVgIG11c3QgYmUgYXQgdGhlIHN0YXJ0IG9mIGB2YWx1ZWAuICovXG4gICAgZnVuY3Rpb24gZWF0KHN1YnZhbHVlKSB7XG4gICAgICB2YXIgaW5kZW50ID0gZ2V0T2Zmc2V0KCk7XG4gICAgICB2YXIgcG9zID0gcG9zaXRpb24oKTtcbiAgICAgIHZhciBjdXJyZW50ID0gbm93KCk7XG5cbiAgICAgIHZhbGlkYXRlRWF0KHN1YnZhbHVlKTtcblxuICAgICAgYXBwbHkucmVzZXQgPSByZXNldDtcbiAgICAgIHJlc2V0LnRlc3QgPSB0ZXN0O1xuICAgICAgYXBwbHkudGVzdCA9IHRlc3Q7XG5cbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHN1YnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgIHVwZGF0ZVBvc2l0aW9uKHN1YnZhbHVlKTtcblxuICAgICAgaW5kZW50ID0gaW5kZW50KCk7XG5cbiAgICAgIHJldHVybiBhcHBseTtcblxuICAgICAgLyogQWRkIHRoZSBnaXZlbiBhcmd1bWVudHMsIGFkZCBgcG9zaXRpb25gIHRvXG4gICAgICAgKiB0aGUgcmV0dXJuZWQgbm9kZSwgYW5kIHJldHVybiB0aGUgbm9kZS4gKi9cbiAgICAgIGZ1bmN0aW9uIGFwcGx5KG5vZGUsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4gcG9zKGFkZChwb3Mobm9kZSksIHBhcmVudCksIGluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIC8qIEZ1bmN0aW9ucyBqdXN0IGxpa2UgYXBwbHksIGJ1dCByZXNldHMgdGhlXG4gICAgICAgKiBjb250ZW50OiAgdGhlIGxpbmUgYW5kIGNvbHVtbiBhcmUgcmV2ZXJzZWQsXG4gICAgICAgKiBhbmQgdGhlIGVhdGVuIHZhbHVlIGlzIHJlLWFkZGVkLlxuICAgICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIG5vZGVzIHdpdGggYSBzaW5nbGVcbiAgICAgICAqIHR5cGUgb2YgY29udGVudCwgc3VjaCBhcyBsaXN0cyBhbmQgdGFibGVzLlxuICAgICAgICogU2VlIGBhcHBseWAgYWJvdmUgZm9yIHdoYXQgcGFyYW1ldGVycyBhcmVcbiAgICAgICAqIGV4cGVjdGVkLiAqL1xuICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgIHZhciBub2RlID0gYXBwbHkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblxuICAgICAgICBsaW5lID0gY3VycmVudC5saW5lO1xuICAgICAgICBjb2x1bW4gPSBjdXJyZW50LmNvbHVtbjtcbiAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuXG4gICAgICAvKiBUZXN0IHRoZSBwb3NpdGlvbiwgYWZ0ZXIgZWF0aW5nLCBhbmQgcmV2ZXJzZVxuICAgICAgICogdG8gYSBub3QtZWF0ZW4gc3RhdGUuICovXG4gICAgICBmdW5jdGlvbiB0ZXN0KCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcG9zKHt9KTtcblxuICAgICAgICBsaW5lID0gY3VycmVudC5saW5lO1xuICAgICAgICBjb2x1bW4gPSBjdXJyZW50LmNvbHVtbjtcbiAgICAgICAgdmFsdWUgPSBzdWJ2YWx1ZSArIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQucG9zaXRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeTtcblxuLyogRmFjdG9yeSB0byBkZS1lc2NhcGUgYSB2YWx1ZSwgYmFzZWQgb24gYSBsaXN0IGF0IGBrZXlgXG4gKiBpbiBgY3R4YC4gKi9cbmZ1bmN0aW9uIGZhY3RvcnkoY3R4LCBrZXkpIHtcbiAgcmV0dXJuIHVuZXNjYXBlO1xuXG4gIC8qIERlLWVzY2FwZSBhIHN0cmluZyB1c2luZyB0aGUgZXhwcmVzc2lvbiBhdCBga2V5YFxuICAgKiBpbiBgY3R4YC4gKi9cbiAgZnVuY3Rpb24gdW5lc2NhcGUodmFsdWUpIHtcbiAgICB2YXIgcHJldiA9IDA7XG4gICAgdmFyIGluZGV4ID0gdmFsdWUuaW5kZXhPZignXFxcXCcpO1xuICAgIHZhciBlc2NhcGUgPSBjdHhba2V5XTtcbiAgICB2YXIgcXVldWUgPSBbXTtcbiAgICB2YXIgY2hhcmFjdGVyO1xuXG4gICAgd2hpbGUgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcXVldWUucHVzaCh2YWx1ZS5zbGljZShwcmV2LCBpbmRleCkpO1xuICAgICAgcHJldiA9IGluZGV4ICsgMTtcbiAgICAgIGNoYXJhY3RlciA9IHZhbHVlLmNoYXJBdChwcmV2KTtcblxuICAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXMgbm90IGEgdmFsaWQgZXNjYXBlLFxuICAgICAgICogYWRkIHRoZSBzbGFzaC4gKi9cbiAgICAgIGlmICghY2hhcmFjdGVyIHx8IGVzY2FwZS5pbmRleE9mKGNoYXJhY3RlcikgPT09IC0xKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goJ1xcXFwnKTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCdcXFxcJywgcHJldik7XG4gICAgfVxuXG4gICAgcXVldWUucHVzaCh2YWx1ZS5zbGljZShwcmV2KSk7XG5cbiAgICByZXR1cm4gcXVldWUuam9pbignJyk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBpbmRlbnRhdGlvbjtcblxuLyogTWFwIG9mIGNoYXJhY3RlcnMsIGFuZCB0aGVpciBjb2x1bW4gbGVuZ3RoLFxuICogd2hpY2ggY2FuIGJlIHVzZWQgYXMgaW5kZW50YXRpb24uICovXG52YXIgY2hhcmFjdGVycyA9IHsnICc6IDEsICdcXHQnOiA0fTtcblxuLyogR2V0cyBpbmRlbnRhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBsaW5lLiAqL1xuZnVuY3Rpb24gaW5kZW50YXRpb24odmFsdWUpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGluZGVudCA9IDA7XG4gIHZhciBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpO1xuICB2YXIgc3RvcHMgPSB7fTtcbiAgdmFyIHNpemU7XG5cbiAgd2hpbGUgKGNoYXJhY3RlciBpbiBjaGFyYWN0ZXJzKSB7XG4gICAgc2l6ZSA9IGNoYXJhY3RlcnNbY2hhcmFjdGVyXTtcblxuICAgIGluZGVudCArPSBzaXplO1xuXG4gICAgaWYgKHNpemUgPiAxKSB7XG4gICAgICBpbmRlbnQgPSBNYXRoLmZsb29yKGluZGVudCAvIHNpemUpICogc2l6ZTtcbiAgICB9XG5cbiAgICBzdG9wc1tpbmRlbnRdID0gaW5kZXg7XG5cbiAgICBjaGFyYWN0ZXIgPSB2YWx1ZS5jaGFyQXQoKytpbmRleCk7XG4gIH1cblxuICByZXR1cm4ge2luZGVudDogaW5kZW50LCBzdG9wczogc3RvcHN9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXR0cmlidXRlTmFtZSA9ICdbYS16QS1aXzpdW2EtekEtWjAtOTouXy1dKic7XG52YXIgdW5xdW90ZWQgPSAnW15cIlxcJz08PmBcXFxcdTAwMDAtXFxcXHUwMDIwXSsnO1xudmFyIHNpbmdsZVF1b3RlZCA9ICdcXCdbXlxcJ10qXFwnJztcbnZhciBkb3VibGVRdW90ZWQgPSAnXCJbXlwiXSpcIic7XG52YXIgYXR0cmlidXRlVmFsdWUgPSAnKD86JyArIHVucXVvdGVkICsgJ3wnICsgc2luZ2xlUXVvdGVkICsgJ3wnICsgZG91YmxlUXVvdGVkICsgJyknO1xudmFyIGF0dHJpYnV0ZSA9ICcoPzpcXFxccysnICsgYXR0cmlidXRlTmFtZSArICcoPzpcXFxccyo9XFxcXHMqJyArIGF0dHJpYnV0ZVZhbHVlICsgJyk/KSc7XG52YXIgb3BlblRhZyA9ICc8W0EtWmEtel1bQS1aYS16MC05XFxcXC1dKicgKyBhdHRyaWJ1dGUgKyAnKlxcXFxzKlxcXFwvPz4nO1xudmFyIGNsb3NlVGFnID0gJzxcXFxcL1tBLVphLXpdW0EtWmEtejAtOVxcXFwtXSpcXFxccyo+JztcbnZhciBjb21tZW50ID0gJzwhLS0tLT58PCEtLSg/Oi0/W14+LV0pKD86LT9bXi1dKSotLT4nO1xudmFyIHByb2Nlc3NpbmcgPSAnPFs/XS4qP1s/XT4nO1xudmFyIGRlY2xhcmF0aW9uID0gJzwhW0EtWmEtel0rXFxcXHMrW14+XSo+JztcbnZhciBjZGF0YSA9ICc8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nO1xuXG5leHBvcnRzLm9wZW5DbG9zZVRhZyA9IG5ldyBSZWdFeHAoJ14oPzonICsgb3BlblRhZyArICd8JyArIGNsb3NlVGFnICsgJyknKTtcblxuZXhwb3J0cy50YWcgPSBuZXcgUmVnRXhwKCdeKD86JyArXG4gIG9wZW5UYWcgKyAnfCcgK1xuICBjbG9zZVRhZyArICd8JyArXG4gIGNvbW1lbnQgKyAnfCcgK1xuICBwcm9jZXNzaW5nICsgJ3wnICtcbiAgZGVjbGFyYXRpb24gKyAnfCcgK1xuICBjZGF0YSArXG4nKScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludGVycnVwdDtcblxuZnVuY3Rpb24gaW50ZXJydXB0KGludGVycnVwdG9ycywgdG9rZW5pemVycywgY3R4LCBwYXJhbXMpIHtcbiAgdmFyIGJvb2xzID0gWydwZWRhbnRpYycsICdjb21tb25tYXJrJ107XG4gIHZhciBjb3VudCA9IGJvb2xzLmxlbmd0aDtcbiAgdmFyIGxlbmd0aCA9IGludGVycnVwdG9ycy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgaW50ZXJydXB0b3I7XG4gIHZhciBjb25maWc7XG4gIHZhciBmbjtcbiAgdmFyIG9mZnNldDtcbiAgdmFyIGJvb2w7XG4gIHZhciBpZ25vcmU7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpbnRlcnJ1cHRvciA9IGludGVycnVwdG9yc1tpbmRleF07XG4gICAgY29uZmlnID0gaW50ZXJydXB0b3JbMV0gfHwge307XG4gICAgZm4gPSBpbnRlcnJ1cHRvclswXTtcbiAgICBvZmZzZXQgPSAtMTtcbiAgICBpZ25vcmUgPSBmYWxzZTtcblxuICAgIHdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7XG4gICAgICBib29sID0gYm9vbHNbb2Zmc2V0XTtcblxuICAgICAgaWYgKGNvbmZpZ1tib29sXSAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZ1tib29sXSAhPT0gY3R4Lm9wdGlvbnNbYm9vbF0pIHtcbiAgICAgICAgaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlnbm9yZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuaXplcnNbZm5dLmFwcGx5KGN0eCwgcGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sbGFwc2VXaGl0ZVNwYWNlID0gcmVxdWlyZSgnY29sbGFwc2Utd2hpdGUtc3BhY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemU7XG5cbi8qIE5vcm1hbGl6ZSBhbiBpZGVudGlmaWVyLiAgQ29sbGFwc2VzIG11bHRpcGxlIHdoaXRlIHNwYWNlXG4gKiBjaGFyYWN0ZXJzIGludG8gYSBzaW5nbGUgc3BhY2UsIGFuZCByZW1vdmVzIGNhc2luZy4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSh2YWx1ZSkge1xuICByZXR1cm4gY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG52YXIgZ2V0SW5kZW50ID0gcmVxdWlyZSgnLi9nZXQtaW5kZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbmRlbnRhdGlvbjtcblxudmFyIENfU1BBQ0UgPSAnICc7XG52YXIgQ19ORVdMSU5FID0gJ1xcbic7XG52YXIgQ19UQUIgPSAnXFx0JztcblxuLyogUmVtb3ZlIHRoZSBtaW5pbXVtIGluZGVudCBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHZhbHVlYC5cbiAqIFN1cHBvcnRzIGJvdGggdGFiLCBzcGFjZWQsIGFuZCBtaXhlZCBpbmRlbnRhdGlvbiAoYXNcbiAqIHdlbGwgYXMgcG9zc2libGUpLiAqL1xuZnVuY3Rpb24gaW5kZW50YXRpb24odmFsdWUsIG1heGltdW0pIHtcbiAgdmFyIHZhbHVlcyA9IHZhbHVlLnNwbGl0KENfTkVXTElORSk7XG4gIHZhciBwb3NpdGlvbiA9IHZhbHVlcy5sZW5ndGggKyAxO1xuICB2YXIgbWluSW5kZW50ID0gSW5maW5pdHk7XG4gIHZhciBtYXRyaXggPSBbXTtcbiAgdmFyIGluZGV4O1xuICB2YXIgaW5kZW50YXRpb247XG4gIHZhciBzdG9wcztcbiAgdmFyIHBhZGRpbmc7XG5cbiAgdmFsdWVzLnVuc2hpZnQocmVwZWF0KENfU1BBQ0UsIG1heGltdW0pICsgJyEnKTtcblxuICB3aGlsZSAocG9zaXRpb24tLSkge1xuICAgIGluZGVudGF0aW9uID0gZ2V0SW5kZW50KHZhbHVlc1twb3NpdGlvbl0pO1xuXG4gICAgbWF0cml4W3Bvc2l0aW9uXSA9IGluZGVudGF0aW9uLnN0b3BzO1xuXG4gICAgaWYgKHRyaW0odmFsdWVzW3Bvc2l0aW9uXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZW50YXRpb24uaW5kZW50KSB7XG4gICAgICBpZiAoaW5kZW50YXRpb24uaW5kZW50ID4gMCAmJiBpbmRlbnRhdGlvbi5pbmRlbnQgPCBtaW5JbmRlbnQpIHtcbiAgICAgICAgbWluSW5kZW50ID0gaW5kZW50YXRpb24uaW5kZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtaW5JbmRlbnQgPSBJbmZpbml0eTtcblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbkluZGVudCAhPT0gSW5maW5pdHkpIHtcbiAgICBwb3NpdGlvbiA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICB3aGlsZSAocG9zaXRpb24tLSkge1xuICAgICAgc3RvcHMgPSBtYXRyaXhbcG9zaXRpb25dO1xuICAgICAgaW5kZXggPSBtaW5JbmRlbnQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCAmJiAhKGluZGV4IGluIHN0b3BzKSkge1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRyaW0odmFsdWVzW3Bvc2l0aW9uXSkubGVuZ3RoICE9PSAwICYmXG4gICAgICAgIG1pbkluZGVudCAmJlxuICAgICAgICBpbmRleCAhPT0gbWluSW5kZW50XG4gICAgICApIHtcbiAgICAgICAgcGFkZGluZyA9IENfVEFCO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFkZGluZyA9ICcnO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZXNbcG9zaXRpb25dID0gcGFkZGluZyArIHZhbHVlc1twb3NpdGlvbl0uc2xpY2UoXG4gICAgICAgIGluZGV4IGluIHN0b3BzID8gc3RvcHNbaW5kZXhdICsgMSA6IDBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdmFsdWVzLnNoaWZ0KCk7XG5cbiAgcmV0dXJuIHZhbHVlcy5qb2luKENfTkVXTElORSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY29sbGFwc2U7XG5cbi8qIGNvbGxhcHNlKCcgXFx0XFxuYmFyIFxcbmJhelxcdCcpOyAvLyAnIGJhciBiYXogJyAqL1xuZnVuY3Rpb24gY29sbGFwc2UodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFscGhhYmV0aWNhbDtcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGFscGhhYmV0aWNhbC4gKi9cbmZ1bmN0aW9uIGFscGhhYmV0aWNhbChjaGFyYWN0ZXIpIHtcbiAgdmFyIGNvZGUgPSB0eXBlb2YgY2hhcmFjdGVyID09PSAnc3RyaW5nJyA/XG4gICAgY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgOiBjaGFyYWN0ZXI7XG5cbiAgcmV0dXJuIChjb2RlID49IDk3ICYmIGNvZGUgPD0gMTIyKSB8fCAvKiBhLXogKi9cbiAgICAoY29kZSA+PSA2NSAmJiBjb2RlIDw9IDkwKTsgLyogQS1aICovXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVjaW1hbDtcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGRlY2ltYWwuICovXG5mdW5jdGlvbiBkZWNpbWFsKGNoYXJhY3Rlcikge1xuICB2YXIgY29kZSA9IHR5cGVvZiBjaGFyYWN0ZXIgPT09ICdzdHJpbmcnID9cbiAgICBjaGFyYWN0ZXIuY2hhckNvZGVBdCgwKSA6IGNoYXJhY3RlcjtcblxuICByZXR1cm4gY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3OyAvKiAwLTkgKi9cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB3aGl0ZXNwYWNlO1xuXG52YXIgZnJvbUNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyIHJlID0gL1xccy87XG5cbi8qIENoZWNrIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY29kZSwgb3IgdGhlIGNoYXJhY3RlclxuICogY29kZSBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xuZnVuY3Rpb24gd2hpdGVzcGFjZShjaGFyYWN0ZXIpIHtcbiAgcmV0dXJuIHJlLnRlc3QoXG4gICAgdHlwZW9mIGNoYXJhY3RlciA9PT0gJ251bWJlcicgPyBmcm9tQ29kZShjaGFyYWN0ZXIpIDogY2hhcmFjdGVyLmNoYXJBdCgwKVxuICApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdvcmRDaGFyYWN0ZXI7XG5cbnZhciBmcm9tQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgcmUgPSAvXFx3LztcblxuLyogQ2hlY2sgaWYgdGhlIGdpdmVuIGNoYXJhY3RlciBjb2RlLCBvciB0aGUgY2hhcmFjdGVyXG4gKiBjb2RlIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIsIGlzIGEgd29yZCBjaGFyYWN0ZXIuICovXG5mdW5jdGlvbiB3b3JkQ2hhcmFjdGVyKGNoYXJhY3Rlcikge1xuICByZXR1cm4gcmUudGVzdChcbiAgICB0eXBlb2YgY2hhcmFjdGVyID09PSAnbnVtYmVyJyA/IGZyb21Db2RlKGNoYXJhY3RlcikgOiBjaGFyYWN0ZXIuY2hhckF0KDApXG4gICk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlcztcblxudmFyIGRlZmF1bHRzID0gW1xuICAnXFxcXCcsXG4gICdgJyxcbiAgJyonLFxuICAneycsXG4gICd9JyxcbiAgJ1snLFxuICAnXScsXG4gICcoJyxcbiAgJyknLFxuICAnIycsXG4gICcrJyxcbiAgJy0nLFxuICAnLicsXG4gICchJyxcbiAgJ18nLFxuICAnPidcbl07XG5cbnZhciBnZm0gPSBkZWZhdWx0cy5jb25jYXQoWyd+JywgJ3wnXSk7XG5cbnZhciBjb21tb25tYXJrID0gZ2ZtLmNvbmNhdChbXG4gICdcXG4nLFxuICAnXCInLFxuICAnJCcsXG4gICclJyxcbiAgJyYnLFxuICAnXFwnJyxcbiAgJywnLFxuICAnLycsXG4gICc6JyxcbiAgJzsnLFxuICAnPCcsXG4gICc9JyxcbiAgJz8nLFxuICAnQCcsXG4gICdeJ1xuXSk7XG5cbmVzY2FwZXMuZGVmYXVsdCA9IGRlZmF1bHRzO1xuZXNjYXBlcy5nZm0gPSBnZm07XG5lc2NhcGVzLmNvbW1vbm1hcmsgPSBjb21tb25tYXJrO1xuXG4vKiBHZXQgbWFya2Rvd24gZXNjYXBlcy4gKi9cbmZ1bmN0aW9uIGVzY2FwZXMob3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChzZXR0aW5ncy5jb21tb25tYXJrKSB7XG4gICAgcmV0dXJuIGNvbW1vbm1hcms7XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3MuZ2ZtID8gZ2ZtIDogZGVmYXVsdHM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIERlcGVuZGVuY2llcy4gKi9cbnZhciBjaGFyYWN0ZXJFbnRpdGllcyA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1lbnRpdGllcycpO1xudmFyIGxlZ2FjeSA9IHJlcXVpcmUoJ2NoYXJhY3Rlci1lbnRpdGllcy1sZWdhY3knKTtcbnZhciBpbnZhbGlkID0gcmVxdWlyZSgnY2hhcmFjdGVyLXJlZmVyZW5jZS1pbnZhbGlkJyk7XG52YXIgZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWRlY2ltYWwnKTtcbnZhciBoZXhhZGVjaW1hbCA9IHJlcXVpcmUoJ2lzLWhleGFkZWNpbWFsJyk7XG52YXIgYWxwaGFudW1lcmljYWwgPSByZXF1aXJlKCdpcy1hbHBoYW51bWVyaWNhbCcpO1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBwZXI7XG5cbi8qIE1ldGhvZHMuICovXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG52YXIgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbnZhciBub29wID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4vKiBDaGFyYWN0ZXJzLiAqL1xudmFyIFJFUExBQ0VNRU5UID0gJ1xcdUZGRkQnO1xudmFyIEZPUk1fRkVFRCA9ICdcXGYnO1xudmFyIEFNUEVSU0FORCA9ICcmJztcbnZhciBPQ1RPVEhPUlAgPSAnIyc7XG52YXIgU0VNSUNPTE9OID0gJzsnO1xudmFyIE5FV0xJTkUgPSAnXFxuJztcbnZhciBYX0xPV0VSID0gJ3gnO1xudmFyIFhfVVBQRVIgPSAnWCc7XG52YXIgU1BBQ0UgPSAnICc7XG52YXIgTEVTU19USEFOID0gJzwnO1xudmFyIEVRVUFMID0gJz0nO1xudmFyIEVNUFRZID0gJyc7XG52YXIgVEFCID0gJ1xcdCc7XG5cbi8qIERlZmF1bHQgc2V0dGluZ3MuICovXG52YXIgZGVmYXVsdHMgPSB7XG4gIHdhcm5pbmc6IG51bGwsXG4gIHJlZmVyZW5jZTogbnVsbCxcbiAgdGV4dDogbnVsbCxcbiAgd2FybmluZ0NvbnRleHQ6IG51bGwsXG4gIHJlZmVyZW5jZUNvbnRleHQ6IG51bGwsXG4gIHRleHRDb250ZXh0OiBudWxsLFxuICBwb3NpdGlvbjoge30sXG4gIGFkZGl0aW9uYWw6IG51bGwsXG4gIGF0dHJpYnV0ZTogZmFsc2UsXG4gIG5vblRlcm1pbmF0ZWQ6IHRydWVcbn07XG5cbi8qIFJlZmVyZW5jZSB0eXBlcy4gKi9cbnZhciBOQU1FRCA9ICduYW1lZCc7XG52YXIgSEVYQURFQ0lNQUwgPSAnaGV4YWRlY2ltYWwnO1xudmFyIERFQ0lNQUwgPSAnZGVjaW1hbCc7XG5cbi8qIE1hcCBvZiBiYXNlcy4gKi9cbnZhciBCQVNFID0ge307XG5cbkJBU0VbSEVYQURFQ0lNQUxdID0gMTY7XG5CQVNFW0RFQ0lNQUxdID0gMTA7XG5cbi8qIE1hcCBvZiB0eXBlcyB0byB0ZXN0cy4gRWFjaCB0eXBlIG9mIGNoYXJhY3RlciByZWZlcmVuY2VcbiAqIGFjY2VwdHMgZGlmZmVyZW50IGNoYXJhY3RlcnMuIFRoaXMgdGVzdCBpcyB1c2VkIHRvXG4gKiBkZXRlY3Qgd2hldGhlciBhIHJlZmVyZW5jZSBoYXMgZW5kZWQgKGFzIHRoZSBzZW1pY29sb25cbiAqIGlzIG5vdCBzdHJpY3RseSBuZWVkZWQpLiAqL1xudmFyIFRFU1RTID0ge307XG5cblRFU1RTW05BTUVEXSA9IGFscGhhbnVtZXJpY2FsO1xuVEVTVFNbREVDSU1BTF0gPSBkZWNpbWFsO1xuVEVTVFNbSEVYQURFQ0lNQUxdID0gaGV4YWRlY2ltYWw7XG5cbi8qIFdhcm5pbmcgbWVzc2FnZXMuICovXG52YXIgTkFNRURfTk9UX1RFUk1JTkFURUQgPSAxO1xudmFyIE5VTUVSSUNfTk9UX1RFUk1JTkFURUQgPSAyO1xudmFyIE5BTUVEX0VNUFRZID0gMztcbnZhciBOVU1FUklDX0VNUFRZID0gNDtcbnZhciBOQU1FRF9VTktOT1dOID0gNTtcbnZhciBOVU1FUklDX0RJU0FMTE9XRUQgPSA2O1xudmFyIE5VTUVSSUNfUFJPSElCSVRFRCA9IDc7XG5cbnZhciBOVU1FUklDX1JFRkVSRU5DRSA9ICdOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzJztcbnZhciBOQU1FRF9SRUZFUkVOQ0UgPSAnTmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZXMnO1xudmFyIFRFUk1JTkFURUQgPSAnIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbic7XG52YXIgVk9JRCA9ICcgY2Fubm90IGJlIGVtcHR5JztcblxudmFyIE1FU1NBR0VTID0ge307XG5cbk1FU1NBR0VTW05BTUVEX05PVF9URVJNSU5BVEVEXSA9IE5BTUVEX1JFRkVSRU5DRSArIFRFUk1JTkFURUQ7XG5NRVNTQUdFU1tOVU1FUklDX05PVF9URVJNSU5BVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVEVSTUlOQVRFRDtcbk1FU1NBR0VTW05BTUVEX0VNUFRZXSA9IE5BTUVEX1JFRkVSRU5DRSArIFZPSUQ7XG5NRVNTQUdFU1tOVU1FUklDX0VNUFRZXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgVk9JRDtcbk1FU1NBR0VTW05BTUVEX1VOS05PV05dID0gTkFNRURfUkVGRVJFTkNFICsgJyBtdXN0IGJlIGtub3duJztcbk1FU1NBR0VTW05VTUVSSUNfRElTQUxMT1dFRF0gPSBOVU1FUklDX1JFRkVSRU5DRSArICcgY2Fubm90IGJlIGRpc2FsbG93ZWQnO1xuTUVTU0FHRVNbTlVNRVJJQ19QUk9ISUJJVEVEXSA9IE5VTUVSSUNfUkVGRVJFTkNFICsgJyBjYW5ub3QgYmUgb3V0c2lkZSB0aGUgJyArXG4gICAgJ3Blcm1pc3NpYmxlIFVuaWNvZGUgcmFuZ2UnO1xuXG4vKiBXcmFwIHRvIGVuc3VyZSBjbGVhbiBwYXJhbWV0ZXJzIGFyZSBnaXZlbiB0byBgcGFyc2VgLiAqL1xuZnVuY3Rpb24gd3JhcHBlcih2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSB7fTtcbiAgdmFyIG9wdGlvbjtcbiAgdmFyIGtleTtcblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgIG9wdGlvbiA9IG9wdGlvbnNba2V5XTtcbiAgICBzZXR0aW5nc1trZXldID0gb3B0aW9uID09PSBudWxsIHx8IG9wdGlvbiA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdHNba2V5XSA6IG9wdGlvbjtcbiAgfVxuXG4gIGlmIChzZXR0aW5ncy5wb3NpdGlvbi5pbmRlbnQgfHwgc2V0dGluZ3MucG9zaXRpb24uc3RhcnQpIHtcbiAgICBzZXR0aW5ncy5pbmRlbnQgPSBzZXR0aW5ncy5wb3NpdGlvbi5pbmRlbnQgfHwgW107XG4gICAgc2V0dGluZ3MucG9zaXRpb24gPSBzZXR0aW5ncy5wb3NpdGlvbi5zdGFydDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZSh2YWx1ZSwgc2V0dGluZ3MpO1xufVxuXG4vKiBQYXJzZSBlbnRpdGllcy4gKi9cbmZ1bmN0aW9uIHBhcnNlKHZhbHVlLCBzZXR0aW5ncykge1xuICB2YXIgYWRkaXRpb25hbCA9IHNldHRpbmdzLmFkZGl0aW9uYWw7XG4gIHZhciBub25UZXJtaW5hdGVkID0gc2V0dGluZ3Mubm9uVGVybWluYXRlZDtcbiAgdmFyIGhhbmRsZVRleHQgPSBzZXR0aW5ncy50ZXh0O1xuICB2YXIgaGFuZGxlUmVmZXJlbmNlID0gc2V0dGluZ3MucmVmZXJlbmNlO1xuICB2YXIgaGFuZGxlV2FybmluZyA9IHNldHRpbmdzLndhcm5pbmc7XG4gIHZhciB0ZXh0Q29udGV4dCA9IHNldHRpbmdzLnRleHRDb250ZXh0O1xuICB2YXIgcmVmZXJlbmNlQ29udGV4dCA9IHNldHRpbmdzLnJlZmVyZW5jZUNvbnRleHQ7XG4gIHZhciB3YXJuaW5nQ29udGV4dCA9IHNldHRpbmdzLndhcm5pbmdDb250ZXh0O1xuICB2YXIgcG9zID0gc2V0dGluZ3MucG9zaXRpb247XG4gIHZhciBpbmRlbnQgPSBzZXR0aW5ncy5pbmRlbnQgfHwgW107XG4gIHZhciBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsaW5lcyA9IC0xO1xuICB2YXIgY29sdW1uID0gcG9zLmNvbHVtbiB8fCAxO1xuICB2YXIgbGluZSA9IHBvcy5saW5lIHx8IDE7XG4gIHZhciBxdWV1ZSA9IEVNUFRZO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBlbnRpdHlDaGFyYWN0ZXJzO1xuICB2YXIgdGVybWluYXRlZDtcbiAgdmFyIGNoYXJhY3RlcnM7XG4gIHZhciBjaGFyYWN0ZXI7XG4gIHZhciByZWZlcmVuY2U7XG4gIHZhciBmb2xsb3dpbmc7XG4gIHZhciB3YXJuaW5nO1xuICB2YXIgcmVhc29uO1xuICB2YXIgb3V0cHV0O1xuICB2YXIgZW50aXR5O1xuICB2YXIgYmVnaW47XG4gIHZhciBzdGFydDtcbiAgdmFyIHR5cGU7XG4gIHZhciB0ZXN0O1xuICB2YXIgcHJldjtcbiAgdmFyIG5leHQ7XG4gIHZhciBkaWZmO1xuICB2YXIgZW5kO1xuXG4gIC8qIENhY2hlIHRoZSBjdXJyZW50IHBvaW50LiAqL1xuICBwcmV2ID0gbm93KCk7XG5cbiAgLyogV3JhcCBgaGFuZGxlV2FybmluZ2AuICovXG4gIHdhcm5pbmcgPSBoYW5kbGVXYXJuaW5nID8gcGFyc2VFcnJvciA6IG5vb3A7XG5cbiAgLyogRW5zdXJlIHRoZSBhbGdvcml0aG0gd2Fsa3Mgb3ZlciB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gICAqIGFuZCB0aGUgZW5kIChpbmNsdXNpdmUpLiAqL1xuICBpbmRleC0tO1xuICBsZW5ndGgrKztcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIC8qIElmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIGEgbmV3bGluZS4gKi9cbiAgICBpZiAoY2hhcmFjdGVyID09PSBORVdMSU5FKSB7XG4gICAgICBjb2x1bW4gPSBpbmRlbnRbbGluZXNdIHx8IDE7XG4gICAgfVxuXG4gICAgY2hhcmFjdGVyID0gYXQoaW5kZXgpO1xuXG4gICAgLyogSGFuZGxlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gYW1wZXJzYW5kLFxuICAgICAqIGluY2x1ZGluZyBuZXdsaW5lcyBhbmQgRU9GLiAqL1xuICAgIGlmIChjaGFyYWN0ZXIgIT09IEFNUEVSU0FORCkge1xuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTkVXTElORSkge1xuICAgICAgICBsaW5lKys7XG4gICAgICAgIGxpbmVzKys7XG4gICAgICAgIGNvbHVtbiA9IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyYWN0ZXIpIHtcbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVyO1xuICAgICAgICBjb2x1bW4rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvbGxvd2luZyA9IGF0KGluZGV4ICsgMSk7XG5cbiAgICAgIC8qIFRoZSBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG5leHRcbiAgICAgICAqIGNoYXJhY3Rlci4gKi9cbiAgICAgIGlmIChcbiAgICAgICAgZm9sbG93aW5nID09PSBUQUIgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBORVdMSU5FIHx8XG4gICAgICAgIGZvbGxvd2luZyA9PT0gRk9STV9GRUVEIHx8XG4gICAgICAgIGZvbGxvd2luZyA9PT0gU1BBQ0UgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBMRVNTX1RIQU4gfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBBTVBFUlNBTkQgfHxcbiAgICAgICAgZm9sbG93aW5nID09PSBFTVBUWSB8fFxuICAgICAgICAoYWRkaXRpb25hbCAmJiBmb2xsb3dpbmcgPT09IGFkZGl0aW9uYWwpXG4gICAgICApIHtcbiAgICAgICAgLyogTm90IGEgY2hhcmFjdGVyIHJlZmVyZW5jZS4gTm8gY2hhcmFjdGVyc1xuICAgICAgICAgKiBhcmUgY29uc3VtZWQsIGFuZCBub3RoaW5nIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgZWl0aGVyLiAqL1xuICAgICAgICBxdWV1ZSArPSBjaGFyYWN0ZXI7XG4gICAgICAgIGNvbHVtbisrO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIGJlZ2luID0gc3RhcnQ7XG4gICAgICBlbmQgPSBzdGFydDtcblxuICAgICAgLyogTnVtZXJpY2FsIGVudGl0eS4gKi9cbiAgICAgIGlmIChmb2xsb3dpbmcgIT09IE9DVE9USE9SUCkge1xuICAgICAgICB0eXBlID0gTkFNRUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSArK2JlZ2luO1xuXG4gICAgICAgIC8qIFRoZSBiZWhhdmlvdXIgZnVydGhlciBkZXBlbmRzIG9uIHRoZVxuICAgICAgICAgKiBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIFUrMDAyMyBOVU1CRVIgU0lHTi4gKi9cbiAgICAgICAgZm9sbG93aW5nID0gYXQoZW5kKTtcblxuICAgICAgICBpZiAoZm9sbG93aW5nID09PSBYX0xPV0VSIHx8IGZvbGxvd2luZyA9PT0gWF9VUFBFUikge1xuICAgICAgICAgIC8qIEFTQ0lJIGhleCBkaWdpdHMuICovXG4gICAgICAgICAgdHlwZSA9IEhFWEFERUNJTUFMO1xuICAgICAgICAgIGVuZCA9ICsrYmVnaW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyogQVNDSUkgZGlnaXRzLiAqL1xuICAgICAgICAgIHR5cGUgPSBERUNJTUFMO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVudGl0eUNoYXJhY3RlcnMgPSBFTVBUWTtcbiAgICAgIGVudGl0eSA9IEVNUFRZO1xuICAgICAgY2hhcmFjdGVycyA9IEVNUFRZO1xuICAgICAgdGVzdCA9IFRFU1RTW3R5cGVdO1xuICAgICAgZW5kLS07XG5cbiAgICAgIHdoaWxlICgrK2VuZCA8IGxlbmd0aCkge1xuICAgICAgICBmb2xsb3dpbmcgPSBhdChlbmQpO1xuXG4gICAgICAgIGlmICghdGVzdChmb2xsb3dpbmcpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyYWN0ZXJzICs9IGZvbGxvd2luZztcblxuICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gbWF0Y2ggYSBsZWdhY3kgbmFtZWRcbiAgICAgICAgICogcmVmZXJlbmNlLiAgSWYgc28sIHdlIGNhY2hlIHRoYXQgYXMgdGhlXG4gICAgICAgICAqIGxhc3QgdmlhYmxlIG5hbWVkIHJlZmVyZW5jZS4gIFRoaXNcbiAgICAgICAgICogZW5zdXJlcyB3ZSBkbyBub3QgbmVlZCB0byB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgKiBsYXRlci4gKi9cbiAgICAgICAgaWYgKHR5cGUgPT09IE5BTUVEICYmIG93bi5jYWxsKGxlZ2FjeSwgY2hhcmFjdGVycykpIHtcbiAgICAgICAgICBlbnRpdHlDaGFyYWN0ZXJzID0gY2hhcmFjdGVycztcbiAgICAgICAgICBlbnRpdHkgPSBsZWdhY3lbY2hhcmFjdGVyc107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGVybWluYXRlZCA9IGF0KGVuZCkgPT09IFNFTUlDT0xPTjtcblxuICAgICAgaWYgKHRlcm1pbmF0ZWQpIHtcbiAgICAgICAgZW5kKys7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IE5BTUVEICYmIG93bi5jYWxsKGNoYXJhY3RlckVudGl0aWVzLCBjaGFyYWN0ZXJzKSkge1xuICAgICAgICAgIGVudGl0eUNoYXJhY3RlcnMgPSBjaGFyYWN0ZXJzO1xuICAgICAgICAgIGVudGl0eSA9IGNoYXJhY3RlckVudGl0aWVzW2NoYXJhY3RlcnNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRpZmYgPSAxICsgZW5kIC0gc3RhcnQ7XG5cbiAgICAgIGlmICghdGVybWluYXRlZCAmJiAhbm9uVGVybWluYXRlZCkge1xuICAgICAgICAvKiBFbXB0eS4gKi9cbiAgICAgIH0gZWxzZSBpZiAoIWNoYXJhY3RlcnMpIHtcbiAgICAgICAgLyogQW4gZW1wdHkgKHBvc3NpYmxlKSBlbnRpdHkgaXMgdmFsaWQsIHVubGVzc1xuICAgICAgICAgKiBpdHMgbnVtZXJpYyAodGh1cyBhbiBhbXBlcnNhbmQgZm9sbG93ZWQgYnlcbiAgICAgICAgICogYW4gb2N0b3Rob3JwKS4gKi9cbiAgICAgICAgaWYgKHR5cGUgIT09IE5BTUVEKSB7XG4gICAgICAgICAgd2FybmluZyhOVU1FUklDX0VNUFRZLCBkaWZmKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBOQU1FRCkge1xuICAgICAgICAvKiBBbiBhbXBlcnNhbmQgZm9sbG93ZWQgYnkgYW55dGhpbmdcbiAgICAgICAgICogdW5rbm93biwgYW5kIG5vdCB0ZXJtaW5hdGVkLCBpcyBpbnZhbGlkLiAqL1xuICAgICAgICBpZiAodGVybWluYXRlZCAmJiAhZW50aXR5KSB7XG4gICAgICAgICAgd2FybmluZyhOQU1FRF9VTktOT1dOLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBJZiB0aGVyZXMgc29tZXRoaW5nIGFmdGVyIGFuIGVudGl0eVxuICAgICAgICAgICAqIG5hbWUgd2hpY2ggaXMgbm90IGtub3duLCBjYXAgdGhlXG4gICAgICAgICAgICogcmVmZXJlbmNlLiAqL1xuICAgICAgICAgIGlmIChlbnRpdHlDaGFyYWN0ZXJzICE9PSBjaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBlbmQgPSBiZWdpbiArIGVudGl0eUNoYXJhY3RlcnMubGVuZ3RoO1xuICAgICAgICAgICAgZGlmZiA9IDEgKyBlbmQgLSBiZWdpbjtcbiAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiBJZiB0aGUgcmVmZXJlbmNlIGlzIG5vdCB0ZXJtaW5hdGVkLFxuICAgICAgICAgICAqIHdhcm4uICovXG4gICAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG4gICAgICAgICAgICByZWFzb24gPSBlbnRpdHlDaGFyYWN0ZXJzID9cbiAgICAgICAgICAgICAgTkFNRURfTk9UX1RFUk1JTkFURUQgOlxuICAgICAgICAgICAgICBOQU1FRF9FTVBUWTtcblxuICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgd2FybmluZyhyZWFzb24sIGRpZmYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9sbG93aW5nID0gYXQoZW5kKTtcblxuICAgICAgICAgICAgICBpZiAoZm9sbG93aW5nID09PSBFUVVBTCkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcocmVhc29uLCBkaWZmKTtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFscGhhbnVtZXJpY2FsKGZvbGxvd2luZykpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcocmVhc29uLCBkaWZmKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlZmVyZW5jZSA9IGVudGl0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGVybWluYXRlZCkge1xuICAgICAgICAgIC8qIEFsbCBub24tdGVybWluYXRlZCBudW1lcmljIGVudGl0aWVzIGFyZVxuICAgICAgICAgICAqIG5vdCByZW5kZXJlZCwgYW5kIHRyaWdnZXIgYSB3YXJuaW5nLiAqL1xuICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19OT1RfVEVSTUlOQVRFRCwgZGlmZik7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBXaGVuIHRlcm1pbmF0ZWQgYW5kIG51bWJlciwgcGFyc2UgYXNcbiAgICAgICAgICogZWl0aGVyIGhleGFkZWNpbWFsIG9yIGRlY2ltYWwuICovXG4gICAgICAgIHJlZmVyZW5jZSA9IHBhcnNlSW50KGNoYXJhY3RlcnMsIEJBU0VbdHlwZV0pO1xuXG4gICAgICAgIC8qIFRyaWdnZXIgYSB3YXJuaW5nIHdoZW4gdGhlIHBhcnNlZCBudW1iZXJcbiAgICAgICAgICogaXMgcHJvaGliaXRlZCwgYW5kIHJlcGxhY2Ugd2l0aFxuICAgICAgICAgKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIuICovXG4gICAgICAgIGlmIChpc1Byb2hpYml0ZWQocmVmZXJlbmNlKSkge1xuICAgICAgICAgIHdhcm5pbmcoTlVNRVJJQ19QUk9ISUJJVEVELCBkaWZmKTtcblxuICAgICAgICAgIHJlZmVyZW5jZSA9IFJFUExBQ0VNRU5UO1xuICAgICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbiBpbnZhbGlkKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBhIHdhcm5pbmcgd2hlbiB0aGUgcGFyc2VkIG51bWJlclxuICAgICAgICAgICAqIGlzIGRpc2FsbG93ZWQsIGFuZCByZXBsYWNlIGJ5IGFuXG4gICAgICAgICAgICogYWx0ZXJuYXRpdmUuICovXG4gICAgICAgICAgd2FybmluZyhOVU1FUklDX0RJU0FMTE9XRUQsIGRpZmYpO1xuXG4gICAgICAgICAgcmVmZXJlbmNlID0gaW52YWxpZFtyZWZlcmVuY2VdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qIFBhcnNlIHRoZSBudW1iZXIuICovXG4gICAgICAgICAgb3V0cHV0ID0gRU1QVFk7XG5cbiAgICAgICAgICAvKiBUcmlnZ2VyIGEgd2FybmluZyB3aGVuIHRoZSBwYXJzZWRcbiAgICAgICAgICAgKiBudW1iZXIgc2hvdWxkIG5vdCBiZSB1c2VkLiAqL1xuICAgICAgICAgIGlmIChpc1dhcm5pbmcocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgd2FybmluZyhOVU1FUklDX0RJU0FMTE9XRUQsIGRpZmYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIFN0cmluZ2lmeSB0aGUgbnVtYmVyLiAqL1xuICAgICAgICAgIGlmIChyZWZlcmVuY2UgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgb3V0cHV0ICs9IGZyb21DaGFyQ29kZSgocmVmZXJlbmNlID4+PiAoMTAgJiAweDNGRikpIHwgMHhEODAwKTtcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IDB4REMwMCB8IChyZWZlcmVuY2UgJiAweDNGRik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVmZXJlbmNlID0gb3V0cHV0ICsgZnJvbUNoYXJDb2RlKHJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogSWYgd2UgY291bGQgbm90IGZpbmQgYSByZWZlcmVuY2UsIHF1ZXVlIHRoZVxuICAgICAgICogY2hlY2tlZCBjaGFyYWN0ZXJzIChhcyBub3JtYWwgY2hhcmFjdGVycyksXG4gICAgICAgKiBhbmQgbW92ZSB0aGUgcG9pbnRlciB0byB0aGVpciBlbmQuIFRoaXMgaXNcbiAgICAgICAqIHBvc3NpYmxlIGJlY2F1c2Ugd2UgY2FuIGJlIGNlcnRhaW4gbmVpdGhlclxuICAgICAgICogbmV3bGluZXMgbm9yIGFtcGVyc2FuZHMgYXJlIGluY2x1ZGVkLiAqL1xuICAgICAgaWYgKCFyZWZlcmVuY2UpIHtcbiAgICAgICAgY2hhcmFjdGVycyA9IHZhbHVlLnNsaWNlKHN0YXJ0IC0gMSwgZW5kKTtcbiAgICAgICAgcXVldWUgKz0gY2hhcmFjdGVycztcbiAgICAgICAgY29sdW1uICs9IGNoYXJhY3RlcnMubGVuZ3RoO1xuICAgICAgICBpbmRleCA9IGVuZCAtIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBGb3VuZCBpdCEgRmlyc3QgZWF0IHRoZSBxdWV1ZWRcbiAgICAgICAgICogY2hhcmFjdGVycyBhcyBub3JtYWwgdGV4dCwgdGhlbiBlYXRcbiAgICAgICAgICogYW4gZW50aXR5LiAqL1xuICAgICAgICBmbHVzaCgpO1xuXG4gICAgICAgIHByZXYgPSBub3coKTtcbiAgICAgICAgaW5kZXggPSBlbmQgLSAxO1xuICAgICAgICBjb2x1bW4gKz0gZW5kIC0gc3RhcnQgKyAxO1xuICAgICAgICByZXN1bHQucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICBuZXh0ID0gbm93KCk7XG4gICAgICAgIG5leHQub2Zmc2V0Kys7XG5cbiAgICAgICAgaWYgKGhhbmRsZVJlZmVyZW5jZSkge1xuICAgICAgICAgIGhhbmRsZVJlZmVyZW5jZS5jYWxsKHJlZmVyZW5jZUNvbnRleHQsIHJlZmVyZW5jZSwge1xuICAgICAgICAgICAgc3RhcnQ6IHByZXYsXG4gICAgICAgICAgICBlbmQ6IG5leHRcbiAgICAgICAgICB9LCB2YWx1ZS5zbGljZShzdGFydCAtIDEsIGVuZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldiA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyogUmV0dXJuIHRoZSByZWR1Y2VkIG5vZGVzLCBhbmQgYW55IHBvc3NpYmxlIHdhcm5pbmdzLiAqL1xuICByZXR1cm4gcmVzdWx0LmpvaW4oRU1QVFkpO1xuXG4gIC8qIEdldCBjdXJyZW50IHBvc2l0aW9uLiAqL1xuICBmdW5jdGlvbiBub3coKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgIG9mZnNldDogaW5kZXggKyAocG9zLm9mZnNldCB8fCAwKVxuICAgIH07XG4gIH1cblxuICAvKiDigJxUaHJvd+KAnSBhIHBhcnNlLWVycm9yOiBhIHdhcm5pbmcuICovXG4gIGZ1bmN0aW9uIHBhcnNlRXJyb3IoY29kZSwgb2Zmc2V0KSB7XG4gICAgdmFyIHBvc2l0aW9uID0gbm93KCk7XG5cbiAgICBwb3NpdGlvbi5jb2x1bW4gKz0gb2Zmc2V0O1xuICAgIHBvc2l0aW9uLm9mZnNldCArPSBvZmZzZXQ7XG5cbiAgICBoYW5kbGVXYXJuaW5nLmNhbGwod2FybmluZ0NvbnRleHQsIE1FU1NBR0VTW2NvZGVdLCBwb3NpdGlvbiwgY29kZSk7XG4gIH1cblxuICAvKiBHZXQgY2hhcmFjdGVyIGF0IHBvc2l0aW9uLiAqL1xuICBmdW5jdGlvbiBhdChwb3NpdGlvbikge1xuICAgIHJldHVybiB2YWx1ZS5jaGFyQXQocG9zaXRpb24pO1xuICB9XG5cbiAgLyogRmx1c2ggYHF1ZXVlYCAobm9ybWFsIHRleHQpLiBNYWNybyBpbnZva2VkIGJlZm9yZVxuICAgKiBlYWNoIGVudGl0eSBhbmQgYXQgdGhlIGVuZCBvZiBgdmFsdWVgLlxuICAgKiBEb2VzIG5vdGhpbmcgd2hlbiBgcXVldWVgIGlzIGVtcHR5LiAqL1xuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHF1ZXVlKTtcblxuICAgICAgaWYgKGhhbmRsZVRleHQpIHtcbiAgICAgICAgaGFuZGxlVGV4dC5jYWxsKHRleHRDb250ZXh0LCBxdWV1ZSwge1xuICAgICAgICAgIHN0YXJ0OiBwcmV2LFxuICAgICAgICAgIGVuZDogbm93KClcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlID0gRU1QVFk7XG4gICAgfVxuICB9XG59XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGlzIG91dHNpZGUgdGhlIHBlcm1pc3NpYmxlXG4gKiB1bmljb2RlIHJhbmdlLiAqL1xuZnVuY3Rpb24gaXNQcm9oaWJpdGVkKGNvZGUpIHtcbiAgcmV0dXJuIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REZGRikgfHwgKGNvZGUgPiAweDEwRkZGRik7XG59XG5cbi8qIENoZWNrIGlmIGBjaGFyYWN0ZXJgIGlzIGRpc2FsbG93ZWQuICovXG5mdW5jdGlvbiBpc1dhcm5pbmcoY29kZSkge1xuICBpZiAoXG4gICAgKGNvZGUgPj0gMHgwMDAxICYmIGNvZGUgPD0gMHgwMDA4KSB8fFxuICAgIGNvZGUgPT09IDB4MDAwQiB8fFxuICAgIChjb2RlID49IDB4MDAwRCAmJiBjb2RlIDw9IDB4MDAxRikgfHxcbiAgICAoY29kZSA+PSAweDAwN0YgJiYgY29kZSA8PSAweDAwOUYpIHx8XG4gICAgKGNvZGUgPj0gMHhGREQwICYmIGNvZGUgPD0gMHhGREVGKSB8fFxuICAgIChjb2RlICYgMHhGRkZGKSA9PT0gMHhGRkZGIHx8XG4gICAgKGNvZGUgJiAweEZGRkYpID09PSAweEZGRkVcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiQUVsaWdcIjogXCLDhlwiLFxuICBcIkFNUFwiOiBcIiZcIixcbiAgXCJBYWN1dGVcIjogXCLDgVwiLFxuICBcIkFjaXJjXCI6IFwiw4JcIixcbiAgXCJBZ3JhdmVcIjogXCLDgFwiLFxuICBcIkFyaW5nXCI6IFwiw4VcIixcbiAgXCJBdGlsZGVcIjogXCLDg1wiLFxuICBcIkF1bWxcIjogXCLDhFwiLFxuICBcIkNPUFlcIjogXCLCqVwiLFxuICBcIkNjZWRpbFwiOiBcIsOHXCIsXG4gIFwiRVRIXCI6IFwiw5BcIixcbiAgXCJFYWN1dGVcIjogXCLDiVwiLFxuICBcIkVjaXJjXCI6IFwiw4pcIixcbiAgXCJFZ3JhdmVcIjogXCLDiFwiLFxuICBcIkV1bWxcIjogXCLDi1wiLFxuICBcIkdUXCI6IFwiPlwiLFxuICBcIklhY3V0ZVwiOiBcIsONXCIsXG4gIFwiSWNpcmNcIjogXCLDjlwiLFxuICBcIklncmF2ZVwiOiBcIsOMXCIsXG4gIFwiSXVtbFwiOiBcIsOPXCIsXG4gIFwiTFRcIjogXCI8XCIsXG4gIFwiTnRpbGRlXCI6IFwiw5FcIixcbiAgXCJPYWN1dGVcIjogXCLDk1wiLFxuICBcIk9jaXJjXCI6IFwiw5RcIixcbiAgXCJPZ3JhdmVcIjogXCLDklwiLFxuICBcIk9zbGFzaFwiOiBcIsOYXCIsXG4gIFwiT3RpbGRlXCI6IFwiw5VcIixcbiAgXCJPdW1sXCI6IFwiw5ZcIixcbiAgXCJRVU9UXCI6IFwiXFxcIlwiLFxuICBcIlJFR1wiOiBcIsKuXCIsXG4gIFwiVEhPUk5cIjogXCLDnlwiLFxuICBcIlVhY3V0ZVwiOiBcIsOaXCIsXG4gIFwiVWNpcmNcIjogXCLDm1wiLFxuICBcIlVncmF2ZVwiOiBcIsOZXCIsXG4gIFwiVXVtbFwiOiBcIsOcXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJhYWN1dGVcIjogXCLDoVwiLFxuICBcImFjaXJjXCI6IFwiw6JcIixcbiAgXCJhY3V0ZVwiOiBcIsK0XCIsXG4gIFwiYWVsaWdcIjogXCLDplwiLFxuICBcImFncmF2ZVwiOiBcIsOgXCIsXG4gIFwiYW1wXCI6IFwiJlwiLFxuICBcImFyaW5nXCI6IFwiw6VcIixcbiAgXCJhdGlsZGVcIjogXCLDo1wiLFxuICBcImF1bWxcIjogXCLDpFwiLFxuICBcImJydmJhclwiOiBcIsKmXCIsXG4gIFwiY2NlZGlsXCI6IFwiw6dcIixcbiAgXCJjZWRpbFwiOiBcIsK4XCIsXG4gIFwiY2VudFwiOiBcIsKiXCIsXG4gIFwiY29weVwiOiBcIsKpXCIsXG4gIFwiY3VycmVuXCI6IFwiwqRcIixcbiAgXCJkZWdcIjogXCLCsFwiLFxuICBcImRpdmlkZVwiOiBcIsO3XCIsXG4gIFwiZWFjdXRlXCI6IFwiw6lcIixcbiAgXCJlY2lyY1wiOiBcIsOqXCIsXG4gIFwiZWdyYXZlXCI6IFwiw6hcIixcbiAgXCJldGhcIjogXCLDsFwiLFxuICBcImV1bWxcIjogXCLDq1wiLFxuICBcImZyYWMxMlwiOiBcIsK9XCIsXG4gIFwiZnJhYzE0XCI6IFwiwrxcIixcbiAgXCJmcmFjMzRcIjogXCLCvlwiLFxuICBcImd0XCI6IFwiPlwiLFxuICBcImlhY3V0ZVwiOiBcIsOtXCIsXG4gIFwiaWNpcmNcIjogXCLDrlwiLFxuICBcImlleGNsXCI6IFwiwqFcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlxdWVzdFwiOiBcIsK/XCIsXG4gIFwiaXVtbFwiOiBcIsOvXCIsXG4gIFwibGFxdW9cIjogXCLCq1wiLFxuICBcImx0XCI6IFwiPFwiLFxuICBcIm1hY3JcIjogXCLCr1wiLFxuICBcIm1pY3JvXCI6IFwiwrVcIixcbiAgXCJtaWRkb3RcIjogXCLCt1wiLFxuICBcIm5ic3BcIjogXCLCoFwiLFxuICBcIm5vdFwiOiBcIsKsXCIsXG4gIFwibnRpbGRlXCI6IFwiw7FcIixcbiAgXCJvYWN1dGVcIjogXCLDs1wiLFxuICBcIm9jaXJjXCI6IFwiw7RcIixcbiAgXCJvZ3JhdmVcIjogXCLDslwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcIm9yZG1cIjogXCLCulwiLFxuICBcIm9zbGFzaFwiOiBcIsO4XCIsXG4gIFwib3RpbGRlXCI6IFwiw7VcIixcbiAgXCJvdW1sXCI6IFwiw7ZcIixcbiAgXCJwYXJhXCI6IFwiwrZcIixcbiAgXCJwbHVzbW5cIjogXCLCsVwiLFxuICBcInBvdW5kXCI6IFwiwqNcIixcbiAgXCJxdW90XCI6IFwiXFxcIlwiLFxuICBcInJhcXVvXCI6IFwiwrtcIixcbiAgXCJyZWdcIjogXCLCrlwiLFxuICBcInNlY3RcIjogXCLCp1wiLFxuICBcInNoeVwiOiBcIsKtXCIsXG4gIFwic3VwMVwiOiBcIsK5XCIsXG4gIFwic3VwMlwiOiBcIsKyXCIsXG4gIFwic3VwM1wiOiBcIsKzXCIsXG4gIFwic3psaWdcIjogXCLDn1wiLFxuICBcInRob3JuXCI6IFwiw75cIixcbiAgXCJ0aW1lc1wiOiBcIsOXXCIsXG4gIFwidWFjdXRlXCI6IFwiw7pcIixcbiAgXCJ1Y2lyY1wiOiBcIsO7XCIsXG4gIFwidWdyYXZlXCI6IFwiw7lcIixcbiAgXCJ1bWxcIjogXCLCqFwiLFxuICBcInV1bWxcIjogXCLDvFwiLFxuICBcInlhY3V0ZVwiOiBcIsO9XCIsXG4gIFwieWVuXCI6IFwiwqVcIixcbiAgXCJ5dW1sXCI6IFwiw79cIlxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcIkFFbGlcIjogXCLDhlwiLFxuICBcIkFFbGlnXCI6IFwiw4ZcIixcbiAgXCJBTVwiOiBcIiZcIixcbiAgXCJBTVBcIjogXCImXCIsXG4gIFwiQWFjdXRcIjogXCLDgVwiLFxuICBcIkFhY3V0ZVwiOiBcIsOBXCIsXG4gIFwiQWJyZXZlXCI6IFwixIJcIixcbiAgXCJBY2lyXCI6IFwiw4JcIixcbiAgXCJBY2lyY1wiOiBcIsOCXCIsXG4gIFwiQWN5XCI6IFwi0JBcIixcbiAgXCJBZnJcIjogXCLwnZSEXCIsXG4gIFwiQWdyYXZcIjogXCLDgFwiLFxuICBcIkFncmF2ZVwiOiBcIsOAXCIsXG4gIFwiQWxwaGFcIjogXCLOkVwiLFxuICBcIkFtYWNyXCI6IFwixIBcIixcbiAgXCJBbmRcIjogXCLiqZNcIixcbiAgXCJBb2dvblwiOiBcIsSEXCIsXG4gIFwiQW9wZlwiOiBcIvCdlLhcIixcbiAgXCJBcHBseUZ1bmN0aW9uXCI6IFwi4oGhXCIsXG4gIFwiQXJpblwiOiBcIsOFXCIsXG4gIFwiQXJpbmdcIjogXCLDhVwiLFxuICBcIkFzY3JcIjogXCLwnZKcXCIsXG4gIFwiQXNzaWduXCI6IFwi4omUXCIsXG4gIFwiQXRpbGRcIjogXCLDg1wiLFxuICBcIkF0aWxkZVwiOiBcIsODXCIsXG4gIFwiQXVtXCI6IFwiw4RcIixcbiAgXCJBdW1sXCI6IFwiw4RcIixcbiAgXCJCYWNrc2xhc2hcIjogXCLiiJZcIixcbiAgXCJCYXJ2XCI6IFwi4qunXCIsXG4gIFwiQmFyd2VkXCI6IFwi4oyGXCIsXG4gIFwiQmN5XCI6IFwi0JFcIixcbiAgXCJCZWNhdXNlXCI6IFwi4oi1XCIsXG4gIFwiQmVybm91bGxpc1wiOiBcIuKErFwiLFxuICBcIkJldGFcIjogXCLOklwiLFxuICBcIkJmclwiOiBcIvCdlIVcIixcbiAgXCJCb3BmXCI6IFwi8J2UuVwiLFxuICBcIkJyZXZlXCI6IFwiy5hcIixcbiAgXCJCc2NyXCI6IFwi4oSsXCIsXG4gIFwiQnVtcGVxXCI6IFwi4omOXCIsXG4gIFwiQ0hjeVwiOiBcItCnXCIsXG4gIFwiQ09QXCI6IFwiwqlcIixcbiAgXCJDT1BZXCI6IFwiwqlcIixcbiAgXCJDYWN1dGVcIjogXCLEhlwiLFxuICBcIkNhcFwiOiBcIuKLklwiLFxuICBcIkNhcGl0YWxEaWZmZXJlbnRpYWxEXCI6IFwi4oWFXCIsXG4gIFwiQ2F5bGV5c1wiOiBcIuKErVwiLFxuICBcIkNjYXJvblwiOiBcIsSMXCIsXG4gIFwiQ2NlZGlcIjogXCLDh1wiLFxuICBcIkNjZWRpbFwiOiBcIsOHXCIsXG4gIFwiQ2NpcmNcIjogXCLEiFwiLFxuICBcIkNjb25pbnRcIjogXCLiiLBcIixcbiAgXCJDZG90XCI6IFwixIpcIixcbiAgXCJDZWRpbGxhXCI6IFwiwrhcIixcbiAgXCJDZW50ZXJEb3RcIjogXCLCt1wiLFxuICBcIkNmclwiOiBcIuKErVwiLFxuICBcIkNoaVwiOiBcIs6nXCIsXG4gIFwiQ2lyY2xlRG90XCI6IFwi4oqZXCIsXG4gIFwiQ2lyY2xlTWludXNcIjogXCLiipZcIixcbiAgXCJDaXJjbGVQbHVzXCI6IFwi4oqVXCIsXG4gIFwiQ2lyY2xlVGltZXNcIjogXCLiipdcIixcbiAgXCJDbG9ja3dpc2VDb250b3VySW50ZWdyYWxcIjogXCLiiLJcIixcbiAgXCJDbG9zZUN1cmx5RG91YmxlUXVvdGVcIjogXCLigJ1cIixcbiAgXCJDbG9zZUN1cmx5UXVvdGVcIjogXCLigJlcIixcbiAgXCJDb2xvblwiOiBcIuKIt1wiLFxuICBcIkNvbG9uZVwiOiBcIuKptFwiLFxuICBcIkNvbmdydWVudFwiOiBcIuKJoVwiLFxuICBcIkNvbmludFwiOiBcIuKIr1wiLFxuICBcIkNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIrlwiLFxuICBcIkNvcGZcIjogXCLihIJcIixcbiAgXCJDb3Byb2R1Y3RcIjogXCLiiJBcIixcbiAgXCJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsXCI6IFwi4oizXCIsXG4gIFwiQ3Jvc3NcIjogXCLiqK9cIixcbiAgXCJDc2NyXCI6IFwi8J2SnlwiLFxuICBcIkN1cFwiOiBcIuKLk1wiLFxuICBcIkN1cENhcFwiOiBcIuKJjVwiLFxuICBcIkREXCI6IFwi4oWFXCIsXG4gIFwiRERvdHJhaGRcIjogXCLipJFcIixcbiAgXCJESmN5XCI6IFwi0IJcIixcbiAgXCJEU2N5XCI6IFwi0IVcIixcbiAgXCJEWmN5XCI6IFwi0I9cIixcbiAgXCJEYWdnZXJcIjogXCLigKFcIixcbiAgXCJEYXJyXCI6IFwi4oahXCIsXG4gIFwiRGFzaHZcIjogXCLiq6RcIixcbiAgXCJEY2Fyb25cIjogXCLEjlwiLFxuICBcIkRjeVwiOiBcItCUXCIsXG4gIFwiRGVsXCI6IFwi4oiHXCIsXG4gIFwiRGVsdGFcIjogXCLOlFwiLFxuICBcIkRmclwiOiBcIvCdlIdcIixcbiAgXCJEaWFjcml0aWNhbEFjdXRlXCI6IFwiwrRcIixcbiAgXCJEaWFjcml0aWNhbERvdFwiOiBcIsuZXCIsXG4gIFwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZVwiOiBcIsudXCIsXG4gIFwiRGlhY3JpdGljYWxHcmF2ZVwiOiBcImBcIixcbiAgXCJEaWFjcml0aWNhbFRpbGRlXCI6IFwiy5xcIixcbiAgXCJEaWFtb25kXCI6IFwi4ouEXCIsXG4gIFwiRGlmZmVyZW50aWFsRFwiOiBcIuKFhlwiLFxuICBcIkRvcGZcIjogXCLwnZS7XCIsXG4gIFwiRG90XCI6IFwiwqhcIixcbiAgXCJEb3REb3RcIjogXCLig5xcIixcbiAgXCJEb3RFcXVhbFwiOiBcIuKJkFwiLFxuICBcIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbFwiOiBcIuKIr1wiLFxuICBcIkRvdWJsZURvdFwiOiBcIsKoXCIsXG4gIFwiRG91YmxlRG93bkFycm93XCI6IFwi4oeTXCIsXG4gIFwiRG91YmxlTGVmdEFycm93XCI6IFwi4oeQXCIsXG4gIFwiRG91YmxlTGVmdFJpZ2h0QXJyb3dcIjogXCLih5RcIixcbiAgXCJEb3VibGVMZWZ0VGVlXCI6IFwi4qukXCIsXG4gIFwiRG91YmxlTG9uZ0xlZnRBcnJvd1wiOiBcIuKfuFwiLFxuICBcIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvd1wiOiBcIuKfulwiLFxuICBcIkRvdWJsZUxvbmdSaWdodEFycm93XCI6IFwi4p+5XCIsXG4gIFwiRG91YmxlUmlnaHRBcnJvd1wiOiBcIuKHklwiLFxuICBcIkRvdWJsZVJpZ2h0VGVlXCI6IFwi4oqoXCIsXG4gIFwiRG91YmxlVXBBcnJvd1wiOiBcIuKHkVwiLFxuICBcIkRvdWJsZVVwRG93bkFycm93XCI6IFwi4oeVXCIsXG4gIFwiRG91YmxlVmVydGljYWxCYXJcIjogXCLiiKVcIixcbiAgXCJEb3duQXJyb3dcIjogXCLihpNcIixcbiAgXCJEb3duQXJyb3dCYXJcIjogXCLipJNcIixcbiAgXCJEb3duQXJyb3dVcEFycm93XCI6IFwi4oe1XCIsXG4gIFwiRG93bkJyZXZlXCI6IFwizJFcIixcbiAgXCJEb3duTGVmdFJpZ2h0VmVjdG9yXCI6IFwi4qWQXCIsXG4gIFwiRG93bkxlZnRUZWVWZWN0b3JcIjogXCLipZ5cIixcbiAgXCJEb3duTGVmdFZlY3RvclwiOiBcIuKGvVwiLFxuICBcIkRvd25MZWZ0VmVjdG9yQmFyXCI6IFwi4qWWXCIsXG4gIFwiRG93blJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWfXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yXCI6IFwi4oeBXCIsXG4gIFwiRG93blJpZ2h0VmVjdG9yQmFyXCI6IFwi4qWXXCIsXG4gIFwiRG93blRlZVwiOiBcIuKKpFwiLFxuICBcIkRvd25UZWVBcnJvd1wiOiBcIuKGp1wiLFxuICBcIkRvd25hcnJvd1wiOiBcIuKHk1wiLFxuICBcIkRzY3JcIjogXCLwnZKfXCIsXG4gIFwiRHN0cm9rXCI6IFwixJBcIixcbiAgXCJFTkdcIjogXCLFilwiLFxuICBcIkVUXCI6IFwiw5BcIixcbiAgXCJFVEhcIjogXCLDkFwiLFxuICBcIkVhY3V0XCI6IFwiw4lcIixcbiAgXCJFYWN1dGVcIjogXCLDiVwiLFxuICBcIkVjYXJvblwiOiBcIsSaXCIsXG4gIFwiRWNpclwiOiBcIsOKXCIsXG4gIFwiRWNpcmNcIjogXCLDilwiLFxuICBcIkVjeVwiOiBcItCtXCIsXG4gIFwiRWRvdFwiOiBcIsSWXCIsXG4gIFwiRWZyXCI6IFwi8J2UiFwiLFxuICBcIkVncmF2XCI6IFwiw4hcIixcbiAgXCJFZ3JhdmVcIjogXCLDiFwiLFxuICBcIkVsZW1lbnRcIjogXCLiiIhcIixcbiAgXCJFbWFjclwiOiBcIsSSXCIsXG4gIFwiRW1wdHlTbWFsbFNxdWFyZVwiOiBcIuKXu1wiLFxuICBcIkVtcHR5VmVyeVNtYWxsU3F1YXJlXCI6IFwi4parXCIsXG4gIFwiRW9nb25cIjogXCLEmFwiLFxuICBcIkVvcGZcIjogXCLwnZS8XCIsXG4gIFwiRXBzaWxvblwiOiBcIs6VXCIsXG4gIFwiRXF1YWxcIjogXCLiqbVcIixcbiAgXCJFcXVhbFRpbGRlXCI6IFwi4omCXCIsXG4gIFwiRXF1aWxpYnJpdW1cIjogXCLih4xcIixcbiAgXCJFc2NyXCI6IFwi4oSwXCIsXG4gIFwiRXNpbVwiOiBcIuKps1wiLFxuICBcIkV0YVwiOiBcIs6XXCIsXG4gIFwiRXVtXCI6IFwiw4tcIixcbiAgXCJFdW1sXCI6IFwiw4tcIixcbiAgXCJFeGlzdHNcIjogXCLiiINcIixcbiAgXCJFeHBvbmVudGlhbEVcIjogXCLihYdcIixcbiAgXCJGY3lcIjogXCLQpFwiLFxuICBcIkZmclwiOiBcIvCdlIlcIixcbiAgXCJGaWxsZWRTbWFsbFNxdWFyZVwiOiBcIuKXvFwiLFxuICBcIkZpbGxlZFZlcnlTbWFsbFNxdWFyZVwiOiBcIuKWqlwiLFxuICBcIkZvcGZcIjogXCLwnZS9XCIsXG4gIFwiRm9yQWxsXCI6IFwi4oiAXCIsXG4gIFwiRm91cmllcnRyZlwiOiBcIuKEsVwiLFxuICBcIkZzY3JcIjogXCLihLFcIixcbiAgXCJHSmN5XCI6IFwi0INcIixcbiAgXCJHXCI6IFwiPlwiLFxuICBcIkdUXCI6IFwiPlwiLFxuICBcIkdhbW1hXCI6IFwizpNcIixcbiAgXCJHYW1tYWRcIjogXCLPnFwiLFxuICBcIkdicmV2ZVwiOiBcIsSeXCIsXG4gIFwiR2NlZGlsXCI6IFwixKJcIixcbiAgXCJHY2lyY1wiOiBcIsScXCIsXG4gIFwiR2N5XCI6IFwi0JNcIixcbiAgXCJHZG90XCI6IFwixKBcIixcbiAgXCJHZnJcIjogXCLwnZSKXCIsXG4gIFwiR2dcIjogXCLii5lcIixcbiAgXCJHb3BmXCI6IFwi8J2UvlwiLFxuICBcIkdyZWF0ZXJFcXVhbFwiOiBcIuKJpVwiLFxuICBcIkdyZWF0ZXJFcXVhbExlc3NcIjogXCLii5tcIixcbiAgXCJHcmVhdGVyRnVsbEVxdWFsXCI6IFwi4omnXCIsXG4gIFwiR3JlYXRlckdyZWF0ZXJcIjogXCLiqqJcIixcbiAgXCJHcmVhdGVyTGVzc1wiOiBcIuKJt1wiLFxuICBcIkdyZWF0ZXJTbGFudEVxdWFsXCI6IFwi4qm+XCIsXG4gIFwiR3JlYXRlclRpbGRlXCI6IFwi4omzXCIsXG4gIFwiR3NjclwiOiBcIvCdkqJcIixcbiAgXCJHdFwiOiBcIuKJq1wiLFxuICBcIkhBUkRjeVwiOiBcItCqXCIsXG4gIFwiSGFjZWtcIjogXCLLh1wiLFxuICBcIkhhdFwiOiBcIl5cIixcbiAgXCJIY2lyY1wiOiBcIsSkXCIsXG4gIFwiSGZyXCI6IFwi4oSMXCIsXG4gIFwiSGlsYmVydFNwYWNlXCI6IFwi4oSLXCIsXG4gIFwiSG9wZlwiOiBcIuKEjVwiLFxuICBcIkhvcml6b250YWxMaW5lXCI6IFwi4pSAXCIsXG4gIFwiSHNjclwiOiBcIuKEi1wiLFxuICBcIkhzdHJva1wiOiBcIsSmXCIsXG4gIFwiSHVtcERvd25IdW1wXCI6IFwi4omOXCIsXG4gIFwiSHVtcEVxdWFsXCI6IFwi4omPXCIsXG4gIFwiSUVjeVwiOiBcItCVXCIsXG4gIFwiSUpsaWdcIjogXCLEslwiLFxuICBcIklPY3lcIjogXCLQgVwiLFxuICBcIklhY3V0XCI6IFwiw41cIixcbiAgXCJJYWN1dGVcIjogXCLDjVwiLFxuICBcIkljaXJcIjogXCLDjlwiLFxuICBcIkljaXJjXCI6IFwiw45cIixcbiAgXCJJY3lcIjogXCLQmFwiLFxuICBcIklkb3RcIjogXCLEsFwiLFxuICBcIklmclwiOiBcIuKEkVwiLFxuICBcIklncmF2XCI6IFwiw4xcIixcbiAgXCJJZ3JhdmVcIjogXCLDjFwiLFxuICBcIkltXCI6IFwi4oSRXCIsXG4gIFwiSW1hY3JcIjogXCLEqlwiLFxuICBcIkltYWdpbmFyeUlcIjogXCLihYhcIixcbiAgXCJJbXBsaWVzXCI6IFwi4oeSXCIsXG4gIFwiSW50XCI6IFwi4oisXCIsXG4gIFwiSW50ZWdyYWxcIjogXCLiiKtcIixcbiAgXCJJbnRlcnNlY3Rpb25cIjogXCLii4JcIixcbiAgXCJJbnZpc2libGVDb21tYVwiOiBcIuKBo1wiLFxuICBcIkludmlzaWJsZVRpbWVzXCI6IFwi4oGiXCIsXG4gIFwiSW9nb25cIjogXCLErlwiLFxuICBcIklvcGZcIjogXCLwnZWAXCIsXG4gIFwiSW90YVwiOiBcIs6ZXCIsXG4gIFwiSXNjclwiOiBcIuKEkFwiLFxuICBcIkl0aWxkZVwiOiBcIsSoXCIsXG4gIFwiSXVrY3lcIjogXCLQhlwiLFxuICBcIkl1bVwiOiBcIsOPXCIsXG4gIFwiSXVtbFwiOiBcIsOPXCIsXG4gIFwiSmNpcmNcIjogXCLEtFwiLFxuICBcIkpjeVwiOiBcItCZXCIsXG4gIFwiSmZyXCI6IFwi8J2UjVwiLFxuICBcIkpvcGZcIjogXCLwnZWBXCIsXG4gIFwiSnNjclwiOiBcIvCdkqVcIixcbiAgXCJKc2VyY3lcIjogXCLQiFwiLFxuICBcIkp1a2N5XCI6IFwi0IRcIixcbiAgXCJLSGN5XCI6IFwi0KVcIixcbiAgXCJLSmN5XCI6IFwi0IxcIixcbiAgXCJLYXBwYVwiOiBcIs6aXCIsXG4gIFwiS2NlZGlsXCI6IFwixLZcIixcbiAgXCJLY3lcIjogXCLQmlwiLFxuICBcIktmclwiOiBcIvCdlI5cIixcbiAgXCJLb3BmXCI6IFwi8J2VglwiLFxuICBcIktzY3JcIjogXCLwnZKmXCIsXG4gIFwiTEpjeVwiOiBcItCJXCIsXG4gIFwiTFwiOiBcIjxcIixcbiAgXCJMVFwiOiBcIjxcIixcbiAgXCJMYWN1dGVcIjogXCLEuVwiLFxuICBcIkxhbWJkYVwiOiBcIs6bXCIsXG4gIFwiTGFuZ1wiOiBcIuKfqlwiLFxuICBcIkxhcGxhY2V0cmZcIjogXCLihJJcIixcbiAgXCJMYXJyXCI6IFwi4oaeXCIsXG4gIFwiTGNhcm9uXCI6IFwixL1cIixcbiAgXCJMY2VkaWxcIjogXCLEu1wiLFxuICBcIkxjeVwiOiBcItCbXCIsXG4gIFwiTGVmdEFuZ2xlQnJhY2tldFwiOiBcIuKfqFwiLFxuICBcIkxlZnRBcnJvd1wiOiBcIuKGkFwiLFxuICBcIkxlZnRBcnJvd0JhclwiOiBcIuKHpFwiLFxuICBcIkxlZnRBcnJvd1JpZ2h0QXJyb3dcIjogXCLih4ZcIixcbiAgXCJMZWZ0Q2VpbGluZ1wiOiBcIuKMiFwiLFxuICBcIkxlZnREb3VibGVCcmFja2V0XCI6IFwi4p+mXCIsXG4gIFwiTGVmdERvd25UZWVWZWN0b3JcIjogXCLipaFcIixcbiAgXCJMZWZ0RG93blZlY3RvclwiOiBcIuKHg1wiLFxuICBcIkxlZnREb3duVmVjdG9yQmFyXCI6IFwi4qWZXCIsXG4gIFwiTGVmdEZsb29yXCI6IFwi4oyKXCIsXG4gIFwiTGVmdFJpZ2h0QXJyb3dcIjogXCLihpRcIixcbiAgXCJMZWZ0UmlnaHRWZWN0b3JcIjogXCLipY5cIixcbiAgXCJMZWZ0VGVlXCI6IFwi4oqjXCIsXG4gIFwiTGVmdFRlZUFycm93XCI6IFwi4oakXCIsXG4gIFwiTGVmdFRlZVZlY3RvclwiOiBcIuKlmlwiLFxuICBcIkxlZnRUcmlhbmdsZVwiOiBcIuKKslwiLFxuICBcIkxlZnRUcmlhbmdsZUJhclwiOiBcIuKnj1wiLFxuICBcIkxlZnRUcmlhbmdsZUVxdWFsXCI6IFwi4oq0XCIsXG4gIFwiTGVmdFVwRG93blZlY3RvclwiOiBcIuKlkVwiLFxuICBcIkxlZnRVcFRlZVZlY3RvclwiOiBcIuKloFwiLFxuICBcIkxlZnRVcFZlY3RvclwiOiBcIuKGv1wiLFxuICBcIkxlZnRVcFZlY3RvckJhclwiOiBcIuKlmFwiLFxuICBcIkxlZnRWZWN0b3JcIjogXCLihrxcIixcbiAgXCJMZWZ0VmVjdG9yQmFyXCI6IFwi4qWSXCIsXG4gIFwiTGVmdGFycm93XCI6IFwi4oeQXCIsXG4gIFwiTGVmdHJpZ2h0YXJyb3dcIjogXCLih5RcIixcbiAgXCJMZXNzRXF1YWxHcmVhdGVyXCI6IFwi4ouaXCIsXG4gIFwiTGVzc0Z1bGxFcXVhbFwiOiBcIuKJplwiLFxuICBcIkxlc3NHcmVhdGVyXCI6IFwi4om2XCIsXG4gIFwiTGVzc0xlc3NcIjogXCLiqqFcIixcbiAgXCJMZXNzU2xhbnRFcXVhbFwiOiBcIuKpvVwiLFxuICBcIkxlc3NUaWxkZVwiOiBcIuKJslwiLFxuICBcIkxmclwiOiBcIvCdlI9cIixcbiAgXCJMbFwiOiBcIuKLmFwiLFxuICBcIkxsZWZ0YXJyb3dcIjogXCLih5pcIixcbiAgXCJMbWlkb3RcIjogXCLEv1wiLFxuICBcIkxvbmdMZWZ0QXJyb3dcIjogXCLin7VcIixcbiAgXCJMb25nTGVmdFJpZ2h0QXJyb3dcIjogXCLin7dcIixcbiAgXCJMb25nUmlnaHRBcnJvd1wiOiBcIuKftlwiLFxuICBcIkxvbmdsZWZ0YXJyb3dcIjogXCLin7hcIixcbiAgXCJMb25nbGVmdHJpZ2h0YXJyb3dcIjogXCLin7pcIixcbiAgXCJMb25ncmlnaHRhcnJvd1wiOiBcIuKfuVwiLFxuICBcIkxvcGZcIjogXCLwnZWDXCIsXG4gIFwiTG93ZXJMZWZ0QXJyb3dcIjogXCLihplcIixcbiAgXCJMb3dlclJpZ2h0QXJyb3dcIjogXCLihphcIixcbiAgXCJMc2NyXCI6IFwi4oSSXCIsXG4gIFwiTHNoXCI6IFwi4oawXCIsXG4gIFwiTHN0cm9rXCI6IFwixYFcIixcbiAgXCJMdFwiOiBcIuKJqlwiLFxuICBcIk1hcFwiOiBcIuKkhVwiLFxuICBcIk1jeVwiOiBcItCcXCIsXG4gIFwiTWVkaXVtU3BhY2VcIjogXCLigZ9cIixcbiAgXCJNZWxsaW50cmZcIjogXCLihLNcIixcbiAgXCJNZnJcIjogXCLwnZSQXCIsXG4gIFwiTWludXNQbHVzXCI6IFwi4oiTXCIsXG4gIFwiTW9wZlwiOiBcIvCdlYRcIixcbiAgXCJNc2NyXCI6IFwi4oSzXCIsXG4gIFwiTXVcIjogXCLOnFwiLFxuICBcIk5KY3lcIjogXCLQilwiLFxuICBcIk5hY3V0ZVwiOiBcIsWDXCIsXG4gIFwiTmNhcm9uXCI6IFwixYdcIixcbiAgXCJOY2VkaWxcIjogXCLFhVwiLFxuICBcIk5jeVwiOiBcItCdXCIsXG4gIFwiTmVnYXRpdmVNZWRpdW1TcGFjZVwiOiBcIuKAi1wiLFxuICBcIk5lZ2F0aXZlVGhpY2tTcGFjZVwiOiBcIuKAi1wiLFxuICBcIk5lZ2F0aXZlVGhpblNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiTmVzdGVkR3JlYXRlckdyZWF0ZXJcIjogXCLiiatcIixcbiAgXCJOZXN0ZWRMZXNzTGVzc1wiOiBcIuKJqlwiLFxuICBcIk5ld0xpbmVcIjogXCJcXG5cIixcbiAgXCJOZnJcIjogXCLwnZSRXCIsXG4gIFwiTm9CcmVha1wiOiBcIuKBoFwiLFxuICBcIk5vbkJyZWFraW5nU3BhY2VcIjogXCLCoFwiLFxuICBcIk5vcGZcIjogXCLihJVcIixcbiAgXCJOb3RcIjogXCLiq6xcIixcbiAgXCJOb3RDb25ncnVlbnRcIjogXCLiiaJcIixcbiAgXCJOb3RDdXBDYXBcIjogXCLiia1cIixcbiAgXCJOb3REb3VibGVWZXJ0aWNhbEJhclwiOiBcIuKIplwiLFxuICBcIk5vdEVsZW1lbnRcIjogXCLiiIlcIixcbiAgXCJOb3RFcXVhbFwiOiBcIuKJoFwiLFxuICBcIk5vdEVxdWFsVGlsZGVcIjogXCLiiYLMuFwiLFxuICBcIk5vdEV4aXN0c1wiOiBcIuKIhFwiLFxuICBcIk5vdEdyZWF0ZXJcIjogXCLiia9cIixcbiAgXCJOb3RHcmVhdGVyRXF1YWxcIjogXCLiibFcIixcbiAgXCJOb3RHcmVhdGVyRnVsbEVxdWFsXCI6IFwi4omnzLhcIixcbiAgXCJOb3RHcmVhdGVyR3JlYXRlclwiOiBcIuKJq8y4XCIsXG4gIFwiTm90R3JlYXRlckxlc3NcIjogXCLiiblcIixcbiAgXCJOb3RHcmVhdGVyU2xhbnRFcXVhbFwiOiBcIuKpvsy4XCIsXG4gIFwiTm90R3JlYXRlclRpbGRlXCI6IFwi4om1XCIsXG4gIFwiTm90SHVtcERvd25IdW1wXCI6IFwi4omOzLhcIixcbiAgXCJOb3RIdW1wRXF1YWxcIjogXCLiiY/MuFwiLFxuICBcIk5vdExlZnRUcmlhbmdsZVwiOiBcIuKLqlwiLFxuICBcIk5vdExlZnRUcmlhbmdsZUJhclwiOiBcIuKnj8y4XCIsXG4gIFwiTm90TGVmdFRyaWFuZ2xlRXF1YWxcIjogXCLii6xcIixcbiAgXCJOb3RMZXNzXCI6IFwi4omuXCIsXG4gIFwiTm90TGVzc0VxdWFsXCI6IFwi4omwXCIsXG4gIFwiTm90TGVzc0dyZWF0ZXJcIjogXCLiibhcIixcbiAgXCJOb3RMZXNzTGVzc1wiOiBcIuKJqsy4XCIsXG4gIFwiTm90TGVzc1NsYW50RXF1YWxcIjogXCLiqb3MuFwiLFxuICBcIk5vdExlc3NUaWxkZVwiOiBcIuKJtFwiLFxuICBcIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyXCI6IFwi4qqizLhcIixcbiAgXCJOb3ROZXN0ZWRMZXNzTGVzc1wiOiBcIuKqocy4XCIsXG4gIFwiTm90UHJlY2VkZXNcIjogXCLiioBcIixcbiAgXCJOb3RQcmVjZWRlc0VxdWFsXCI6IFwi4qqvzLhcIixcbiAgXCJOb3RQcmVjZWRlc1NsYW50RXF1YWxcIjogXCLii6BcIixcbiAgXCJOb3RSZXZlcnNlRWxlbWVudFwiOiBcIuKIjFwiLFxuICBcIk5vdFJpZ2h0VHJpYW5nbGVcIjogXCLii6tcIixcbiAgXCJOb3RSaWdodFRyaWFuZ2xlQmFyXCI6IFwi4qeQzLhcIixcbiAgXCJOb3RSaWdodFRyaWFuZ2xlRXF1YWxcIjogXCLii61cIixcbiAgXCJOb3RTcXVhcmVTdWJzZXRcIjogXCLiio/MuFwiLFxuICBcIk5vdFNxdWFyZVN1YnNldEVxdWFsXCI6IFwi4ouiXCIsXG4gIFwiTm90U3F1YXJlU3VwZXJzZXRcIjogXCLiipDMuFwiLFxuICBcIk5vdFNxdWFyZVN1cGVyc2V0RXF1YWxcIjogXCLii6NcIixcbiAgXCJOb3RTdWJzZXRcIjogXCLiioLig5JcIixcbiAgXCJOb3RTdWJzZXRFcXVhbFwiOiBcIuKKiFwiLFxuICBcIk5vdFN1Y2NlZWRzXCI6IFwi4oqBXCIsXG4gIFwiTm90U3VjY2VlZHNFcXVhbFwiOiBcIuKqsMy4XCIsXG4gIFwiTm90U3VjY2VlZHNTbGFudEVxdWFsXCI6IFwi4ouhXCIsXG4gIFwiTm90U3VjY2VlZHNUaWxkZVwiOiBcIuKJv8y4XCIsXG4gIFwiTm90U3VwZXJzZXRcIjogXCLiioPig5JcIixcbiAgXCJOb3RTdXBlcnNldEVxdWFsXCI6IFwi4oqJXCIsXG4gIFwiTm90VGlsZGVcIjogXCLiiYFcIixcbiAgXCJOb3RUaWxkZUVxdWFsXCI6IFwi4omEXCIsXG4gIFwiTm90VGlsZGVGdWxsRXF1YWxcIjogXCLiiYdcIixcbiAgXCJOb3RUaWxkZVRpbGRlXCI6IFwi4omJXCIsXG4gIFwiTm90VmVydGljYWxCYXJcIjogXCLiiKRcIixcbiAgXCJOc2NyXCI6IFwi8J2SqVwiLFxuICBcIk50aWxkXCI6IFwiw5FcIixcbiAgXCJOdGlsZGVcIjogXCLDkVwiLFxuICBcIk51XCI6IFwizp1cIixcbiAgXCJPRWxpZ1wiOiBcIsWSXCIsXG4gIFwiT2FjdXRcIjogXCLDk1wiLFxuICBcIk9hY3V0ZVwiOiBcIsOTXCIsXG4gIFwiT2NpclwiOiBcIsOUXCIsXG4gIFwiT2NpcmNcIjogXCLDlFwiLFxuICBcIk9jeVwiOiBcItCeXCIsXG4gIFwiT2RibGFjXCI6IFwixZBcIixcbiAgXCJPZnJcIjogXCLwnZSSXCIsXG4gIFwiT2dyYXZcIjogXCLDklwiLFxuICBcIk9ncmF2ZVwiOiBcIsOSXCIsXG4gIFwiT21hY3JcIjogXCLFjFwiLFxuICBcIk9tZWdhXCI6IFwizqlcIixcbiAgXCJPbWljcm9uXCI6IFwizp9cIixcbiAgXCJPb3BmXCI6IFwi8J2VhlwiLFxuICBcIk9wZW5DdXJseURvdWJsZVF1b3RlXCI6IFwi4oCcXCIsXG4gIFwiT3BlbkN1cmx5UXVvdGVcIjogXCLigJhcIixcbiAgXCJPclwiOiBcIuKplFwiLFxuICBcIk9zY3JcIjogXCLwnZKqXCIsXG4gIFwiT3NsYXNcIjogXCLDmFwiLFxuICBcIk9zbGFzaFwiOiBcIsOYXCIsXG4gIFwiT3RpbGRcIjogXCLDlVwiLFxuICBcIk90aWxkZVwiOiBcIsOVXCIsXG4gIFwiT3RpbWVzXCI6IFwi4qi3XCIsXG4gIFwiT3VtXCI6IFwiw5ZcIixcbiAgXCJPdW1sXCI6IFwiw5ZcIixcbiAgXCJPdmVyQmFyXCI6IFwi4oC+XCIsXG4gIFwiT3ZlckJyYWNlXCI6IFwi4o+eXCIsXG4gIFwiT3ZlckJyYWNrZXRcIjogXCLijrRcIixcbiAgXCJPdmVyUGFyZW50aGVzaXNcIjogXCLij5xcIixcbiAgXCJQYXJ0aWFsRFwiOiBcIuKIglwiLFxuICBcIlBjeVwiOiBcItCfXCIsXG4gIFwiUGZyXCI6IFwi8J2Uk1wiLFxuICBcIlBoaVwiOiBcIs6mXCIsXG4gIFwiUGlcIjogXCLOoFwiLFxuICBcIlBsdXNNaW51c1wiOiBcIsKxXCIsXG4gIFwiUG9pbmNhcmVwbGFuZVwiOiBcIuKEjFwiLFxuICBcIlBvcGZcIjogXCLihJlcIixcbiAgXCJQclwiOiBcIuKqu1wiLFxuICBcIlByZWNlZGVzXCI6IFwi4om6XCIsXG4gIFwiUHJlY2VkZXNFcXVhbFwiOiBcIuKqr1wiLFxuICBcIlByZWNlZGVzU2xhbnRFcXVhbFwiOiBcIuKJvFwiLFxuICBcIlByZWNlZGVzVGlsZGVcIjogXCLiib5cIixcbiAgXCJQcmltZVwiOiBcIuKAs1wiLFxuICBcIlByb2R1Y3RcIjogXCLiiI9cIixcbiAgXCJQcm9wb3J0aW9uXCI6IFwi4oi3XCIsXG4gIFwiUHJvcG9ydGlvbmFsXCI6IFwi4oidXCIsXG4gIFwiUHNjclwiOiBcIvCdkqtcIixcbiAgXCJQc2lcIjogXCLOqFwiLFxuICBcIlFVT1wiOiBcIlxcXCJcIixcbiAgXCJRVU9UXCI6IFwiXFxcIlwiLFxuICBcIlFmclwiOiBcIvCdlJRcIixcbiAgXCJRb3BmXCI6IFwi4oSaXCIsXG4gIFwiUXNjclwiOiBcIvCdkqxcIixcbiAgXCJSQmFyclwiOiBcIuKkkFwiLFxuICBcIlJFXCI6IFwiwq5cIixcbiAgXCJSRUdcIjogXCLCrlwiLFxuICBcIlJhY3V0ZVwiOiBcIsWUXCIsXG4gIFwiUmFuZ1wiOiBcIuKfq1wiLFxuICBcIlJhcnJcIjogXCLihqBcIixcbiAgXCJSYXJydGxcIjogXCLipJZcIixcbiAgXCJSY2Fyb25cIjogXCLFmFwiLFxuICBcIlJjZWRpbFwiOiBcIsWWXCIsXG4gIFwiUmN5XCI6IFwi0KBcIixcbiAgXCJSZVwiOiBcIuKEnFwiLFxuICBcIlJldmVyc2VFbGVtZW50XCI6IFwi4oiLXCIsXG4gIFwiUmV2ZXJzZUVxdWlsaWJyaXVtXCI6IFwi4oeLXCIsXG4gIFwiUmV2ZXJzZVVwRXF1aWxpYnJpdW1cIjogXCLipa9cIixcbiAgXCJSZnJcIjogXCLihJxcIixcbiAgXCJSaG9cIjogXCLOoVwiLFxuICBcIlJpZ2h0QW5nbGVCcmFja2V0XCI6IFwi4p+pXCIsXG4gIFwiUmlnaHRBcnJvd1wiOiBcIuKGklwiLFxuICBcIlJpZ2h0QXJyb3dCYXJcIjogXCLih6VcIixcbiAgXCJSaWdodEFycm93TGVmdEFycm93XCI6IFwi4oeEXCIsXG4gIFwiUmlnaHRDZWlsaW5nXCI6IFwi4oyJXCIsXG4gIFwiUmlnaHREb3VibGVCcmFja2V0XCI6IFwi4p+nXCIsXG4gIFwiUmlnaHREb3duVGVlVmVjdG9yXCI6IFwi4qWdXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yXCI6IFwi4oeCXCIsXG4gIFwiUmlnaHREb3duVmVjdG9yQmFyXCI6IFwi4qWVXCIsXG4gIFwiUmlnaHRGbG9vclwiOiBcIuKMi1wiLFxuICBcIlJpZ2h0VGVlXCI6IFwi4oqiXCIsXG4gIFwiUmlnaHRUZWVBcnJvd1wiOiBcIuKGplwiLFxuICBcIlJpZ2h0VGVlVmVjdG9yXCI6IFwi4qWbXCIsXG4gIFwiUmlnaHRUcmlhbmdsZVwiOiBcIuKKs1wiLFxuICBcIlJpZ2h0VHJpYW5nbGVCYXJcIjogXCLip5BcIixcbiAgXCJSaWdodFRyaWFuZ2xlRXF1YWxcIjogXCLiirVcIixcbiAgXCJSaWdodFVwRG93blZlY3RvclwiOiBcIuKlj1wiLFxuICBcIlJpZ2h0VXBUZWVWZWN0b3JcIjogXCLipZxcIixcbiAgXCJSaWdodFVwVmVjdG9yXCI6IFwi4oa+XCIsXG4gIFwiUmlnaHRVcFZlY3RvckJhclwiOiBcIuKllFwiLFxuICBcIlJpZ2h0VmVjdG9yXCI6IFwi4oeAXCIsXG4gIFwiUmlnaHRWZWN0b3JCYXJcIjogXCLipZNcIixcbiAgXCJSaWdodGFycm93XCI6IFwi4oeSXCIsXG4gIFwiUm9wZlwiOiBcIuKEnVwiLFxuICBcIlJvdW5kSW1wbGllc1wiOiBcIuKlsFwiLFxuICBcIlJyaWdodGFycm93XCI6IFwi4oebXCIsXG4gIFwiUnNjclwiOiBcIuKEm1wiLFxuICBcIlJzaFwiOiBcIuKGsVwiLFxuICBcIlJ1bGVEZWxheWVkXCI6IFwi4qe0XCIsXG4gIFwiU0hDSGN5XCI6IFwi0KlcIixcbiAgXCJTSGN5XCI6IFwi0KhcIixcbiAgXCJTT0ZUY3lcIjogXCLQrFwiLFxuICBcIlNhY3V0ZVwiOiBcIsWaXCIsXG4gIFwiU2NcIjogXCLiqrxcIixcbiAgXCJTY2Fyb25cIjogXCLFoFwiLFxuICBcIlNjZWRpbFwiOiBcIsWeXCIsXG4gIFwiU2NpcmNcIjogXCLFnFwiLFxuICBcIlNjeVwiOiBcItChXCIsXG4gIFwiU2ZyXCI6IFwi8J2UllwiLFxuICBcIlNob3J0RG93bkFycm93XCI6IFwi4oaTXCIsXG4gIFwiU2hvcnRMZWZ0QXJyb3dcIjogXCLihpBcIixcbiAgXCJTaG9ydFJpZ2h0QXJyb3dcIjogXCLihpJcIixcbiAgXCJTaG9ydFVwQXJyb3dcIjogXCLihpFcIixcbiAgXCJTaWdtYVwiOiBcIs6jXCIsXG4gIFwiU21hbGxDaXJjbGVcIjogXCLiiJhcIixcbiAgXCJTb3BmXCI6IFwi8J2VilwiLFxuICBcIlNxcnRcIjogXCLiiJpcIixcbiAgXCJTcXVhcmVcIjogXCLilqFcIixcbiAgXCJTcXVhcmVJbnRlcnNlY3Rpb25cIjogXCLiipNcIixcbiAgXCJTcXVhcmVTdWJzZXRcIjogXCLiio9cIixcbiAgXCJTcXVhcmVTdWJzZXRFcXVhbFwiOiBcIuKKkVwiLFxuICBcIlNxdWFyZVN1cGVyc2V0XCI6IFwi4oqQXCIsXG4gIFwiU3F1YXJlU3VwZXJzZXRFcXVhbFwiOiBcIuKKklwiLFxuICBcIlNxdWFyZVVuaW9uXCI6IFwi4oqUXCIsXG4gIFwiU3NjclwiOiBcIvCdkq5cIixcbiAgXCJTdGFyXCI6IFwi4ouGXCIsXG4gIFwiU3ViXCI6IFwi4ouQXCIsXG4gIFwiU3Vic2V0XCI6IFwi4ouQXCIsXG4gIFwiU3Vic2V0RXF1YWxcIjogXCLiioZcIixcbiAgXCJTdWNjZWVkc1wiOiBcIuKJu1wiLFxuICBcIlN1Y2NlZWRzRXF1YWxcIjogXCLiqrBcIixcbiAgXCJTdWNjZWVkc1NsYW50RXF1YWxcIjogXCLiib1cIixcbiAgXCJTdWNjZWVkc1RpbGRlXCI6IFwi4om/XCIsXG4gIFwiU3VjaFRoYXRcIjogXCLiiItcIixcbiAgXCJTdW1cIjogXCLiiJFcIixcbiAgXCJTdXBcIjogXCLii5FcIixcbiAgXCJTdXBlcnNldFwiOiBcIuKKg1wiLFxuICBcIlN1cGVyc2V0RXF1YWxcIjogXCLiiodcIixcbiAgXCJTdXBzZXRcIjogXCLii5FcIixcbiAgXCJUSE9SXCI6IFwiw55cIixcbiAgXCJUSE9STlwiOiBcIsOeXCIsXG4gIFwiVFJBREVcIjogXCLihKJcIixcbiAgXCJUU0hjeVwiOiBcItCLXCIsXG4gIFwiVFNjeVwiOiBcItCmXCIsXG4gIFwiVGFiXCI6IFwiXFx0XCIsXG4gIFwiVGF1XCI6IFwizqRcIixcbiAgXCJUY2Fyb25cIjogXCLFpFwiLFxuICBcIlRjZWRpbFwiOiBcIsWiXCIsXG4gIFwiVGN5XCI6IFwi0KJcIixcbiAgXCJUZnJcIjogXCLwnZSXXCIsXG4gIFwiVGhlcmVmb3JlXCI6IFwi4oi0XCIsXG4gIFwiVGhldGFcIjogXCLOmFwiLFxuICBcIlRoaWNrU3BhY2VcIjogXCLigZ/igIpcIixcbiAgXCJUaGluU3BhY2VcIjogXCLigIlcIixcbiAgXCJUaWxkZVwiOiBcIuKIvFwiLFxuICBcIlRpbGRlRXF1YWxcIjogXCLiiYNcIixcbiAgXCJUaWxkZUZ1bGxFcXVhbFwiOiBcIuKJhVwiLFxuICBcIlRpbGRlVGlsZGVcIjogXCLiiYhcIixcbiAgXCJUb3BmXCI6IFwi8J2Vi1wiLFxuICBcIlRyaXBsZURvdFwiOiBcIuKDm1wiLFxuICBcIlRzY3JcIjogXCLwnZKvXCIsXG4gIFwiVHN0cm9rXCI6IFwixaZcIixcbiAgXCJVYWN1dFwiOiBcIsOaXCIsXG4gIFwiVWFjdXRlXCI6IFwiw5pcIixcbiAgXCJVYXJyXCI6IFwi4oafXCIsXG4gIFwiVWFycm9jaXJcIjogXCLipYlcIixcbiAgXCJVYnJjeVwiOiBcItCOXCIsXG4gIFwiVWJyZXZlXCI6IFwixaxcIixcbiAgXCJVY2lyXCI6IFwiw5tcIixcbiAgXCJVY2lyY1wiOiBcIsObXCIsXG4gIFwiVWN5XCI6IFwi0KNcIixcbiAgXCJVZGJsYWNcIjogXCLFsFwiLFxuICBcIlVmclwiOiBcIvCdlJhcIixcbiAgXCJVZ3JhdlwiOiBcIsOZXCIsXG4gIFwiVWdyYXZlXCI6IFwiw5lcIixcbiAgXCJVbWFjclwiOiBcIsWqXCIsXG4gIFwiVW5kZXJCYXJcIjogXCJfXCIsXG4gIFwiVW5kZXJCcmFjZVwiOiBcIuKPn1wiLFxuICBcIlVuZGVyQnJhY2tldFwiOiBcIuKOtVwiLFxuICBcIlVuZGVyUGFyZW50aGVzaXNcIjogXCLij51cIixcbiAgXCJVbmlvblwiOiBcIuKLg1wiLFxuICBcIlVuaW9uUGx1c1wiOiBcIuKKjlwiLFxuICBcIlVvZ29uXCI6IFwixbJcIixcbiAgXCJVb3BmXCI6IFwi8J2VjFwiLFxuICBcIlVwQXJyb3dcIjogXCLihpFcIixcbiAgXCJVcEFycm93QmFyXCI6IFwi4qSSXCIsXG4gIFwiVXBBcnJvd0Rvd25BcnJvd1wiOiBcIuKHhVwiLFxuICBcIlVwRG93bkFycm93XCI6IFwi4oaVXCIsXG4gIFwiVXBFcXVpbGlicml1bVwiOiBcIuKlrlwiLFxuICBcIlVwVGVlXCI6IFwi4oqlXCIsXG4gIFwiVXBUZWVBcnJvd1wiOiBcIuKGpVwiLFxuICBcIlVwYXJyb3dcIjogXCLih5FcIixcbiAgXCJVcGRvd25hcnJvd1wiOiBcIuKHlVwiLFxuICBcIlVwcGVyTGVmdEFycm93XCI6IFwi4oaWXCIsXG4gIFwiVXBwZXJSaWdodEFycm93XCI6IFwi4oaXXCIsXG4gIFwiVXBzaVwiOiBcIs+SXCIsXG4gIFwiVXBzaWxvblwiOiBcIs6lXCIsXG4gIFwiVXJpbmdcIjogXCLFrlwiLFxuICBcIlVzY3JcIjogXCLwnZKwXCIsXG4gIFwiVXRpbGRlXCI6IFwixahcIixcbiAgXCJVdW1cIjogXCLDnFwiLFxuICBcIlV1bWxcIjogXCLDnFwiLFxuICBcIlZEYXNoXCI6IFwi4oqrXCIsXG4gIFwiVmJhclwiOiBcIuKrq1wiLFxuICBcIlZjeVwiOiBcItCSXCIsXG4gIFwiVmRhc2hcIjogXCLiiqlcIixcbiAgXCJWZGFzaGxcIjogXCLiq6ZcIixcbiAgXCJWZWVcIjogXCLii4FcIixcbiAgXCJWZXJiYXJcIjogXCLigJZcIixcbiAgXCJWZXJ0XCI6IFwi4oCWXCIsXG4gIFwiVmVydGljYWxCYXJcIjogXCLiiKNcIixcbiAgXCJWZXJ0aWNhbExpbmVcIjogXCJ8XCIsXG4gIFwiVmVydGljYWxTZXBhcmF0b3JcIjogXCLinZhcIixcbiAgXCJWZXJ0aWNhbFRpbGRlXCI6IFwi4omAXCIsXG4gIFwiVmVyeVRoaW5TcGFjZVwiOiBcIuKAilwiLFxuICBcIlZmclwiOiBcIvCdlJlcIixcbiAgXCJWb3BmXCI6IFwi8J2VjVwiLFxuICBcIlZzY3JcIjogXCLwnZKxXCIsXG4gIFwiVnZkYXNoXCI6IFwi4oqqXCIsXG4gIFwiV2NpcmNcIjogXCLFtFwiLFxuICBcIldlZGdlXCI6IFwi4ouAXCIsXG4gIFwiV2ZyXCI6IFwi8J2UmlwiLFxuICBcIldvcGZcIjogXCLwnZWOXCIsXG4gIFwiV3NjclwiOiBcIvCdkrJcIixcbiAgXCJYZnJcIjogXCLwnZSbXCIsXG4gIFwiWGlcIjogXCLOnlwiLFxuICBcIlhvcGZcIjogXCLwnZWPXCIsXG4gIFwiWHNjclwiOiBcIvCdkrNcIixcbiAgXCJZQWN5XCI6IFwi0K9cIixcbiAgXCJZSWN5XCI6IFwi0IdcIixcbiAgXCJZVWN5XCI6IFwi0K5cIixcbiAgXCJZYWN1dFwiOiBcIsOdXCIsXG4gIFwiWWFjdXRlXCI6IFwiw51cIixcbiAgXCJZY2lyY1wiOiBcIsW2XCIsXG4gIFwiWWN5XCI6IFwi0KtcIixcbiAgXCJZZnJcIjogXCLwnZScXCIsXG4gIFwiWW9wZlwiOiBcIvCdlZBcIixcbiAgXCJZc2NyXCI6IFwi8J2StFwiLFxuICBcIll1bWxcIjogXCLFuFwiLFxuICBcIlpIY3lcIjogXCLQllwiLFxuICBcIlphY3V0ZVwiOiBcIsW5XCIsXG4gIFwiWmNhcm9uXCI6IFwixb1cIixcbiAgXCJaY3lcIjogXCLQl1wiLFxuICBcIlpkb3RcIjogXCLFu1wiLFxuICBcIlplcm9XaWR0aFNwYWNlXCI6IFwi4oCLXCIsXG4gIFwiWmV0YVwiOiBcIs6WXCIsXG4gIFwiWmZyXCI6IFwi4oSoXCIsXG4gIFwiWm9wZlwiOiBcIuKEpFwiLFxuICBcIlpzY3JcIjogXCLwnZK1XCIsXG4gIFwiYWFjdXRcIjogXCLDoVwiLFxuICBcImFhY3V0ZVwiOiBcIsOhXCIsXG4gIFwiYWJyZXZlXCI6IFwixINcIixcbiAgXCJhY1wiOiBcIuKIvlwiLFxuICBcImFjRVwiOiBcIuKIvsyzXCIsXG4gIFwiYWNkXCI6IFwi4oi/XCIsXG4gIFwiYWNpclwiOiBcIsOiXCIsXG4gIFwiYWNpcmNcIjogXCLDolwiLFxuICBcImFjdXRcIjogXCLCtFwiLFxuICBcImFjdXRlXCI6IFwiwrRcIixcbiAgXCJhY3lcIjogXCLQsFwiLFxuICBcImFlbGlcIjogXCLDplwiLFxuICBcImFlbGlnXCI6IFwiw6ZcIixcbiAgXCJhZlwiOiBcIuKBoVwiLFxuICBcImFmclwiOiBcIvCdlJ5cIixcbiAgXCJhZ3JhdlwiOiBcIsOgXCIsXG4gIFwiYWdyYXZlXCI6IFwiw6BcIixcbiAgXCJhbGVmc3ltXCI6IFwi4oS1XCIsXG4gIFwiYWxlcGhcIjogXCLihLVcIixcbiAgXCJhbHBoYVwiOiBcIs6xXCIsXG4gIFwiYW1hY3JcIjogXCLEgVwiLFxuICBcImFtYWxnXCI6IFwi4qi/XCIsXG4gIFwiYW1cIjogXCImXCIsXG4gIFwiYW1wXCI6IFwiJlwiLFxuICBcImFuZFwiOiBcIuKIp1wiLFxuICBcImFuZGFuZFwiOiBcIuKplVwiLFxuICBcImFuZGRcIjogXCLiqZxcIixcbiAgXCJhbmRzbG9wZVwiOiBcIuKpmFwiLFxuICBcImFuZHZcIjogXCLiqZpcIixcbiAgXCJhbmdcIjogXCLiiKBcIixcbiAgXCJhbmdlXCI6IFwi4qakXCIsXG4gIFwiYW5nbGVcIjogXCLiiKBcIixcbiAgXCJhbmdtc2RcIjogXCLiiKFcIixcbiAgXCJhbmdtc2RhYVwiOiBcIuKmqFwiLFxuICBcImFuZ21zZGFiXCI6IFwi4qapXCIsXG4gIFwiYW5nbXNkYWNcIjogXCLipqpcIixcbiAgXCJhbmdtc2RhZFwiOiBcIuKmq1wiLFxuICBcImFuZ21zZGFlXCI6IFwi4qasXCIsXG4gIFwiYW5nbXNkYWZcIjogXCLipq1cIixcbiAgXCJhbmdtc2RhZ1wiOiBcIuKmrlwiLFxuICBcImFuZ21zZGFoXCI6IFwi4qavXCIsXG4gIFwiYW5ncnRcIjogXCLiiJ9cIixcbiAgXCJhbmdydHZiXCI6IFwi4oq+XCIsXG4gIFwiYW5ncnR2YmRcIjogXCLipp1cIixcbiAgXCJhbmdzcGhcIjogXCLiiKJcIixcbiAgXCJhbmdzdFwiOiBcIsOFXCIsXG4gIFwiYW5nemFyclwiOiBcIuKNvFwiLFxuICBcImFvZ29uXCI6IFwixIVcIixcbiAgXCJhb3BmXCI6IFwi8J2VklwiLFxuICBcImFwXCI6IFwi4omIXCIsXG4gIFwiYXBFXCI6IFwi4qmwXCIsXG4gIFwiYXBhY2lyXCI6IFwi4qmvXCIsXG4gIFwiYXBlXCI6IFwi4omKXCIsXG4gIFwiYXBpZFwiOiBcIuKJi1wiLFxuICBcImFwb3NcIjogXCInXCIsXG4gIFwiYXBwcm94XCI6IFwi4omIXCIsXG4gIFwiYXBwcm94ZXFcIjogXCLiiYpcIixcbiAgXCJhcmluXCI6IFwiw6VcIixcbiAgXCJhcmluZ1wiOiBcIsOlXCIsXG4gIFwiYXNjclwiOiBcIvCdkrZcIixcbiAgXCJhc3RcIjogXCIqXCIsXG4gIFwiYXN5bXBcIjogXCLiiYhcIixcbiAgXCJhc3ltcGVxXCI6IFwi4omNXCIsXG4gIFwiYXRpbGRcIjogXCLDo1wiLFxuICBcImF0aWxkZVwiOiBcIsOjXCIsXG4gIFwiYXVtXCI6IFwiw6RcIixcbiAgXCJhdW1sXCI6IFwiw6RcIixcbiAgXCJhd2NvbmludFwiOiBcIuKIs1wiLFxuICBcImF3aW50XCI6IFwi4qiRXCIsXG4gIFwiYk5vdFwiOiBcIuKrrVwiLFxuICBcImJhY2tjb25nXCI6IFwi4omMXCIsXG4gIFwiYmFja2Vwc2lsb25cIjogXCLPtlwiLFxuICBcImJhY2twcmltZVwiOiBcIuKAtVwiLFxuICBcImJhY2tzaW1cIjogXCLiiL1cIixcbiAgXCJiYWNrc2ltZXFcIjogXCLii41cIixcbiAgXCJiYXJ2ZWVcIjogXCLiir1cIixcbiAgXCJiYXJ3ZWRcIjogXCLijIVcIixcbiAgXCJiYXJ3ZWRnZVwiOiBcIuKMhVwiLFxuICBcImJicmtcIjogXCLijrVcIixcbiAgXCJiYnJrdGJya1wiOiBcIuKOtlwiLFxuICBcImJjb25nXCI6IFwi4omMXCIsXG4gIFwiYmN5XCI6IFwi0LFcIixcbiAgXCJiZHF1b1wiOiBcIuKAnlwiLFxuICBcImJlY2F1c1wiOiBcIuKItVwiLFxuICBcImJlY2F1c2VcIjogXCLiiLVcIixcbiAgXCJiZW1wdHl2XCI6IFwi4qawXCIsXG4gIFwiYmVwc2lcIjogXCLPtlwiLFxuICBcImJlcm5vdVwiOiBcIuKErFwiLFxuICBcImJldGFcIjogXCLOslwiLFxuICBcImJldGhcIjogXCLihLZcIixcbiAgXCJiZXR3ZWVuXCI6IFwi4omsXCIsXG4gIFwiYmZyXCI6IFwi8J2Un1wiLFxuICBcImJpZ2NhcFwiOiBcIuKLglwiLFxuICBcImJpZ2NpcmNcIjogXCLil69cIixcbiAgXCJiaWdjdXBcIjogXCLii4NcIixcbiAgXCJiaWdvZG90XCI6IFwi4qiAXCIsXG4gIFwiYmlnb3BsdXNcIjogXCLiqIFcIixcbiAgXCJiaWdvdGltZXNcIjogXCLiqIJcIixcbiAgXCJiaWdzcWN1cFwiOiBcIuKohlwiLFxuICBcImJpZ3N0YXJcIjogXCLimIVcIixcbiAgXCJiaWd0cmlhbmdsZWRvd25cIjogXCLilr1cIixcbiAgXCJiaWd0cmlhbmdsZXVwXCI6IFwi4pazXCIsXG4gIFwiYmlndXBsdXNcIjogXCLiqIRcIixcbiAgXCJiaWd2ZWVcIjogXCLii4FcIixcbiAgXCJiaWd3ZWRnZVwiOiBcIuKLgFwiLFxuICBcImJrYXJvd1wiOiBcIuKkjVwiLFxuICBcImJsYWNrbG96ZW5nZVwiOiBcIuKnq1wiLFxuICBcImJsYWNrc3F1YXJlXCI6IFwi4paqXCIsXG4gIFwiYmxhY2t0cmlhbmdsZVwiOiBcIuKWtFwiLFxuICBcImJsYWNrdHJpYW5nbGVkb3duXCI6IFwi4pa+XCIsXG4gIFwiYmxhY2t0cmlhbmdsZWxlZnRcIjogXCLil4JcIixcbiAgXCJibGFja3RyaWFuZ2xlcmlnaHRcIjogXCLilrhcIixcbiAgXCJibGFua1wiOiBcIuKQo1wiLFxuICBcImJsazEyXCI6IFwi4paSXCIsXG4gIFwiYmxrMTRcIjogXCLilpFcIixcbiAgXCJibGszNFwiOiBcIuKWk1wiLFxuICBcImJsb2NrXCI6IFwi4paIXCIsXG4gIFwiYm5lXCI6IFwiPeKDpVwiLFxuICBcImJuZXF1aXZcIjogXCLiiaHig6VcIixcbiAgXCJibm90XCI6IFwi4oyQXCIsXG4gIFwiYm9wZlwiOiBcIvCdlZNcIixcbiAgXCJib3RcIjogXCLiiqVcIixcbiAgXCJib3R0b21cIjogXCLiiqVcIixcbiAgXCJib3d0aWVcIjogXCLii4hcIixcbiAgXCJib3hETFwiOiBcIuKVl1wiLFxuICBcImJveERSXCI6IFwi4pWUXCIsXG4gIFwiYm94RGxcIjogXCLilZZcIixcbiAgXCJib3hEclwiOiBcIuKVk1wiLFxuICBcImJveEhcIjogXCLilZBcIixcbiAgXCJib3hIRFwiOiBcIuKVplwiLFxuICBcImJveEhVXCI6IFwi4pWpXCIsXG4gIFwiYm94SGRcIjogXCLilaRcIixcbiAgXCJib3hIdVwiOiBcIuKVp1wiLFxuICBcImJveFVMXCI6IFwi4pWdXCIsXG4gIFwiYm94VVJcIjogXCLilZpcIixcbiAgXCJib3hVbFwiOiBcIuKVnFwiLFxuICBcImJveFVyXCI6IFwi4pWZXCIsXG4gIFwiYm94VlwiOiBcIuKVkVwiLFxuICBcImJveFZIXCI6IFwi4pWsXCIsXG4gIFwiYm94VkxcIjogXCLilaNcIixcbiAgXCJib3hWUlwiOiBcIuKVoFwiLFxuICBcImJveFZoXCI6IFwi4pWrXCIsXG4gIFwiYm94VmxcIjogXCLilaJcIixcbiAgXCJib3hWclwiOiBcIuKVn1wiLFxuICBcImJveGJveFwiOiBcIuKniVwiLFxuICBcImJveGRMXCI6IFwi4pWVXCIsXG4gIFwiYm94ZFJcIjogXCLilZJcIixcbiAgXCJib3hkbFwiOiBcIuKUkFwiLFxuICBcImJveGRyXCI6IFwi4pSMXCIsXG4gIFwiYm94aFwiOiBcIuKUgFwiLFxuICBcImJveGhEXCI6IFwi4pWlXCIsXG4gIFwiYm94aFVcIjogXCLilahcIixcbiAgXCJib3hoZFwiOiBcIuKUrFwiLFxuICBcImJveGh1XCI6IFwi4pS0XCIsXG4gIFwiYm94bWludXNcIjogXCLiip9cIixcbiAgXCJib3hwbHVzXCI6IFwi4oqeXCIsXG4gIFwiYm94dGltZXNcIjogXCLiiqBcIixcbiAgXCJib3h1TFwiOiBcIuKVm1wiLFxuICBcImJveHVSXCI6IFwi4pWYXCIsXG4gIFwiYm94dWxcIjogXCLilJhcIixcbiAgXCJib3h1clwiOiBcIuKUlFwiLFxuICBcImJveHZcIjogXCLilIJcIixcbiAgXCJib3h2SFwiOiBcIuKVqlwiLFxuICBcImJveHZMXCI6IFwi4pWhXCIsXG4gIFwiYm94dlJcIjogXCLilZ5cIixcbiAgXCJib3h2aFwiOiBcIuKUvFwiLFxuICBcImJveHZsXCI6IFwi4pSkXCIsXG4gIFwiYm94dnJcIjogXCLilJxcIixcbiAgXCJicHJpbWVcIjogXCLigLVcIixcbiAgXCJicmV2ZVwiOiBcIsuYXCIsXG4gIFwiYnJ2YmFcIjogXCLCplwiLFxuICBcImJydmJhclwiOiBcIsKmXCIsXG4gIFwiYnNjclwiOiBcIvCdkrdcIixcbiAgXCJic2VtaVwiOiBcIuKBj1wiLFxuICBcImJzaW1cIjogXCLiiL1cIixcbiAgXCJic2ltZVwiOiBcIuKLjVwiLFxuICBcImJzb2xcIjogXCJcXFxcXCIsXG4gIFwiYnNvbGJcIjogXCLip4VcIixcbiAgXCJic29saHN1YlwiOiBcIuKfiFwiLFxuICBcImJ1bGxcIjogXCLigKJcIixcbiAgXCJidWxsZXRcIjogXCLigKJcIixcbiAgXCJidW1wXCI6IFwi4omOXCIsXG4gIFwiYnVtcEVcIjogXCLiqq5cIixcbiAgXCJidW1wZVwiOiBcIuKJj1wiLFxuICBcImJ1bXBlcVwiOiBcIuKJj1wiLFxuICBcImNhY3V0ZVwiOiBcIsSHXCIsXG4gIFwiY2FwXCI6IFwi4oipXCIsXG4gIFwiY2FwYW5kXCI6IFwi4qmEXCIsXG4gIFwiY2FwYnJjdXBcIjogXCLiqYlcIixcbiAgXCJjYXBjYXBcIjogXCLiqYtcIixcbiAgXCJjYXBjdXBcIjogXCLiqYdcIixcbiAgXCJjYXBkb3RcIjogXCLiqYBcIixcbiAgXCJjYXBzXCI6IFwi4oip77iAXCIsXG4gIFwiY2FyZXRcIjogXCLigYFcIixcbiAgXCJjYXJvblwiOiBcIsuHXCIsXG4gIFwiY2NhcHNcIjogXCLiqY1cIixcbiAgXCJjY2Fyb25cIjogXCLEjVwiLFxuICBcImNjZWRpXCI6IFwiw6dcIixcbiAgXCJjY2VkaWxcIjogXCLDp1wiLFxuICBcImNjaXJjXCI6IFwixIlcIixcbiAgXCJjY3Vwc1wiOiBcIuKpjFwiLFxuICBcImNjdXBzc21cIjogXCLiqZBcIixcbiAgXCJjZG90XCI6IFwixItcIixcbiAgXCJjZWRpXCI6IFwiwrhcIixcbiAgXCJjZWRpbFwiOiBcIsK4XCIsXG4gIFwiY2VtcHR5dlwiOiBcIuKmslwiLFxuICBcImNlblwiOiBcIsKiXCIsXG4gIFwiY2VudFwiOiBcIsKiXCIsXG4gIFwiY2VudGVyZG90XCI6IFwiwrdcIixcbiAgXCJjZnJcIjogXCLwnZSgXCIsXG4gIFwiY2hjeVwiOiBcItGHXCIsXG4gIFwiY2hlY2tcIjogXCLinJNcIixcbiAgXCJjaGVja21hcmtcIjogXCLinJNcIixcbiAgXCJjaGlcIjogXCLPh1wiLFxuICBcImNpclwiOiBcIuKXi1wiLFxuICBcImNpckVcIjogXCLip4NcIixcbiAgXCJjaXJjXCI6IFwiy4ZcIixcbiAgXCJjaXJjZXFcIjogXCLiiZdcIixcbiAgXCJjaXJjbGVhcnJvd2xlZnRcIjogXCLihrpcIixcbiAgXCJjaXJjbGVhcnJvd3JpZ2h0XCI6IFwi4oa7XCIsXG4gIFwiY2lyY2xlZFJcIjogXCLCrlwiLFxuICBcImNpcmNsZWRTXCI6IFwi4pOIXCIsXG4gIFwiY2lyY2xlZGFzdFwiOiBcIuKKm1wiLFxuICBcImNpcmNsZWRjaXJjXCI6IFwi4oqaXCIsXG4gIFwiY2lyY2xlZGRhc2hcIjogXCLiip1cIixcbiAgXCJjaXJlXCI6IFwi4omXXCIsXG4gIFwiY2lyZm5pbnRcIjogXCLiqJBcIixcbiAgXCJjaXJtaWRcIjogXCLiq69cIixcbiAgXCJjaXJzY2lyXCI6IFwi4qeCXCIsXG4gIFwiY2x1YnNcIjogXCLimaNcIixcbiAgXCJjbHVic3VpdFwiOiBcIuKZo1wiLFxuICBcImNvbG9uXCI6IFwiOlwiLFxuICBcImNvbG9uZVwiOiBcIuKJlFwiLFxuICBcImNvbG9uZXFcIjogXCLiiZRcIixcbiAgXCJjb21tYVwiOiBcIixcIixcbiAgXCJjb21tYXRcIjogXCJAXCIsXG4gIFwiY29tcFwiOiBcIuKIgVwiLFxuICBcImNvbXBmblwiOiBcIuKImFwiLFxuICBcImNvbXBsZW1lbnRcIjogXCLiiIFcIixcbiAgXCJjb21wbGV4ZXNcIjogXCLihIJcIixcbiAgXCJjb25nXCI6IFwi4omFXCIsXG4gIFwiY29uZ2RvdFwiOiBcIuKprVwiLFxuICBcImNvbmludFwiOiBcIuKIrlwiLFxuICBcImNvcGZcIjogXCLwnZWUXCIsXG4gIFwiY29wcm9kXCI6IFwi4oiQXCIsXG4gIFwiY29wXCI6IFwiwqlcIixcbiAgXCJjb3B5XCI6IFwiwqlcIixcbiAgXCJjb3B5c3JcIjogXCLihJdcIixcbiAgXCJjcmFyclwiOiBcIuKGtVwiLFxuICBcImNyb3NzXCI6IFwi4pyXXCIsXG4gIFwiY3NjclwiOiBcIvCdkrhcIixcbiAgXCJjc3ViXCI6IFwi4quPXCIsXG4gIFwiY3N1YmVcIjogXCLiq5FcIixcbiAgXCJjc3VwXCI6IFwi4quQXCIsXG4gIFwiY3N1cGVcIjogXCLiq5JcIixcbiAgXCJjdGRvdFwiOiBcIuKLr1wiLFxuICBcImN1ZGFycmxcIjogXCLipLhcIixcbiAgXCJjdWRhcnJyXCI6IFwi4qS1XCIsXG4gIFwiY3VlcHJcIjogXCLii55cIixcbiAgXCJjdWVzY1wiOiBcIuKLn1wiLFxuICBcImN1bGFyclwiOiBcIuKGtlwiLFxuICBcImN1bGFycnBcIjogXCLipL1cIixcbiAgXCJjdXBcIjogXCLiiKpcIixcbiAgXCJjdXBicmNhcFwiOiBcIuKpiFwiLFxuICBcImN1cGNhcFwiOiBcIuKphlwiLFxuICBcImN1cGN1cFwiOiBcIuKpilwiLFxuICBcImN1cGRvdFwiOiBcIuKKjVwiLFxuICBcImN1cG9yXCI6IFwi4qmFXCIsXG4gIFwiY3Vwc1wiOiBcIuKIqu+4gFwiLFxuICBcImN1cmFyclwiOiBcIuKGt1wiLFxuICBcImN1cmFycm1cIjogXCLipLxcIixcbiAgXCJjdXJseWVxcHJlY1wiOiBcIuKLnlwiLFxuICBcImN1cmx5ZXFzdWNjXCI6IFwi4oufXCIsXG4gIFwiY3VybHl2ZWVcIjogXCLii45cIixcbiAgXCJjdXJseXdlZGdlXCI6IFwi4ouPXCIsXG4gIFwiY3VycmVcIjogXCLCpFwiLFxuICBcImN1cnJlblwiOiBcIsKkXCIsXG4gIFwiY3VydmVhcnJvd2xlZnRcIjogXCLihrZcIixcbiAgXCJjdXJ2ZWFycm93cmlnaHRcIjogXCLihrdcIixcbiAgXCJjdXZlZVwiOiBcIuKLjlwiLFxuICBcImN1d2VkXCI6IFwi4ouPXCIsXG4gIFwiY3djb25pbnRcIjogXCLiiLJcIixcbiAgXCJjd2ludFwiOiBcIuKIsVwiLFxuICBcImN5bGN0eVwiOiBcIuKMrVwiLFxuICBcImRBcnJcIjogXCLih5NcIixcbiAgXCJkSGFyXCI6IFwi4qWlXCIsXG4gIFwiZGFnZ2VyXCI6IFwi4oCgXCIsXG4gIFwiZGFsZXRoXCI6IFwi4oS4XCIsXG4gIFwiZGFyclwiOiBcIuKGk1wiLFxuICBcImRhc2hcIjogXCLigJBcIixcbiAgXCJkYXNodlwiOiBcIuKKo1wiLFxuICBcImRia2Fyb3dcIjogXCLipI9cIixcbiAgXCJkYmxhY1wiOiBcIsudXCIsXG4gIFwiZGNhcm9uXCI6IFwixI9cIixcbiAgXCJkY3lcIjogXCLQtFwiLFxuICBcImRkXCI6IFwi4oWGXCIsXG4gIFwiZGRhZ2dlclwiOiBcIuKAoVwiLFxuICBcImRkYXJyXCI6IFwi4oeKXCIsXG4gIFwiZGRvdHNlcVwiOiBcIuKpt1wiLFxuICBcImRlXCI6IFwiwrBcIixcbiAgXCJkZWdcIjogXCLCsFwiLFxuICBcImRlbHRhXCI6IFwizrRcIixcbiAgXCJkZW1wdHl2XCI6IFwi4qaxXCIsXG4gIFwiZGZpc2h0XCI6IFwi4qW/XCIsXG4gIFwiZGZyXCI6IFwi8J2UoVwiLFxuICBcImRoYXJsXCI6IFwi4oeDXCIsXG4gIFwiZGhhcnJcIjogXCLih4JcIixcbiAgXCJkaWFtXCI6IFwi4ouEXCIsXG4gIFwiZGlhbW9uZFwiOiBcIuKLhFwiLFxuICBcImRpYW1vbmRzdWl0XCI6IFwi4pmmXCIsXG4gIFwiZGlhbXNcIjogXCLimaZcIixcbiAgXCJkaWVcIjogXCLCqFwiLFxuICBcImRpZ2FtbWFcIjogXCLPnVwiLFxuICBcImRpc2luXCI6IFwi4ouyXCIsXG4gIFwiZGl2XCI6IFwiw7dcIixcbiAgXCJkaXZpZFwiOiBcIsO3XCIsXG4gIFwiZGl2aWRlXCI6IFwiw7dcIixcbiAgXCJkaXZpZGVvbnRpbWVzXCI6IFwi4ouHXCIsXG4gIFwiZGl2b254XCI6IFwi4ouHXCIsXG4gIFwiZGpjeVwiOiBcItGSXCIsXG4gIFwiZGxjb3JuXCI6IFwi4oyeXCIsXG4gIFwiZGxjcm9wXCI6IFwi4oyNXCIsXG4gIFwiZG9sbGFyXCI6IFwiJFwiLFxuICBcImRvcGZcIjogXCLwnZWVXCIsXG4gIFwiZG90XCI6IFwiy5lcIixcbiAgXCJkb3RlcVwiOiBcIuKJkFwiLFxuICBcImRvdGVxZG90XCI6IFwi4omRXCIsXG4gIFwiZG90bWludXNcIjogXCLiiLhcIixcbiAgXCJkb3RwbHVzXCI6IFwi4oiUXCIsXG4gIFwiZG90c3F1YXJlXCI6IFwi4oqhXCIsXG4gIFwiZG91YmxlYmFyd2VkZ2VcIjogXCLijIZcIixcbiAgXCJkb3duYXJyb3dcIjogXCLihpNcIixcbiAgXCJkb3duZG93bmFycm93c1wiOiBcIuKHilwiLFxuICBcImRvd25oYXJwb29ubGVmdFwiOiBcIuKHg1wiLFxuICBcImRvd25oYXJwb29ucmlnaHRcIjogXCLih4JcIixcbiAgXCJkcmJrYXJvd1wiOiBcIuKkkFwiLFxuICBcImRyY29yblwiOiBcIuKMn1wiLFxuICBcImRyY3JvcFwiOiBcIuKMjFwiLFxuICBcImRzY3JcIjogXCLwnZK5XCIsXG4gIFwiZHNjeVwiOiBcItGVXCIsXG4gIFwiZHNvbFwiOiBcIuKntlwiLFxuICBcImRzdHJva1wiOiBcIsSRXCIsXG4gIFwiZHRkb3RcIjogXCLii7FcIixcbiAgXCJkdHJpXCI6IFwi4pa/XCIsXG4gIFwiZHRyaWZcIjogXCLilr5cIixcbiAgXCJkdWFyclwiOiBcIuKHtVwiLFxuICBcImR1aGFyXCI6IFwi4qWvXCIsXG4gIFwiZHdhbmdsZVwiOiBcIuKmplwiLFxuICBcImR6Y3lcIjogXCLRn1wiLFxuICBcImR6aWdyYXJyXCI6IFwi4p+/XCIsXG4gIFwiZUREb3RcIjogXCLiqbdcIixcbiAgXCJlRG90XCI6IFwi4omRXCIsXG4gIFwiZWFjdXRcIjogXCLDqVwiLFxuICBcImVhY3V0ZVwiOiBcIsOpXCIsXG4gIFwiZWFzdGVyXCI6IFwi4qmuXCIsXG4gIFwiZWNhcm9uXCI6IFwixJtcIixcbiAgXCJlY2lyXCI6IFwiw6pcIixcbiAgXCJlY2lyY1wiOiBcIsOqXCIsXG4gIFwiZWNvbG9uXCI6IFwi4omVXCIsXG4gIFwiZWN5XCI6IFwi0Y1cIixcbiAgXCJlZG90XCI6IFwixJdcIixcbiAgXCJlZVwiOiBcIuKFh1wiLFxuICBcImVmRG90XCI6IFwi4omSXCIsXG4gIFwiZWZyXCI6IFwi8J2UolwiLFxuICBcImVnXCI6IFwi4qqaXCIsXG4gIFwiZWdyYXZcIjogXCLDqFwiLFxuICBcImVncmF2ZVwiOiBcIsOoXCIsXG4gIFwiZWdzXCI6IFwi4qqWXCIsXG4gIFwiZWdzZG90XCI6IFwi4qqYXCIsXG4gIFwiZWxcIjogXCLiqplcIixcbiAgXCJlbGludGVyc1wiOiBcIuKPp1wiLFxuICBcImVsbFwiOiBcIuKEk1wiLFxuICBcImVsc1wiOiBcIuKqlVwiLFxuICBcImVsc2RvdFwiOiBcIuKql1wiLFxuICBcImVtYWNyXCI6IFwixJNcIixcbiAgXCJlbXB0eVwiOiBcIuKIhVwiLFxuICBcImVtcHR5c2V0XCI6IFwi4oiFXCIsXG4gIFwiZW1wdHl2XCI6IFwi4oiFXCIsXG4gIFwiZW1zcDEzXCI6IFwi4oCEXCIsXG4gIFwiZW1zcDE0XCI6IFwi4oCFXCIsXG4gIFwiZW1zcFwiOiBcIuKAg1wiLFxuICBcImVuZ1wiOiBcIsWLXCIsXG4gIFwiZW5zcFwiOiBcIuKAglwiLFxuICBcImVvZ29uXCI6IFwixJlcIixcbiAgXCJlb3BmXCI6IFwi8J2VllwiLFxuICBcImVwYXJcIjogXCLii5VcIixcbiAgXCJlcGFyc2xcIjogXCLip6NcIixcbiAgXCJlcGx1c1wiOiBcIuKpsVwiLFxuICBcImVwc2lcIjogXCLOtVwiLFxuICBcImVwc2lsb25cIjogXCLOtVwiLFxuICBcImVwc2l2XCI6IFwiz7VcIixcbiAgXCJlcWNpcmNcIjogXCLiiZZcIixcbiAgXCJlcWNvbG9uXCI6IFwi4omVXCIsXG4gIFwiZXFzaW1cIjogXCLiiYJcIixcbiAgXCJlcXNsYW50Z3RyXCI6IFwi4qqWXCIsXG4gIFwiZXFzbGFudGxlc3NcIjogXCLiqpVcIixcbiAgXCJlcXVhbHNcIjogXCI9XCIsXG4gIFwiZXF1ZXN0XCI6IFwi4omfXCIsXG4gIFwiZXF1aXZcIjogXCLiiaFcIixcbiAgXCJlcXVpdkREXCI6IFwi4qm4XCIsXG4gIFwiZXF2cGFyc2xcIjogXCLip6VcIixcbiAgXCJlckRvdFwiOiBcIuKJk1wiLFxuICBcImVyYXJyXCI6IFwi4qWxXCIsXG4gIFwiZXNjclwiOiBcIuKEr1wiLFxuICBcImVzZG90XCI6IFwi4omQXCIsXG4gIFwiZXNpbVwiOiBcIuKJglwiLFxuICBcImV0YVwiOiBcIs63XCIsXG4gIFwiZXRcIjogXCLDsFwiLFxuICBcImV0aFwiOiBcIsOwXCIsXG4gIFwiZXVtXCI6IFwiw6tcIixcbiAgXCJldW1sXCI6IFwiw6tcIixcbiAgXCJldXJvXCI6IFwi4oKsXCIsXG4gIFwiZXhjbFwiOiBcIiFcIixcbiAgXCJleGlzdFwiOiBcIuKIg1wiLFxuICBcImV4cGVjdGF0aW9uXCI6IFwi4oSwXCIsXG4gIFwiZXhwb25lbnRpYWxlXCI6IFwi4oWHXCIsXG4gIFwiZmFsbGluZ2RvdHNlcVwiOiBcIuKJklwiLFxuICBcImZjeVwiOiBcItGEXCIsXG4gIFwiZmVtYWxlXCI6IFwi4pmAXCIsXG4gIFwiZmZpbGlnXCI6IFwi76yDXCIsXG4gIFwiZmZsaWdcIjogXCLvrIBcIixcbiAgXCJmZmxsaWdcIjogXCLvrIRcIixcbiAgXCJmZnJcIjogXCLwnZSjXCIsXG4gIFwiZmlsaWdcIjogXCLvrIFcIixcbiAgXCJmamxpZ1wiOiBcImZqXCIsXG4gIFwiZmxhdFwiOiBcIuKZrVwiLFxuICBcImZsbGlnXCI6IFwi76yCXCIsXG4gIFwiZmx0bnNcIjogXCLilrFcIixcbiAgXCJmbm9mXCI6IFwixpJcIixcbiAgXCJmb3BmXCI6IFwi8J2Vl1wiLFxuICBcImZvcmFsbFwiOiBcIuKIgFwiLFxuICBcImZvcmtcIjogXCLii5RcIixcbiAgXCJmb3JrdlwiOiBcIuKrmVwiLFxuICBcImZwYXJ0aW50XCI6IFwi4qiNXCIsXG4gIFwiZnJhYzFcIjogXCLCvFwiLFxuICBcImZyYWMxMlwiOiBcIsK9XCIsXG4gIFwiZnJhYzEzXCI6IFwi4oWTXCIsXG4gIFwiZnJhYzE0XCI6IFwiwrxcIixcbiAgXCJmcmFjMTVcIjogXCLihZVcIixcbiAgXCJmcmFjMTZcIjogXCLihZlcIixcbiAgXCJmcmFjMThcIjogXCLihZtcIixcbiAgXCJmcmFjMjNcIjogXCLihZRcIixcbiAgXCJmcmFjMjVcIjogXCLihZZcIixcbiAgXCJmcmFjM1wiOiBcIsK+XCIsXG4gIFwiZnJhYzM0XCI6IFwiwr5cIixcbiAgXCJmcmFjMzVcIjogXCLihZdcIixcbiAgXCJmcmFjMzhcIjogXCLihZxcIixcbiAgXCJmcmFjNDVcIjogXCLihZhcIixcbiAgXCJmcmFjNTZcIjogXCLihZpcIixcbiAgXCJmcmFjNThcIjogXCLihZ1cIixcbiAgXCJmcmFjNzhcIjogXCLihZ5cIixcbiAgXCJmcmFzbFwiOiBcIuKBhFwiLFxuICBcImZyb3duXCI6IFwi4oyiXCIsXG4gIFwiZnNjclwiOiBcIvCdkrtcIixcbiAgXCJnRVwiOiBcIuKJp1wiLFxuICBcImdFbFwiOiBcIuKqjFwiLFxuICBcImdhY3V0ZVwiOiBcIse1XCIsXG4gIFwiZ2FtbWFcIjogXCLOs1wiLFxuICBcImdhbW1hZFwiOiBcIs+dXCIsXG4gIFwiZ2FwXCI6IFwi4qqGXCIsXG4gIFwiZ2JyZXZlXCI6IFwixJ9cIixcbiAgXCJnY2lyY1wiOiBcIsSdXCIsXG4gIFwiZ2N5XCI6IFwi0LNcIixcbiAgXCJnZG90XCI6IFwixKFcIixcbiAgXCJnZVwiOiBcIuKJpVwiLFxuICBcImdlbFwiOiBcIuKLm1wiLFxuICBcImdlcVwiOiBcIuKJpVwiLFxuICBcImdlcXFcIjogXCLiiadcIixcbiAgXCJnZXFzbGFudFwiOiBcIuKpvlwiLFxuICBcImdlc1wiOiBcIuKpvlwiLFxuICBcImdlc2NjXCI6IFwi4qqpXCIsXG4gIFwiZ2VzZG90XCI6IFwi4qqAXCIsXG4gIFwiZ2VzZG90b1wiOiBcIuKqglwiLFxuICBcImdlc2RvdG9sXCI6IFwi4qqEXCIsXG4gIFwiZ2VzbFwiOiBcIuKLm++4gFwiLFxuICBcImdlc2xlc1wiOiBcIuKqlFwiLFxuICBcImdmclwiOiBcIvCdlKRcIixcbiAgXCJnZ1wiOiBcIuKJq1wiLFxuICBcImdnZ1wiOiBcIuKLmVwiLFxuICBcImdpbWVsXCI6IFwi4oS3XCIsXG4gIFwiZ2pjeVwiOiBcItGTXCIsXG4gIFwiZ2xcIjogXCLiibdcIixcbiAgXCJnbEVcIjogXCLiqpJcIixcbiAgXCJnbGFcIjogXCLiqqVcIixcbiAgXCJnbGpcIjogXCLiqqRcIixcbiAgXCJnbkVcIjogXCLiialcIixcbiAgXCJnbmFwXCI6IFwi4qqKXCIsXG4gIFwiZ25hcHByb3hcIjogXCLiqopcIixcbiAgXCJnbmVcIjogXCLiqohcIixcbiAgXCJnbmVxXCI6IFwi4qqIXCIsXG4gIFwiZ25lcXFcIjogXCLiialcIixcbiAgXCJnbnNpbVwiOiBcIuKLp1wiLFxuICBcImdvcGZcIjogXCLwnZWYXCIsXG4gIFwiZ3JhdmVcIjogXCJgXCIsXG4gIFwiZ3NjclwiOiBcIuKEilwiLFxuICBcImdzaW1cIjogXCLiibNcIixcbiAgXCJnc2ltZVwiOiBcIuKqjlwiLFxuICBcImdzaW1sXCI6IFwi4qqQXCIsXG4gIFwiZ1wiOiBcIj5cIixcbiAgXCJndFwiOiBcIj5cIixcbiAgXCJndGNjXCI6IFwi4qqnXCIsXG4gIFwiZ3RjaXJcIjogXCLiqbpcIixcbiAgXCJndGRvdFwiOiBcIuKLl1wiLFxuICBcImd0bFBhclwiOiBcIuKmlVwiLFxuICBcImd0cXVlc3RcIjogXCLiqbxcIixcbiAgXCJndHJhcHByb3hcIjogXCLiqoZcIixcbiAgXCJndHJhcnJcIjogXCLipbhcIixcbiAgXCJndHJkb3RcIjogXCLii5dcIixcbiAgXCJndHJlcWxlc3NcIjogXCLii5tcIixcbiAgXCJndHJlcXFsZXNzXCI6IFwi4qqMXCIsXG4gIFwiZ3RybGVzc1wiOiBcIuKJt1wiLFxuICBcImd0cnNpbVwiOiBcIuKJs1wiLFxuICBcImd2ZXJ0bmVxcVwiOiBcIuKJqe+4gFwiLFxuICBcImd2bkVcIjogXCLiianvuIBcIixcbiAgXCJoQXJyXCI6IFwi4oeUXCIsXG4gIFwiaGFpcnNwXCI6IFwi4oCKXCIsXG4gIFwiaGFsZlwiOiBcIsK9XCIsXG4gIFwiaGFtaWx0XCI6IFwi4oSLXCIsXG4gIFwiaGFyZGN5XCI6IFwi0YpcIixcbiAgXCJoYXJyXCI6IFwi4oaUXCIsXG4gIFwiaGFycmNpclwiOiBcIuKliFwiLFxuICBcImhhcnJ3XCI6IFwi4oatXCIsXG4gIFwiaGJhclwiOiBcIuKEj1wiLFxuICBcImhjaXJjXCI6IFwixKVcIixcbiAgXCJoZWFydHNcIjogXCLimaVcIixcbiAgXCJoZWFydHN1aXRcIjogXCLimaVcIixcbiAgXCJoZWxsaXBcIjogXCLigKZcIixcbiAgXCJoZXJjb25cIjogXCLiirlcIixcbiAgXCJoZnJcIjogXCLwnZSlXCIsXG4gIFwiaGtzZWFyb3dcIjogXCLipKVcIixcbiAgXCJoa3N3YXJvd1wiOiBcIuKkplwiLFxuICBcImhvYXJyXCI6IFwi4oe/XCIsXG4gIFwiaG9tdGh0XCI6IFwi4oi7XCIsXG4gIFwiaG9va2xlZnRhcnJvd1wiOiBcIuKGqVwiLFxuICBcImhvb2tyaWdodGFycm93XCI6IFwi4oaqXCIsXG4gIFwiaG9wZlwiOiBcIvCdlZlcIixcbiAgXCJob3JiYXJcIjogXCLigJVcIixcbiAgXCJoc2NyXCI6IFwi8J2SvVwiLFxuICBcImhzbGFzaFwiOiBcIuKEj1wiLFxuICBcImhzdHJva1wiOiBcIsSnXCIsXG4gIFwiaHlidWxsXCI6IFwi4oGDXCIsXG4gIFwiaHlwaGVuXCI6IFwi4oCQXCIsXG4gIFwiaWFjdXRcIjogXCLDrVwiLFxuICBcImlhY3V0ZVwiOiBcIsOtXCIsXG4gIFwiaWNcIjogXCLigaNcIixcbiAgXCJpY2lyXCI6IFwiw65cIixcbiAgXCJpY2lyY1wiOiBcIsOuXCIsXG4gIFwiaWN5XCI6IFwi0LhcIixcbiAgXCJpZWN5XCI6IFwi0LVcIixcbiAgXCJpZXhjXCI6IFwiwqFcIixcbiAgXCJpZXhjbFwiOiBcIsKhXCIsXG4gIFwiaWZmXCI6IFwi4oeUXCIsXG4gIFwiaWZyXCI6IFwi8J2UplwiLFxuICBcImlncmF2XCI6IFwiw6xcIixcbiAgXCJpZ3JhdmVcIjogXCLDrFwiLFxuICBcImlpXCI6IFwi4oWIXCIsXG4gIFwiaWlpaW50XCI6IFwi4qiMXCIsXG4gIFwiaWlpbnRcIjogXCLiiK1cIixcbiAgXCJpaW5maW5cIjogXCLip5xcIixcbiAgXCJpaW90YVwiOiBcIuKEqVwiLFxuICBcImlqbGlnXCI6IFwixLNcIixcbiAgXCJpbWFjclwiOiBcIsSrXCIsXG4gIFwiaW1hZ2VcIjogXCLihJFcIixcbiAgXCJpbWFnbGluZVwiOiBcIuKEkFwiLFxuICBcImltYWdwYXJ0XCI6IFwi4oSRXCIsXG4gIFwiaW1hdGhcIjogXCLEsVwiLFxuICBcImltb2ZcIjogXCLiirdcIixcbiAgXCJpbXBlZFwiOiBcIsa1XCIsXG4gIFwiaW5cIjogXCLiiIhcIixcbiAgXCJpbmNhcmVcIjogXCLihIVcIixcbiAgXCJpbmZpblwiOiBcIuKInlwiLFxuICBcImluZmludGllXCI6IFwi4qedXCIsXG4gIFwiaW5vZG90XCI6IFwixLFcIixcbiAgXCJpbnRcIjogXCLiiKtcIixcbiAgXCJpbnRjYWxcIjogXCLiirpcIixcbiAgXCJpbnRlZ2Vyc1wiOiBcIuKEpFwiLFxuICBcImludGVyY2FsXCI6IFwi4oq6XCIsXG4gIFwiaW50bGFyaGtcIjogXCLiqJdcIixcbiAgXCJpbnRwcm9kXCI6IFwi4qi8XCIsXG4gIFwiaW9jeVwiOiBcItGRXCIsXG4gIFwiaW9nb25cIjogXCLEr1wiLFxuICBcImlvcGZcIjogXCLwnZWaXCIsXG4gIFwiaW90YVwiOiBcIs65XCIsXG4gIFwiaXByb2RcIjogXCLiqLxcIixcbiAgXCJpcXVlc1wiOiBcIsK/XCIsXG4gIFwiaXF1ZXN0XCI6IFwiwr9cIixcbiAgXCJpc2NyXCI6IFwi8J2SvlwiLFxuICBcImlzaW5cIjogXCLiiIhcIixcbiAgXCJpc2luRVwiOiBcIuKLuVwiLFxuICBcImlzaW5kb3RcIjogXCLii7VcIixcbiAgXCJpc2luc1wiOiBcIuKLtFwiLFxuICBcImlzaW5zdlwiOiBcIuKLs1wiLFxuICBcImlzaW52XCI6IFwi4oiIXCIsXG4gIFwiaXRcIjogXCLigaJcIixcbiAgXCJpdGlsZGVcIjogXCLEqVwiLFxuICBcIml1a2N5XCI6IFwi0ZZcIixcbiAgXCJpdW1cIjogXCLDr1wiLFxuICBcIml1bWxcIjogXCLDr1wiLFxuICBcImpjaXJjXCI6IFwixLVcIixcbiAgXCJqY3lcIjogXCLQuVwiLFxuICBcImpmclwiOiBcIvCdlKdcIixcbiAgXCJqbWF0aFwiOiBcIsi3XCIsXG4gIFwiam9wZlwiOiBcIvCdlZtcIixcbiAgXCJqc2NyXCI6IFwi8J2Sv1wiLFxuICBcImpzZXJjeVwiOiBcItGYXCIsXG4gIFwianVrY3lcIjogXCLRlFwiLFxuICBcImthcHBhXCI6IFwizrpcIixcbiAgXCJrYXBwYXZcIjogXCLPsFwiLFxuICBcImtjZWRpbFwiOiBcIsS3XCIsXG4gIFwia2N5XCI6IFwi0LpcIixcbiAgXCJrZnJcIjogXCLwnZSoXCIsXG4gIFwia2dyZWVuXCI6IFwixLhcIixcbiAgXCJraGN5XCI6IFwi0YVcIixcbiAgXCJramN5XCI6IFwi0ZxcIixcbiAgXCJrb3BmXCI6IFwi8J2VnFwiLFxuICBcImtzY3JcIjogXCLwnZOAXCIsXG4gIFwibEFhcnJcIjogXCLih5pcIixcbiAgXCJsQXJyXCI6IFwi4oeQXCIsXG4gIFwibEF0YWlsXCI6IFwi4qSbXCIsXG4gIFwibEJhcnJcIjogXCLipI5cIixcbiAgXCJsRVwiOiBcIuKJplwiLFxuICBcImxFZ1wiOiBcIuKqi1wiLFxuICBcImxIYXJcIjogXCLipaJcIixcbiAgXCJsYWN1dGVcIjogXCLEulwiLFxuICBcImxhZW1wdHl2XCI6IFwi4qa0XCIsXG4gIFwibGFncmFuXCI6IFwi4oSSXCIsXG4gIFwibGFtYmRhXCI6IFwizrtcIixcbiAgXCJsYW5nXCI6IFwi4p+oXCIsXG4gIFwibGFuZ2RcIjogXCLippFcIixcbiAgXCJsYW5nbGVcIjogXCLin6hcIixcbiAgXCJsYXBcIjogXCLiqoVcIixcbiAgXCJsYXF1XCI6IFwiwqtcIixcbiAgXCJsYXF1b1wiOiBcIsKrXCIsXG4gIFwibGFyclwiOiBcIuKGkFwiLFxuICBcImxhcnJiXCI6IFwi4oekXCIsXG4gIFwibGFycmJmc1wiOiBcIuKkn1wiLFxuICBcImxhcnJmc1wiOiBcIuKknVwiLFxuICBcImxhcnJoa1wiOiBcIuKGqVwiLFxuICBcImxhcnJscFwiOiBcIuKGq1wiLFxuICBcImxhcnJwbFwiOiBcIuKkuVwiLFxuICBcImxhcnJzaW1cIjogXCLipbNcIixcbiAgXCJsYXJydGxcIjogXCLihqJcIixcbiAgXCJsYXRcIjogXCLiqqtcIixcbiAgXCJsYXRhaWxcIjogXCLipJlcIixcbiAgXCJsYXRlXCI6IFwi4qqtXCIsXG4gIFwibGF0ZXNcIjogXCLiqq3vuIBcIixcbiAgXCJsYmFyclwiOiBcIuKkjFwiLFxuICBcImxiYnJrXCI6IFwi4p2yXCIsXG4gIFwibGJyYWNlXCI6IFwie1wiLFxuICBcImxicmFja1wiOiBcIltcIixcbiAgXCJsYnJrZVwiOiBcIuKmi1wiLFxuICBcImxicmtzbGRcIjogXCLipo9cIixcbiAgXCJsYnJrc2x1XCI6IFwi4qaNXCIsXG4gIFwibGNhcm9uXCI6IFwixL5cIixcbiAgXCJsY2VkaWxcIjogXCLEvFwiLFxuICBcImxjZWlsXCI6IFwi4oyIXCIsXG4gIFwibGN1YlwiOiBcIntcIixcbiAgXCJsY3lcIjogXCLQu1wiLFxuICBcImxkY2FcIjogXCLipLZcIixcbiAgXCJsZHF1b1wiOiBcIuKAnFwiLFxuICBcImxkcXVvclwiOiBcIuKAnlwiLFxuICBcImxkcmRoYXJcIjogXCLipadcIixcbiAgXCJsZHJ1c2hhclwiOiBcIuKli1wiLFxuICBcImxkc2hcIjogXCLihrJcIixcbiAgXCJsZVwiOiBcIuKJpFwiLFxuICBcImxlZnRhcnJvd1wiOiBcIuKGkFwiLFxuICBcImxlZnRhcnJvd3RhaWxcIjogXCLihqJcIixcbiAgXCJsZWZ0aGFycG9vbmRvd25cIjogXCLihr1cIixcbiAgXCJsZWZ0aGFycG9vbnVwXCI6IFwi4oa8XCIsXG4gIFwibGVmdGxlZnRhcnJvd3NcIjogXCLih4dcIixcbiAgXCJsZWZ0cmlnaHRhcnJvd1wiOiBcIuKGlFwiLFxuICBcImxlZnRyaWdodGFycm93c1wiOiBcIuKHhlwiLFxuICBcImxlZnRyaWdodGhhcnBvb25zXCI6IFwi4oeLXCIsXG4gIFwibGVmdHJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGrVwiLFxuICBcImxlZnR0aHJlZXRpbWVzXCI6IFwi4ouLXCIsXG4gIFwibGVnXCI6IFwi4ouaXCIsXG4gIFwibGVxXCI6IFwi4omkXCIsXG4gIFwibGVxcVwiOiBcIuKJplwiLFxuICBcImxlcXNsYW50XCI6IFwi4qm9XCIsXG4gIFwibGVzXCI6IFwi4qm9XCIsXG4gIFwibGVzY2NcIjogXCLiqqhcIixcbiAgXCJsZXNkb3RcIjogXCLiqb9cIixcbiAgXCJsZXNkb3RvXCI6IFwi4qqBXCIsXG4gIFwibGVzZG90b3JcIjogXCLiqoNcIixcbiAgXCJsZXNnXCI6IFwi4oua77iAXCIsXG4gIFwibGVzZ2VzXCI6IFwi4qqTXCIsXG4gIFwibGVzc2FwcHJveFwiOiBcIuKqhVwiLFxuICBcImxlc3Nkb3RcIjogXCLii5ZcIixcbiAgXCJsZXNzZXFndHJcIjogXCLii5pcIixcbiAgXCJsZXNzZXFxZ3RyXCI6IFwi4qqLXCIsXG4gIFwibGVzc2d0clwiOiBcIuKJtlwiLFxuICBcImxlc3NzaW1cIjogXCLiibJcIixcbiAgXCJsZmlzaHRcIjogXCLipbxcIixcbiAgXCJsZmxvb3JcIjogXCLijIpcIixcbiAgXCJsZnJcIjogXCLwnZSpXCIsXG4gIFwibGdcIjogXCLiibZcIixcbiAgXCJsZ0VcIjogXCLiqpFcIixcbiAgXCJsaGFyZFwiOiBcIuKGvVwiLFxuICBcImxoYXJ1XCI6IFwi4oa8XCIsXG4gIFwibGhhcnVsXCI6IFwi4qWqXCIsXG4gIFwibGhibGtcIjogXCLiloRcIixcbiAgXCJsamN5XCI6IFwi0ZlcIixcbiAgXCJsbFwiOiBcIuKJqlwiLFxuICBcImxsYXJyXCI6IFwi4oeHXCIsXG4gIFwibGxjb3JuZXJcIjogXCLijJ5cIixcbiAgXCJsbGhhcmRcIjogXCLipatcIixcbiAgXCJsbHRyaVwiOiBcIuKXulwiLFxuICBcImxtaWRvdFwiOiBcIsWAXCIsXG4gIFwibG1vdXN0XCI6IFwi4o6wXCIsXG4gIFwibG1vdXN0YWNoZVwiOiBcIuKOsFwiLFxuICBcImxuRVwiOiBcIuKJqFwiLFxuICBcImxuYXBcIjogXCLiqolcIixcbiAgXCJsbmFwcHJveFwiOiBcIuKqiVwiLFxuICBcImxuZVwiOiBcIuKqh1wiLFxuICBcImxuZXFcIjogXCLiqodcIixcbiAgXCJsbmVxcVwiOiBcIuKJqFwiLFxuICBcImxuc2ltXCI6IFwi4oumXCIsXG4gIFwibG9hbmdcIjogXCLin6xcIixcbiAgXCJsb2FyclwiOiBcIuKHvVwiLFxuICBcImxvYnJrXCI6IFwi4p+mXCIsXG4gIFwibG9uZ2xlZnRhcnJvd1wiOiBcIuKftVwiLFxuICBcImxvbmdsZWZ0cmlnaHRhcnJvd1wiOiBcIuKft1wiLFxuICBcImxvbmdtYXBzdG9cIjogXCLin7xcIixcbiAgXCJsb25ncmlnaHRhcnJvd1wiOiBcIuKftlwiLFxuICBcImxvb3BhcnJvd2xlZnRcIjogXCLihqtcIixcbiAgXCJsb29wYXJyb3dyaWdodFwiOiBcIuKGrFwiLFxuICBcImxvcGFyXCI6IFwi4qaFXCIsXG4gIFwibG9wZlwiOiBcIvCdlZ1cIixcbiAgXCJsb3BsdXNcIjogXCLiqK1cIixcbiAgXCJsb3RpbWVzXCI6IFwi4qi0XCIsXG4gIFwibG93YXN0XCI6IFwi4oiXXCIsXG4gIFwibG93YmFyXCI6IFwiX1wiLFxuICBcImxvelwiOiBcIuKXilwiLFxuICBcImxvemVuZ2VcIjogXCLil4pcIixcbiAgXCJsb3pmXCI6IFwi4qerXCIsXG4gIFwibHBhclwiOiBcIihcIixcbiAgXCJscGFybHRcIjogXCLippNcIixcbiAgXCJscmFyclwiOiBcIuKHhlwiLFxuICBcImxyY29ybmVyXCI6IFwi4oyfXCIsXG4gIFwibHJoYXJcIjogXCLih4tcIixcbiAgXCJscmhhcmRcIjogXCLipa1cIixcbiAgXCJscm1cIjogXCLigI5cIixcbiAgXCJscnRyaVwiOiBcIuKKv1wiLFxuICBcImxzYXF1b1wiOiBcIuKAuVwiLFxuICBcImxzY3JcIjogXCLwnZOBXCIsXG4gIFwibHNoXCI6IFwi4oawXCIsXG4gIFwibHNpbVwiOiBcIuKJslwiLFxuICBcImxzaW1lXCI6IFwi4qqNXCIsXG4gIFwibHNpbWdcIjogXCLiqo9cIixcbiAgXCJsc3FiXCI6IFwiW1wiLFxuICBcImxzcXVvXCI6IFwi4oCYXCIsXG4gIFwibHNxdW9yXCI6IFwi4oCaXCIsXG4gIFwibHN0cm9rXCI6IFwixYJcIixcbiAgXCJsXCI6IFwiPFwiLFxuICBcImx0XCI6IFwiPFwiLFxuICBcImx0Y2NcIjogXCLiqqZcIixcbiAgXCJsdGNpclwiOiBcIuKpuVwiLFxuICBcImx0ZG90XCI6IFwi4ouWXCIsXG4gIFwibHRocmVlXCI6IFwi4ouLXCIsXG4gIFwibHRpbWVzXCI6IFwi4ouJXCIsXG4gIFwibHRsYXJyXCI6IFwi4qW2XCIsXG4gIFwibHRxdWVzdFwiOiBcIuKpu1wiLFxuICBcImx0clBhclwiOiBcIuKmllwiLFxuICBcImx0cmlcIjogXCLil4NcIixcbiAgXCJsdHJpZVwiOiBcIuKKtFwiLFxuICBcImx0cmlmXCI6IFwi4peCXCIsXG4gIFwibHVyZHNoYXJcIjogXCLipYpcIixcbiAgXCJsdXJ1aGFyXCI6IFwi4qWmXCIsXG4gIFwibHZlcnRuZXFxXCI6IFwi4omo77iAXCIsXG4gIFwibHZuRVwiOiBcIuKJqO+4gFwiLFxuICBcIm1ERG90XCI6IFwi4oi6XCIsXG4gIFwibWFjXCI6IFwiwq9cIixcbiAgXCJtYWNyXCI6IFwiwq9cIixcbiAgXCJtYWxlXCI6IFwi4pmCXCIsXG4gIFwibWFsdFwiOiBcIuKcoFwiLFxuICBcIm1hbHRlc2VcIjogXCLinKBcIixcbiAgXCJtYXBcIjogXCLihqZcIixcbiAgXCJtYXBzdG9cIjogXCLihqZcIixcbiAgXCJtYXBzdG9kb3duXCI6IFwi4oanXCIsXG4gIFwibWFwc3RvbGVmdFwiOiBcIuKGpFwiLFxuICBcIm1hcHN0b3VwXCI6IFwi4oalXCIsXG4gIFwibWFya2VyXCI6IFwi4pauXCIsXG4gIFwibWNvbW1hXCI6IFwi4qipXCIsXG4gIFwibWN5XCI6IFwi0LxcIixcbiAgXCJtZGFzaFwiOiBcIuKAlFwiLFxuICBcIm1lYXN1cmVkYW5nbGVcIjogXCLiiKFcIixcbiAgXCJtZnJcIjogXCLwnZSqXCIsXG4gIFwibWhvXCI6IFwi4oSnXCIsXG4gIFwibWljclwiOiBcIsK1XCIsXG4gIFwibWljcm9cIjogXCLCtVwiLFxuICBcIm1pZFwiOiBcIuKIo1wiLFxuICBcIm1pZGFzdFwiOiBcIipcIixcbiAgXCJtaWRjaXJcIjogXCLiq7BcIixcbiAgXCJtaWRkb1wiOiBcIsK3XCIsXG4gIFwibWlkZG90XCI6IFwiwrdcIixcbiAgXCJtaW51c1wiOiBcIuKIklwiLFxuICBcIm1pbnVzYlwiOiBcIuKKn1wiLFxuICBcIm1pbnVzZFwiOiBcIuKIuFwiLFxuICBcIm1pbnVzZHVcIjogXCLiqKpcIixcbiAgXCJtbGNwXCI6IFwi4qubXCIsXG4gIFwibWxkclwiOiBcIuKAplwiLFxuICBcIm1ucGx1c1wiOiBcIuKIk1wiLFxuICBcIm1vZGVsc1wiOiBcIuKKp1wiLFxuICBcIm1vcGZcIjogXCLwnZWeXCIsXG4gIFwibXBcIjogXCLiiJNcIixcbiAgXCJtc2NyXCI6IFwi8J2TglwiLFxuICBcIm1zdHBvc1wiOiBcIuKIvlwiLFxuICBcIm11XCI6IFwizrxcIixcbiAgXCJtdWx0aW1hcFwiOiBcIuKKuFwiLFxuICBcIm11bWFwXCI6IFwi4oq4XCIsXG4gIFwibkdnXCI6IFwi4ouZzLhcIixcbiAgXCJuR3RcIjogXCLiiavig5JcIixcbiAgXCJuR3R2XCI6IFwi4omrzLhcIixcbiAgXCJuTGVmdGFycm93XCI6IFwi4oeNXCIsXG4gIFwibkxlZnRyaWdodGFycm93XCI6IFwi4oeOXCIsXG4gIFwibkxsXCI6IFwi4ouYzLhcIixcbiAgXCJuTHRcIjogXCLiiarig5JcIixcbiAgXCJuTHR2XCI6IFwi4omqzLhcIixcbiAgXCJuUmlnaHRhcnJvd1wiOiBcIuKHj1wiLFxuICBcIm5WRGFzaFwiOiBcIuKKr1wiLFxuICBcIm5WZGFzaFwiOiBcIuKKrlwiLFxuICBcIm5hYmxhXCI6IFwi4oiHXCIsXG4gIFwibmFjdXRlXCI6IFwixYRcIixcbiAgXCJuYW5nXCI6IFwi4oig4oOSXCIsXG4gIFwibmFwXCI6IFwi4omJXCIsXG4gIFwibmFwRVwiOiBcIuKpsMy4XCIsXG4gIFwibmFwaWRcIjogXCLiiYvMuFwiLFxuICBcIm5hcG9zXCI6IFwixYlcIixcbiAgXCJuYXBwcm94XCI6IFwi4omJXCIsXG4gIFwibmF0dXJcIjogXCLima5cIixcbiAgXCJuYXR1cmFsXCI6IFwi4pmuXCIsXG4gIFwibmF0dXJhbHNcIjogXCLihJVcIixcbiAgXCJuYnNcIjogXCLCoFwiLFxuICBcIm5ic3BcIjogXCLCoFwiLFxuICBcIm5idW1wXCI6IFwi4omOzLhcIixcbiAgXCJuYnVtcGVcIjogXCLiiY/MuFwiLFxuICBcIm5jYXBcIjogXCLiqYNcIixcbiAgXCJuY2Fyb25cIjogXCLFiFwiLFxuICBcIm5jZWRpbFwiOiBcIsWGXCIsXG4gIFwibmNvbmdcIjogXCLiiYdcIixcbiAgXCJuY29uZ2RvdFwiOiBcIuKprcy4XCIsXG4gIFwibmN1cFwiOiBcIuKpglwiLFxuICBcIm5jeVwiOiBcItC9XCIsXG4gIFwibmRhc2hcIjogXCLigJNcIixcbiAgXCJuZVwiOiBcIuKJoFwiLFxuICBcIm5lQXJyXCI6IFwi4oeXXCIsXG4gIFwibmVhcmhrXCI6IFwi4qSkXCIsXG4gIFwibmVhcnJcIjogXCLihpdcIixcbiAgXCJuZWFycm93XCI6IFwi4oaXXCIsXG4gIFwibmVkb3RcIjogXCLiiZDMuFwiLFxuICBcIm5lcXVpdlwiOiBcIuKJolwiLFxuICBcIm5lc2VhclwiOiBcIuKkqFwiLFxuICBcIm5lc2ltXCI6IFwi4omCzLhcIixcbiAgXCJuZXhpc3RcIjogXCLiiIRcIixcbiAgXCJuZXhpc3RzXCI6IFwi4oiEXCIsXG4gIFwibmZyXCI6IFwi8J2Uq1wiLFxuICBcIm5nRVwiOiBcIuKJp8y4XCIsXG4gIFwibmdlXCI6IFwi4omxXCIsXG4gIFwibmdlcVwiOiBcIuKJsVwiLFxuICBcIm5nZXFxXCI6IFwi4omnzLhcIixcbiAgXCJuZ2Vxc2xhbnRcIjogXCLiqb7MuFwiLFxuICBcIm5nZXNcIjogXCLiqb7MuFwiLFxuICBcIm5nc2ltXCI6IFwi4om1XCIsXG4gIFwibmd0XCI6IFwi4omvXCIsXG4gIFwibmd0clwiOiBcIuKJr1wiLFxuICBcIm5oQXJyXCI6IFwi4oeOXCIsXG4gIFwibmhhcnJcIjogXCLihq5cIixcbiAgXCJuaHBhclwiOiBcIuKrslwiLFxuICBcIm5pXCI6IFwi4oiLXCIsXG4gIFwibmlzXCI6IFwi4ou8XCIsXG4gIFwibmlzZFwiOiBcIuKLulwiLFxuICBcIm5pdlwiOiBcIuKIi1wiLFxuICBcIm5qY3lcIjogXCLRmlwiLFxuICBcIm5sQXJyXCI6IFwi4oeNXCIsXG4gIFwibmxFXCI6IFwi4ommzLhcIixcbiAgXCJubGFyclwiOiBcIuKGmlwiLFxuICBcIm5sZHJcIjogXCLigKVcIixcbiAgXCJubGVcIjogXCLiibBcIixcbiAgXCJubGVmdGFycm93XCI6IFwi4oaaXCIsXG4gIFwibmxlZnRyaWdodGFycm93XCI6IFwi4oauXCIsXG4gIFwibmxlcVwiOiBcIuKJsFwiLFxuICBcIm5sZXFxXCI6IFwi4ommzLhcIixcbiAgXCJubGVxc2xhbnRcIjogXCLiqb3MuFwiLFxuICBcIm5sZXNcIjogXCLiqb3MuFwiLFxuICBcIm5sZXNzXCI6IFwi4omuXCIsXG4gIFwibmxzaW1cIjogXCLiibRcIixcbiAgXCJubHRcIjogXCLiia5cIixcbiAgXCJubHRyaVwiOiBcIuKLqlwiLFxuICBcIm5sdHJpZVwiOiBcIuKLrFwiLFxuICBcIm5taWRcIjogXCLiiKRcIixcbiAgXCJub3BmXCI6IFwi8J2Vn1wiLFxuICBcIm5vXCI6IFwiwqxcIixcbiAgXCJub3RcIjogXCLCrFwiLFxuICBcIm5vdGluXCI6IFwi4oiJXCIsXG4gIFwibm90aW5FXCI6IFwi4ou5zLhcIixcbiAgXCJub3RpbmRvdFwiOiBcIuKLtcy4XCIsXG4gIFwibm90aW52YVwiOiBcIuKIiVwiLFxuICBcIm5vdGludmJcIjogXCLii7dcIixcbiAgXCJub3RpbnZjXCI6IFwi4ou2XCIsXG4gIFwibm90bmlcIjogXCLiiIxcIixcbiAgXCJub3RuaXZhXCI6IFwi4oiMXCIsXG4gIFwibm90bml2YlwiOiBcIuKLvlwiLFxuICBcIm5vdG5pdmNcIjogXCLii71cIixcbiAgXCJucGFyXCI6IFwi4oimXCIsXG4gIFwibnBhcmFsbGVsXCI6IFwi4oimXCIsXG4gIFwibnBhcnNsXCI6IFwi4qu94oOlXCIsXG4gIFwibnBhcnRcIjogXCLiiILMuFwiLFxuICBcIm5wb2xpbnRcIjogXCLiqJRcIixcbiAgXCJucHJcIjogXCLiioBcIixcbiAgXCJucHJjdWVcIjogXCLii6BcIixcbiAgXCJucHJlXCI6IFwi4qqvzLhcIixcbiAgXCJucHJlY1wiOiBcIuKKgFwiLFxuICBcIm5wcmVjZXFcIjogXCLiqq/MuFwiLFxuICBcIm5yQXJyXCI6IFwi4oePXCIsXG4gIFwibnJhcnJcIjogXCLihptcIixcbiAgXCJucmFycmNcIjogXCLipLPMuFwiLFxuICBcIm5yYXJyd1wiOiBcIuKGncy4XCIsXG4gIFwibnJpZ2h0YXJyb3dcIjogXCLihptcIixcbiAgXCJucnRyaVwiOiBcIuKLq1wiLFxuICBcIm5ydHJpZVwiOiBcIuKLrVwiLFxuICBcIm5zY1wiOiBcIuKKgVwiLFxuICBcIm5zY2N1ZVwiOiBcIuKLoVwiLFxuICBcIm5zY2VcIjogXCLiqrDMuFwiLFxuICBcIm5zY3JcIjogXCLwnZODXCIsXG4gIFwibnNob3J0bWlkXCI6IFwi4oikXCIsXG4gIFwibnNob3J0cGFyYWxsZWxcIjogXCLiiKZcIixcbiAgXCJuc2ltXCI6IFwi4omBXCIsXG4gIFwibnNpbWVcIjogXCLiiYRcIixcbiAgXCJuc2ltZXFcIjogXCLiiYRcIixcbiAgXCJuc21pZFwiOiBcIuKIpFwiLFxuICBcIm5zcGFyXCI6IFwi4oimXCIsXG4gIFwibnNxc3ViZVwiOiBcIuKLolwiLFxuICBcIm5zcXN1cGVcIjogXCLii6NcIixcbiAgXCJuc3ViXCI6IFwi4oqEXCIsXG4gIFwibnN1YkVcIjogXCLiq4XMuFwiLFxuICBcIm5zdWJlXCI6IFwi4oqIXCIsXG4gIFwibnN1YnNldFwiOiBcIuKKguKDklwiLFxuICBcIm5zdWJzZXRlcVwiOiBcIuKKiFwiLFxuICBcIm5zdWJzZXRlcXFcIjogXCLiq4XMuFwiLFxuICBcIm5zdWNjXCI6IFwi4oqBXCIsXG4gIFwibnN1Y2NlcVwiOiBcIuKqsMy4XCIsXG4gIFwibnN1cFwiOiBcIuKKhVwiLFxuICBcIm5zdXBFXCI6IFwi4quGzLhcIixcbiAgXCJuc3VwZVwiOiBcIuKKiVwiLFxuICBcIm5zdXBzZXRcIjogXCLiioPig5JcIixcbiAgXCJuc3Vwc2V0ZXFcIjogXCLiiolcIixcbiAgXCJuc3Vwc2V0ZXFxXCI6IFwi4quGzLhcIixcbiAgXCJudGdsXCI6IFwi4om5XCIsXG4gIFwibnRpbGRcIjogXCLDsVwiLFxuICBcIm50aWxkZVwiOiBcIsOxXCIsXG4gIFwibnRsZ1wiOiBcIuKJuFwiLFxuICBcIm50cmlhbmdsZWxlZnRcIjogXCLii6pcIixcbiAgXCJudHJpYW5nbGVsZWZ0ZXFcIjogXCLii6xcIixcbiAgXCJudHJpYW5nbGVyaWdodFwiOiBcIuKLq1wiLFxuICBcIm50cmlhbmdsZXJpZ2h0ZXFcIjogXCLii61cIixcbiAgXCJudVwiOiBcIs69XCIsXG4gIFwibnVtXCI6IFwiI1wiLFxuICBcIm51bWVyb1wiOiBcIuKEllwiLFxuICBcIm51bXNwXCI6IFwi4oCHXCIsXG4gIFwibnZEYXNoXCI6IFwi4oqtXCIsXG4gIFwibnZIYXJyXCI6IFwi4qSEXCIsXG4gIFwibnZhcFwiOiBcIuKJjeKDklwiLFxuICBcIm52ZGFzaFwiOiBcIuKKrFwiLFxuICBcIm52Z2VcIjogXCLiiaXig5JcIixcbiAgXCJudmd0XCI6IFwiPuKDklwiLFxuICBcIm52aW5maW5cIjogXCLip55cIixcbiAgXCJudmxBcnJcIjogXCLipIJcIixcbiAgXCJudmxlXCI6IFwi4omk4oOSXCIsXG4gIFwibnZsdFwiOiBcIjzig5JcIixcbiAgXCJudmx0cmllXCI6IFwi4oq04oOSXCIsXG4gIFwibnZyQXJyXCI6IFwi4qSDXCIsXG4gIFwibnZydHJpZVwiOiBcIuKKteKDklwiLFxuICBcIm52c2ltXCI6IFwi4oi84oOSXCIsXG4gIFwibndBcnJcIjogXCLih5ZcIixcbiAgXCJud2FyaGtcIjogXCLipKNcIixcbiAgXCJud2FyclwiOiBcIuKGllwiLFxuICBcIm53YXJyb3dcIjogXCLihpZcIixcbiAgXCJud25lYXJcIjogXCLipKdcIixcbiAgXCJvU1wiOiBcIuKTiFwiLFxuICBcIm9hY3V0XCI6IFwiw7NcIixcbiAgXCJvYWN1dGVcIjogXCLDs1wiLFxuICBcIm9hc3RcIjogXCLiiptcIixcbiAgXCJvY2lyXCI6IFwiw7RcIixcbiAgXCJvY2lyY1wiOiBcIsO0XCIsXG4gIFwib2N5XCI6IFwi0L5cIixcbiAgXCJvZGFzaFwiOiBcIuKKnVwiLFxuICBcIm9kYmxhY1wiOiBcIsWRXCIsXG4gIFwib2RpdlwiOiBcIuKouFwiLFxuICBcIm9kb3RcIjogXCLiiplcIixcbiAgXCJvZHNvbGRcIjogXCLiprxcIixcbiAgXCJvZWxpZ1wiOiBcIsWTXCIsXG4gIFwib2ZjaXJcIjogXCLipr9cIixcbiAgXCJvZnJcIjogXCLwnZSsXCIsXG4gIFwib2dvblwiOiBcIsubXCIsXG4gIFwib2dyYXZcIjogXCLDslwiLFxuICBcIm9ncmF2ZVwiOiBcIsOyXCIsXG4gIFwib2d0XCI6IFwi4qeBXCIsXG4gIFwib2hiYXJcIjogXCLiprVcIixcbiAgXCJvaG1cIjogXCLOqVwiLFxuICBcIm9pbnRcIjogXCLiiK5cIixcbiAgXCJvbGFyclwiOiBcIuKGulwiLFxuICBcIm9sY2lyXCI6IFwi4qa+XCIsXG4gIFwib2xjcm9zc1wiOiBcIuKmu1wiLFxuICBcIm9saW5lXCI6IFwi4oC+XCIsXG4gIFwib2x0XCI6IFwi4qeAXCIsXG4gIFwib21hY3JcIjogXCLFjVwiLFxuICBcIm9tZWdhXCI6IFwiz4lcIixcbiAgXCJvbWljcm9uXCI6IFwizr9cIixcbiAgXCJvbWlkXCI6IFwi4qa2XCIsXG4gIFwib21pbnVzXCI6IFwi4oqWXCIsXG4gIFwib29wZlwiOiBcIvCdlaBcIixcbiAgXCJvcGFyXCI6IFwi4qa3XCIsXG4gIFwib3BlcnBcIjogXCLiprlcIixcbiAgXCJvcGx1c1wiOiBcIuKKlVwiLFxuICBcIm9yXCI6IFwi4oioXCIsXG4gIFwib3JhcnJcIjogXCLihrtcIixcbiAgXCJvcmRcIjogXCLCulwiLFxuICBcIm9yZGVyXCI6IFwi4oS0XCIsXG4gIFwib3JkZXJvZlwiOiBcIuKEtFwiLFxuICBcIm9yZGZcIjogXCLCqlwiLFxuICBcIm9yZG1cIjogXCLCulwiLFxuICBcIm9yaWdvZlwiOiBcIuKKtlwiLFxuICBcIm9yb3JcIjogXCLiqZZcIixcbiAgXCJvcnNsb3BlXCI6IFwi4qmXXCIsXG4gIFwib3J2XCI6IFwi4qmbXCIsXG4gIFwib3NjclwiOiBcIuKEtFwiLFxuICBcIm9zbGFzXCI6IFwiw7hcIixcbiAgXCJvc2xhc2hcIjogXCLDuFwiLFxuICBcIm9zb2xcIjogXCLiiphcIixcbiAgXCJvdGlsZFwiOiBcIsO1XCIsXG4gIFwib3RpbGRlXCI6IFwiw7VcIixcbiAgXCJvdGltZXNcIjogXCLiipdcIixcbiAgXCJvdGltZXNhc1wiOiBcIuKotlwiLFxuICBcIm91bVwiOiBcIsO2XCIsXG4gIFwib3VtbFwiOiBcIsO2XCIsXG4gIFwib3ZiYXJcIjogXCLijL1cIixcbiAgXCJwYXJcIjogXCLCtlwiLFxuICBcInBhcmFcIjogXCLCtlwiLFxuICBcInBhcmFsbGVsXCI6IFwi4oilXCIsXG4gIFwicGFyc2ltXCI6IFwi4quzXCIsXG4gIFwicGFyc2xcIjogXCLiq71cIixcbiAgXCJwYXJ0XCI6IFwi4oiCXCIsXG4gIFwicGN5XCI6IFwi0L9cIixcbiAgXCJwZXJjbnRcIjogXCIlXCIsXG4gIFwicGVyaW9kXCI6IFwiLlwiLFxuICBcInBlcm1pbFwiOiBcIuKAsFwiLFxuICBcInBlcnBcIjogXCLiiqVcIixcbiAgXCJwZXJ0ZW5rXCI6IFwi4oCxXCIsXG4gIFwicGZyXCI6IFwi8J2UrVwiLFxuICBcInBoaVwiOiBcIs+GXCIsXG4gIFwicGhpdlwiOiBcIs+VXCIsXG4gIFwicGhtbWF0XCI6IFwi4oSzXCIsXG4gIFwicGhvbmVcIjogXCLimI5cIixcbiAgXCJwaVwiOiBcIs+AXCIsXG4gIFwicGl0Y2hmb3JrXCI6IFwi4ouUXCIsXG4gIFwicGl2XCI6IFwiz5ZcIixcbiAgXCJwbGFuY2tcIjogXCLihI9cIixcbiAgXCJwbGFuY2toXCI6IFwi4oSOXCIsXG4gIFwicGxhbmt2XCI6IFwi4oSPXCIsXG4gIFwicGx1c1wiOiBcIitcIixcbiAgXCJwbHVzYWNpclwiOiBcIuKoo1wiLFxuICBcInBsdXNiXCI6IFwi4oqeXCIsXG4gIFwicGx1c2NpclwiOiBcIuKoolwiLFxuICBcInBsdXNkb1wiOiBcIuKIlFwiLFxuICBcInBsdXNkdVwiOiBcIuKopVwiLFxuICBcInBsdXNlXCI6IFwi4qmyXCIsXG4gIFwicGx1c21cIjogXCLCsVwiLFxuICBcInBsdXNtblwiOiBcIsKxXCIsXG4gIFwicGx1c3NpbVwiOiBcIuKoplwiLFxuICBcInBsdXN0d29cIjogXCLiqKdcIixcbiAgXCJwbVwiOiBcIsKxXCIsXG4gIFwicG9pbnRpbnRcIjogXCLiqJVcIixcbiAgXCJwb3BmXCI6IFwi8J2VoVwiLFxuICBcInBvdW5cIjogXCLCo1wiLFxuICBcInBvdW5kXCI6IFwiwqNcIixcbiAgXCJwclwiOiBcIuKJulwiLFxuICBcInByRVwiOiBcIuKqs1wiLFxuICBcInByYXBcIjogXCLiqrdcIixcbiAgXCJwcmN1ZVwiOiBcIuKJvFwiLFxuICBcInByZVwiOiBcIuKqr1wiLFxuICBcInByZWNcIjogXCLiibpcIixcbiAgXCJwcmVjYXBwcm94XCI6IFwi4qq3XCIsXG4gIFwicHJlY2N1cmx5ZXFcIjogXCLiibxcIixcbiAgXCJwcmVjZXFcIjogXCLiqq9cIixcbiAgXCJwcmVjbmFwcHJveFwiOiBcIuKquVwiLFxuICBcInByZWNuZXFxXCI6IFwi4qq1XCIsXG4gIFwicHJlY25zaW1cIjogXCLii6hcIixcbiAgXCJwcmVjc2ltXCI6IFwi4om+XCIsXG4gIFwicHJpbWVcIjogXCLigLJcIixcbiAgXCJwcmltZXNcIjogXCLihJlcIixcbiAgXCJwcm5FXCI6IFwi4qq1XCIsXG4gIFwicHJuYXBcIjogXCLiqrlcIixcbiAgXCJwcm5zaW1cIjogXCLii6hcIixcbiAgXCJwcm9kXCI6IFwi4oiPXCIsXG4gIFwicHJvZmFsYXJcIjogXCLijK5cIixcbiAgXCJwcm9mbGluZVwiOiBcIuKMklwiLFxuICBcInByb2ZzdXJmXCI6IFwi4oyTXCIsXG4gIFwicHJvcFwiOiBcIuKInVwiLFxuICBcInByb3B0b1wiOiBcIuKInVwiLFxuICBcInByc2ltXCI6IFwi4om+XCIsXG4gIFwicHJ1cmVsXCI6IFwi4oqwXCIsXG4gIFwicHNjclwiOiBcIvCdk4VcIixcbiAgXCJwc2lcIjogXCLPiFwiLFxuICBcInB1bmNzcFwiOiBcIuKAiFwiLFxuICBcInFmclwiOiBcIvCdlK5cIixcbiAgXCJxaW50XCI6IFwi4qiMXCIsXG4gIFwicW9wZlwiOiBcIvCdlaJcIixcbiAgXCJxcHJpbWVcIjogXCLigZdcIixcbiAgXCJxc2NyXCI6IFwi8J2ThlwiLFxuICBcInF1YXRlcm5pb25zXCI6IFwi4oSNXCIsXG4gIFwicXVhdGludFwiOiBcIuKollwiLFxuICBcInF1ZXN0XCI6IFwiP1wiLFxuICBcInF1ZXN0ZXFcIjogXCLiiZ9cIixcbiAgXCJxdW9cIjogXCJcXFwiXCIsXG4gIFwicXVvdFwiOiBcIlxcXCJcIixcbiAgXCJyQWFyclwiOiBcIuKHm1wiLFxuICBcInJBcnJcIjogXCLih5JcIixcbiAgXCJyQXRhaWxcIjogXCLipJxcIixcbiAgXCJyQmFyclwiOiBcIuKkj1wiLFxuICBcInJIYXJcIjogXCLipaRcIixcbiAgXCJyYWNlXCI6IFwi4oi9zLFcIixcbiAgXCJyYWN1dGVcIjogXCLFlVwiLFxuICBcInJhZGljXCI6IFwi4oiaXCIsXG4gIFwicmFlbXB0eXZcIjogXCLiprNcIixcbiAgXCJyYW5nXCI6IFwi4p+pXCIsXG4gIFwicmFuZ2RcIjogXCLippJcIixcbiAgXCJyYW5nZVwiOiBcIuKmpVwiLFxuICBcInJhbmdsZVwiOiBcIuKfqVwiLFxuICBcInJhcXVcIjogXCLCu1wiLFxuICBcInJhcXVvXCI6IFwiwrtcIixcbiAgXCJyYXJyXCI6IFwi4oaSXCIsXG4gIFwicmFycmFwXCI6IFwi4qW1XCIsXG4gIFwicmFycmJcIjogXCLih6VcIixcbiAgXCJyYXJyYmZzXCI6IFwi4qSgXCIsXG4gIFwicmFycmNcIjogXCLipLNcIixcbiAgXCJyYXJyZnNcIjogXCLipJ5cIixcbiAgXCJyYXJyaGtcIjogXCLihqpcIixcbiAgXCJyYXJybHBcIjogXCLihqxcIixcbiAgXCJyYXJycGxcIjogXCLipYVcIixcbiAgXCJyYXJyc2ltXCI6IFwi4qW0XCIsXG4gIFwicmFycnRsXCI6IFwi4oajXCIsXG4gIFwicmFycndcIjogXCLihp1cIixcbiAgXCJyYXRhaWxcIjogXCLipJpcIixcbiAgXCJyYXRpb1wiOiBcIuKItlwiLFxuICBcInJhdGlvbmFsc1wiOiBcIuKEmlwiLFxuICBcInJiYXJyXCI6IFwi4qSNXCIsXG4gIFwicmJicmtcIjogXCLinbNcIixcbiAgXCJyYnJhY2VcIjogXCJ9XCIsXG4gIFwicmJyYWNrXCI6IFwiXVwiLFxuICBcInJicmtlXCI6IFwi4qaMXCIsXG4gIFwicmJya3NsZFwiOiBcIuKmjlwiLFxuICBcInJicmtzbHVcIjogXCLippBcIixcbiAgXCJyY2Fyb25cIjogXCLFmVwiLFxuICBcInJjZWRpbFwiOiBcIsWXXCIsXG4gIFwicmNlaWxcIjogXCLijIlcIixcbiAgXCJyY3ViXCI6IFwifVwiLFxuICBcInJjeVwiOiBcItGAXCIsXG4gIFwicmRjYVwiOiBcIuKkt1wiLFxuICBcInJkbGRoYXJcIjogXCLipalcIixcbiAgXCJyZHF1b1wiOiBcIuKAnVwiLFxuICBcInJkcXVvclwiOiBcIuKAnVwiLFxuICBcInJkc2hcIjogXCLihrNcIixcbiAgXCJyZWFsXCI6IFwi4oScXCIsXG4gIFwicmVhbGluZVwiOiBcIuKEm1wiLFxuICBcInJlYWxwYXJ0XCI6IFwi4oScXCIsXG4gIFwicmVhbHNcIjogXCLihJ1cIixcbiAgXCJyZWN0XCI6IFwi4patXCIsXG4gIFwicmVcIjogXCLCrlwiLFxuICBcInJlZ1wiOiBcIsKuXCIsXG4gIFwicmZpc2h0XCI6IFwi4qW9XCIsXG4gIFwicmZsb29yXCI6IFwi4oyLXCIsXG4gIFwicmZyXCI6IFwi8J2Ur1wiLFxuICBcInJoYXJkXCI6IFwi4oeBXCIsXG4gIFwicmhhcnVcIjogXCLih4BcIixcbiAgXCJyaGFydWxcIjogXCLipaxcIixcbiAgXCJyaG9cIjogXCLPgVwiLFxuICBcInJob3ZcIjogXCLPsVwiLFxuICBcInJpZ2h0YXJyb3dcIjogXCLihpJcIixcbiAgXCJyaWdodGFycm93dGFpbFwiOiBcIuKGo1wiLFxuICBcInJpZ2h0aGFycG9vbmRvd25cIjogXCLih4FcIixcbiAgXCJyaWdodGhhcnBvb251cFwiOiBcIuKHgFwiLFxuICBcInJpZ2h0bGVmdGFycm93c1wiOiBcIuKHhFwiLFxuICBcInJpZ2h0bGVmdGhhcnBvb25zXCI6IFwi4oeMXCIsXG4gIFwicmlnaHRyaWdodGFycm93c1wiOiBcIuKHiVwiLFxuICBcInJpZ2h0c3F1aWdhcnJvd1wiOiBcIuKGnVwiLFxuICBcInJpZ2h0dGhyZWV0aW1lc1wiOiBcIuKLjFwiLFxuICBcInJpbmdcIjogXCLLmlwiLFxuICBcInJpc2luZ2RvdHNlcVwiOiBcIuKJk1wiLFxuICBcInJsYXJyXCI6IFwi4oeEXCIsXG4gIFwicmxoYXJcIjogXCLih4xcIixcbiAgXCJybG1cIjogXCLigI9cIixcbiAgXCJybW91c3RcIjogXCLijrFcIixcbiAgXCJybW91c3RhY2hlXCI6IFwi4o6xXCIsXG4gIFwicm5taWRcIjogXCLiq65cIixcbiAgXCJyb2FuZ1wiOiBcIuKfrVwiLFxuICBcInJvYXJyXCI6IFwi4oe+XCIsXG4gIFwicm9icmtcIjogXCLin6dcIixcbiAgXCJyb3BhclwiOiBcIuKmhlwiLFxuICBcInJvcGZcIjogXCLwnZWjXCIsXG4gIFwicm9wbHVzXCI6IFwi4qiuXCIsXG4gIFwicm90aW1lc1wiOiBcIuKotVwiLFxuICBcInJwYXJcIjogXCIpXCIsXG4gIFwicnBhcmd0XCI6IFwi4qaUXCIsXG4gIFwicnBwb2xpbnRcIjogXCLiqJJcIixcbiAgXCJycmFyclwiOiBcIuKHiVwiLFxuICBcInJzYXF1b1wiOiBcIuKAulwiLFxuICBcInJzY3JcIjogXCLwnZOHXCIsXG4gIFwicnNoXCI6IFwi4oaxXCIsXG4gIFwicnNxYlwiOiBcIl1cIixcbiAgXCJyc3F1b1wiOiBcIuKAmVwiLFxuICBcInJzcXVvclwiOiBcIuKAmVwiLFxuICBcInJ0aHJlZVwiOiBcIuKLjFwiLFxuICBcInJ0aW1lc1wiOiBcIuKLilwiLFxuICBcInJ0cmlcIjogXCLilrlcIixcbiAgXCJydHJpZVwiOiBcIuKKtVwiLFxuICBcInJ0cmlmXCI6IFwi4pa4XCIsXG4gIFwicnRyaWx0cmlcIjogXCLip45cIixcbiAgXCJydWx1aGFyXCI6IFwi4qWoXCIsXG4gIFwicnhcIjogXCLihJ5cIixcbiAgXCJzYWN1dGVcIjogXCLFm1wiLFxuICBcInNicXVvXCI6IFwi4oCaXCIsXG4gIFwic2NcIjogXCLiibtcIixcbiAgXCJzY0VcIjogXCLiqrRcIixcbiAgXCJzY2FwXCI6IFwi4qq4XCIsXG4gIFwic2Nhcm9uXCI6IFwixaFcIixcbiAgXCJzY2N1ZVwiOiBcIuKJvVwiLFxuICBcInNjZVwiOiBcIuKqsFwiLFxuICBcInNjZWRpbFwiOiBcIsWfXCIsXG4gIFwic2NpcmNcIjogXCLFnVwiLFxuICBcInNjbkVcIjogXCLiqrZcIixcbiAgXCJzY25hcFwiOiBcIuKqulwiLFxuICBcInNjbnNpbVwiOiBcIuKLqVwiLFxuICBcInNjcG9saW50XCI6IFwi4qiTXCIsXG4gIFwic2NzaW1cIjogXCLiib9cIixcbiAgXCJzY3lcIjogXCLRgVwiLFxuICBcInNkb3RcIjogXCLii4VcIixcbiAgXCJzZG90YlwiOiBcIuKKoVwiLFxuICBcInNkb3RlXCI6IFwi4qmmXCIsXG4gIFwic2VBcnJcIjogXCLih5hcIixcbiAgXCJzZWFyaGtcIjogXCLipKVcIixcbiAgXCJzZWFyclwiOiBcIuKGmFwiLFxuICBcInNlYXJyb3dcIjogXCLihphcIixcbiAgXCJzZWNcIjogXCLCp1wiLFxuICBcInNlY3RcIjogXCLCp1wiLFxuICBcInNlbWlcIjogXCI7XCIsXG4gIFwic2Vzd2FyXCI6IFwi4qSpXCIsXG4gIFwic2V0bWludXNcIjogXCLiiJZcIixcbiAgXCJzZXRtblwiOiBcIuKIllwiLFxuICBcInNleHRcIjogXCLinLZcIixcbiAgXCJzZnJcIjogXCLwnZSwXCIsXG4gIFwic2Zyb3duXCI6IFwi4oyiXCIsXG4gIFwic2hhcnBcIjogXCLima9cIixcbiAgXCJzaGNoY3lcIjogXCLRiVwiLFxuICBcInNoY3lcIjogXCLRiFwiLFxuICBcInNob3J0bWlkXCI6IFwi4oijXCIsXG4gIFwic2hvcnRwYXJhbGxlbFwiOiBcIuKIpVwiLFxuICBcInNoXCI6IFwiwq1cIixcbiAgXCJzaHlcIjogXCLCrVwiLFxuICBcInNpZ21hXCI6IFwiz4NcIixcbiAgXCJzaWdtYWZcIjogXCLPglwiLFxuICBcInNpZ21hdlwiOiBcIs+CXCIsXG4gIFwic2ltXCI6IFwi4oi8XCIsXG4gIFwic2ltZG90XCI6IFwi4qmqXCIsXG4gIFwic2ltZVwiOiBcIuKJg1wiLFxuICBcInNpbWVxXCI6IFwi4omDXCIsXG4gIFwic2ltZ1wiOiBcIuKqnlwiLFxuICBcInNpbWdFXCI6IFwi4qqgXCIsXG4gIFwic2ltbFwiOiBcIuKqnVwiLFxuICBcInNpbWxFXCI6IFwi4qqfXCIsXG4gIFwic2ltbmVcIjogXCLiiYZcIixcbiAgXCJzaW1wbHVzXCI6IFwi4qikXCIsXG4gIFwic2ltcmFyclwiOiBcIuKlslwiLFxuICBcInNsYXJyXCI6IFwi4oaQXCIsXG4gIFwic21hbGxzZXRtaW51c1wiOiBcIuKIllwiLFxuICBcInNtYXNocFwiOiBcIuKos1wiLFxuICBcInNtZXBhcnNsXCI6IFwi4qekXCIsXG4gIFwic21pZFwiOiBcIuKIo1wiLFxuICBcInNtaWxlXCI6IFwi4oyjXCIsXG4gIFwic210XCI6IFwi4qqqXCIsXG4gIFwic210ZVwiOiBcIuKqrFwiLFxuICBcInNtdGVzXCI6IFwi4qqs77iAXCIsXG4gIFwic29mdGN5XCI6IFwi0YxcIixcbiAgXCJzb2xcIjogXCIvXCIsXG4gIFwic29sYlwiOiBcIuKnhFwiLFxuICBcInNvbGJhclwiOiBcIuKMv1wiLFxuICBcInNvcGZcIjogXCLwnZWkXCIsXG4gIFwic3BhZGVzXCI6IFwi4pmgXCIsXG4gIFwic3BhZGVzdWl0XCI6IFwi4pmgXCIsXG4gIFwic3BhclwiOiBcIuKIpVwiLFxuICBcInNxY2FwXCI6IFwi4oqTXCIsXG4gIFwic3FjYXBzXCI6IFwi4oqT77iAXCIsXG4gIFwic3FjdXBcIjogXCLiipRcIixcbiAgXCJzcWN1cHNcIjogXCLiipTvuIBcIixcbiAgXCJzcXN1YlwiOiBcIuKKj1wiLFxuICBcInNxc3ViZVwiOiBcIuKKkVwiLFxuICBcInNxc3Vic2V0XCI6IFwi4oqPXCIsXG4gIFwic3FzdWJzZXRlcVwiOiBcIuKKkVwiLFxuICBcInNxc3VwXCI6IFwi4oqQXCIsXG4gIFwic3FzdXBlXCI6IFwi4oqSXCIsXG4gIFwic3FzdXBzZXRcIjogXCLiipBcIixcbiAgXCJzcXN1cHNldGVxXCI6IFwi4oqSXCIsXG4gIFwic3F1XCI6IFwi4pahXCIsXG4gIFwic3F1YXJlXCI6IFwi4pahXCIsXG4gIFwic3F1YXJmXCI6IFwi4paqXCIsXG4gIFwic3F1ZlwiOiBcIuKWqlwiLFxuICBcInNyYXJyXCI6IFwi4oaSXCIsXG4gIFwic3NjclwiOiBcIvCdk4hcIixcbiAgXCJzc2V0bW5cIjogXCLiiJZcIixcbiAgXCJzc21pbGVcIjogXCLijKNcIixcbiAgXCJzc3RhcmZcIjogXCLii4ZcIixcbiAgXCJzdGFyXCI6IFwi4piGXCIsXG4gIFwic3RhcmZcIjogXCLimIVcIixcbiAgXCJzdHJhaWdodGVwc2lsb25cIjogXCLPtVwiLFxuICBcInN0cmFpZ2h0cGhpXCI6IFwiz5VcIixcbiAgXCJzdHJuc1wiOiBcIsKvXCIsXG4gIFwic3ViXCI6IFwi4oqCXCIsXG4gIFwic3ViRVwiOiBcIuKrhVwiLFxuICBcInN1YmRvdFwiOiBcIuKqvVwiLFxuICBcInN1YmVcIjogXCLiioZcIixcbiAgXCJzdWJlZG90XCI6IFwi4quDXCIsXG4gIFwic3VibXVsdFwiOiBcIuKrgVwiLFxuICBcInN1Ym5FXCI6IFwi4quLXCIsXG4gIFwic3VibmVcIjogXCLiiopcIixcbiAgXCJzdWJwbHVzXCI6IFwi4qq/XCIsXG4gIFwic3VicmFyclwiOiBcIuKluVwiLFxuICBcInN1YnNldFwiOiBcIuKKglwiLFxuICBcInN1YnNldGVxXCI6IFwi4oqGXCIsXG4gIFwic3Vic2V0ZXFxXCI6IFwi4quFXCIsXG4gIFwic3Vic2V0bmVxXCI6IFwi4oqKXCIsXG4gIFwic3Vic2V0bmVxcVwiOiBcIuKri1wiLFxuICBcInN1YnNpbVwiOiBcIuKrh1wiLFxuICBcInN1YnN1YlwiOiBcIuKrlVwiLFxuICBcInN1YnN1cFwiOiBcIuKrk1wiLFxuICBcInN1Y2NcIjogXCLiibtcIixcbiAgXCJzdWNjYXBwcm94XCI6IFwi4qq4XCIsXG4gIFwic3VjY2N1cmx5ZXFcIjogXCLiib1cIixcbiAgXCJzdWNjZXFcIjogXCLiqrBcIixcbiAgXCJzdWNjbmFwcHJveFwiOiBcIuKqulwiLFxuICBcInN1Y2NuZXFxXCI6IFwi4qq2XCIsXG4gIFwic3VjY25zaW1cIjogXCLii6lcIixcbiAgXCJzdWNjc2ltXCI6IFwi4om/XCIsXG4gIFwic3VtXCI6IFwi4oiRXCIsXG4gIFwic3VuZ1wiOiBcIuKZqlwiLFxuICBcInN1cFwiOiBcIuKKg1wiLFxuICBcInN1cDFcIjogXCLCuVwiLFxuICBcInN1cDJcIjogXCLCslwiLFxuICBcInN1cDNcIjogXCLCs1wiLFxuICBcInN1cEVcIjogXCLiq4ZcIixcbiAgXCJzdXBkb3RcIjogXCLiqr5cIixcbiAgXCJzdXBkc3ViXCI6IFwi4quYXCIsXG4gIFwic3VwZVwiOiBcIuKKh1wiLFxuICBcInN1cGVkb3RcIjogXCLiq4RcIixcbiAgXCJzdXBoc29sXCI6IFwi4p+JXCIsXG4gIFwic3VwaHN1YlwiOiBcIuKrl1wiLFxuICBcInN1cGxhcnJcIjogXCLipbtcIixcbiAgXCJzdXBtdWx0XCI6IFwi4quCXCIsXG4gIFwic3VwbkVcIjogXCLiq4xcIixcbiAgXCJzdXBuZVwiOiBcIuKKi1wiLFxuICBcInN1cHBsdXNcIjogXCLiq4BcIixcbiAgXCJzdXBzZXRcIjogXCLiioNcIixcbiAgXCJzdXBzZXRlcVwiOiBcIuKKh1wiLFxuICBcInN1cHNldGVxcVwiOiBcIuKrhlwiLFxuICBcInN1cHNldG5lcVwiOiBcIuKKi1wiLFxuICBcInN1cHNldG5lcXFcIjogXCLiq4xcIixcbiAgXCJzdXBzaW1cIjogXCLiq4hcIixcbiAgXCJzdXBzdWJcIjogXCLiq5RcIixcbiAgXCJzdXBzdXBcIjogXCLiq5ZcIixcbiAgXCJzd0FyclwiOiBcIuKHmVwiLFxuICBcInN3YXJoa1wiOiBcIuKkplwiLFxuICBcInN3YXJyXCI6IFwi4oaZXCIsXG4gIFwic3dhcnJvd1wiOiBcIuKGmVwiLFxuICBcInN3bndhclwiOiBcIuKkqlwiLFxuICBcInN6bGlcIjogXCLDn1wiLFxuICBcInN6bGlnXCI6IFwiw59cIixcbiAgXCJ0YXJnZXRcIjogXCLijJZcIixcbiAgXCJ0YXVcIjogXCLPhFwiLFxuICBcInRicmtcIjogXCLijrRcIixcbiAgXCJ0Y2Fyb25cIjogXCLFpVwiLFxuICBcInRjZWRpbFwiOiBcIsWjXCIsXG4gIFwidGN5XCI6IFwi0YJcIixcbiAgXCJ0ZG90XCI6IFwi4oObXCIsXG4gIFwidGVscmVjXCI6IFwi4oyVXCIsXG4gIFwidGZyXCI6IFwi8J2UsVwiLFxuICBcInRoZXJlNFwiOiBcIuKItFwiLFxuICBcInRoZXJlZm9yZVwiOiBcIuKItFwiLFxuICBcInRoZXRhXCI6IFwizrhcIixcbiAgXCJ0aGV0YXN5bVwiOiBcIs+RXCIsXG4gIFwidGhldGF2XCI6IFwiz5FcIixcbiAgXCJ0aGlja2FwcHJveFwiOiBcIuKJiFwiLFxuICBcInRoaWNrc2ltXCI6IFwi4oi8XCIsXG4gIFwidGhpbnNwXCI6IFwi4oCJXCIsXG4gIFwidGhrYXBcIjogXCLiiYhcIixcbiAgXCJ0aGtzaW1cIjogXCLiiLxcIixcbiAgXCJ0aG9yXCI6IFwiw75cIixcbiAgXCJ0aG9yblwiOiBcIsO+XCIsXG4gIFwidGlsZGVcIjogXCLLnFwiLFxuICBcInRpbWVcIjogXCLDl1wiLFxuICBcInRpbWVzXCI6IFwiw5dcIixcbiAgXCJ0aW1lc2JcIjogXCLiiqBcIixcbiAgXCJ0aW1lc2JhclwiOiBcIuKosVwiLFxuICBcInRpbWVzZFwiOiBcIuKosFwiLFxuICBcInRpbnRcIjogXCLiiK1cIixcbiAgXCJ0b2VhXCI6IFwi4qSoXCIsXG4gIFwidG9wXCI6IFwi4oqkXCIsXG4gIFwidG9wYm90XCI6IFwi4oy2XCIsXG4gIFwidG9wY2lyXCI6IFwi4quxXCIsXG4gIFwidG9wZlwiOiBcIvCdlaVcIixcbiAgXCJ0b3Bmb3JrXCI6IFwi4quaXCIsXG4gIFwidG9zYVwiOiBcIuKkqVwiLFxuICBcInRwcmltZVwiOiBcIuKAtFwiLFxuICBcInRyYWRlXCI6IFwi4oSiXCIsXG4gIFwidHJpYW5nbGVcIjogXCLilrVcIixcbiAgXCJ0cmlhbmdsZWRvd25cIjogXCLilr9cIixcbiAgXCJ0cmlhbmdsZWxlZnRcIjogXCLil4NcIixcbiAgXCJ0cmlhbmdsZWxlZnRlcVwiOiBcIuKKtFwiLFxuICBcInRyaWFuZ2xlcVwiOiBcIuKJnFwiLFxuICBcInRyaWFuZ2xlcmlnaHRcIjogXCLilrlcIixcbiAgXCJ0cmlhbmdsZXJpZ2h0ZXFcIjogXCLiirVcIixcbiAgXCJ0cmlkb3RcIjogXCLil6xcIixcbiAgXCJ0cmllXCI6IFwi4omcXCIsXG4gIFwidHJpbWludXNcIjogXCLiqLpcIixcbiAgXCJ0cmlwbHVzXCI6IFwi4qi5XCIsXG4gIFwidHJpc2JcIjogXCLip41cIixcbiAgXCJ0cml0aW1lXCI6IFwi4qi7XCIsXG4gIFwidHJwZXppdW1cIjogXCLij6JcIixcbiAgXCJ0c2NyXCI6IFwi8J2TiVwiLFxuICBcInRzY3lcIjogXCLRhlwiLFxuICBcInRzaGN5XCI6IFwi0ZtcIixcbiAgXCJ0c3Ryb2tcIjogXCLFp1wiLFxuICBcInR3aXh0XCI6IFwi4omsXCIsXG4gIFwidHdvaGVhZGxlZnRhcnJvd1wiOiBcIuKGnlwiLFxuICBcInR3b2hlYWRyaWdodGFycm93XCI6IFwi4oagXCIsXG4gIFwidUFyclwiOiBcIuKHkVwiLFxuICBcInVIYXJcIjogXCLipaNcIixcbiAgXCJ1YWN1dFwiOiBcIsO6XCIsXG4gIFwidWFjdXRlXCI6IFwiw7pcIixcbiAgXCJ1YXJyXCI6IFwi4oaRXCIsXG4gIFwidWJyY3lcIjogXCLRnlwiLFxuICBcInVicmV2ZVwiOiBcIsWtXCIsXG4gIFwidWNpclwiOiBcIsO7XCIsXG4gIFwidWNpcmNcIjogXCLDu1wiLFxuICBcInVjeVwiOiBcItGDXCIsXG4gIFwidWRhcnJcIjogXCLih4VcIixcbiAgXCJ1ZGJsYWNcIjogXCLFsVwiLFxuICBcInVkaGFyXCI6IFwi4qWuXCIsXG4gIFwidWZpc2h0XCI6IFwi4qW+XCIsXG4gIFwidWZyXCI6IFwi8J2UslwiLFxuICBcInVncmF2XCI6IFwiw7lcIixcbiAgXCJ1Z3JhdmVcIjogXCLDuVwiLFxuICBcInVoYXJsXCI6IFwi4oa/XCIsXG4gIFwidWhhcnJcIjogXCLihr5cIixcbiAgXCJ1aGJsa1wiOiBcIuKWgFwiLFxuICBcInVsY29yblwiOiBcIuKMnFwiLFxuICBcInVsY29ybmVyXCI6IFwi4oycXCIsXG4gIFwidWxjcm9wXCI6IFwi4oyPXCIsXG4gIFwidWx0cmlcIjogXCLil7hcIixcbiAgXCJ1bWFjclwiOiBcIsWrXCIsXG4gIFwidW1cIjogXCLCqFwiLFxuICBcInVtbFwiOiBcIsKoXCIsXG4gIFwidW9nb25cIjogXCLFs1wiLFxuICBcInVvcGZcIjogXCLwnZWmXCIsXG4gIFwidXBhcnJvd1wiOiBcIuKGkVwiLFxuICBcInVwZG93bmFycm93XCI6IFwi4oaVXCIsXG4gIFwidXBoYXJwb29ubGVmdFwiOiBcIuKGv1wiLFxuICBcInVwaGFycG9vbnJpZ2h0XCI6IFwi4oa+XCIsXG4gIFwidXBsdXNcIjogXCLiio5cIixcbiAgXCJ1cHNpXCI6IFwiz4VcIixcbiAgXCJ1cHNpaFwiOiBcIs+SXCIsXG4gIFwidXBzaWxvblwiOiBcIs+FXCIsXG4gIFwidXB1cGFycm93c1wiOiBcIuKHiFwiLFxuICBcInVyY29yblwiOiBcIuKMnVwiLFxuICBcInVyY29ybmVyXCI6IFwi4oydXCIsXG4gIFwidXJjcm9wXCI6IFwi4oyOXCIsXG4gIFwidXJpbmdcIjogXCLFr1wiLFxuICBcInVydHJpXCI6IFwi4pe5XCIsXG4gIFwidXNjclwiOiBcIvCdk4pcIixcbiAgXCJ1dGRvdFwiOiBcIuKLsFwiLFxuICBcInV0aWxkZVwiOiBcIsWpXCIsXG4gIFwidXRyaVwiOiBcIuKWtVwiLFxuICBcInV0cmlmXCI6IFwi4pa0XCIsXG4gIFwidXVhcnJcIjogXCLih4hcIixcbiAgXCJ1dW1cIjogXCLDvFwiLFxuICBcInV1bWxcIjogXCLDvFwiLFxuICBcInV3YW5nbGVcIjogXCLipqdcIixcbiAgXCJ2QXJyXCI6IFwi4oeVXCIsXG4gIFwidkJhclwiOiBcIuKrqFwiLFxuICBcInZCYXJ2XCI6IFwi4qupXCIsXG4gIFwidkRhc2hcIjogXCLiiqhcIixcbiAgXCJ2YW5ncnRcIjogXCLippxcIixcbiAgXCJ2YXJlcHNpbG9uXCI6IFwiz7VcIixcbiAgXCJ2YXJrYXBwYVwiOiBcIs+wXCIsXG4gIFwidmFybm90aGluZ1wiOiBcIuKIhVwiLFxuICBcInZhcnBoaVwiOiBcIs+VXCIsXG4gIFwidmFycGlcIjogXCLPllwiLFxuICBcInZhcnByb3B0b1wiOiBcIuKInVwiLFxuICBcInZhcnJcIjogXCLihpVcIixcbiAgXCJ2YXJyaG9cIjogXCLPsVwiLFxuICBcInZhcnNpZ21hXCI6IFwiz4JcIixcbiAgXCJ2YXJzdWJzZXRuZXFcIjogXCLiiorvuIBcIixcbiAgXCJ2YXJzdWJzZXRuZXFxXCI6IFwi4quL77iAXCIsXG4gIFwidmFyc3Vwc2V0bmVxXCI6IFwi4oqL77iAXCIsXG4gIFwidmFyc3Vwc2V0bmVxcVwiOiBcIuKrjO+4gFwiLFxuICBcInZhcnRoZXRhXCI6IFwiz5FcIixcbiAgXCJ2YXJ0cmlhbmdsZWxlZnRcIjogXCLiirJcIixcbiAgXCJ2YXJ0cmlhbmdsZXJpZ2h0XCI6IFwi4oqzXCIsXG4gIFwidmN5XCI6IFwi0LJcIixcbiAgXCJ2ZGFzaFwiOiBcIuKKolwiLFxuICBcInZlZVwiOiBcIuKIqFwiLFxuICBcInZlZWJhclwiOiBcIuKKu1wiLFxuICBcInZlZWVxXCI6IFwi4omaXCIsXG4gIFwidmVsbGlwXCI6IFwi4ouuXCIsXG4gIFwidmVyYmFyXCI6IFwifFwiLFxuICBcInZlcnRcIjogXCJ8XCIsXG4gIFwidmZyXCI6IFwi8J2Us1wiLFxuICBcInZsdHJpXCI6IFwi4oqyXCIsXG4gIFwidm5zdWJcIjogXCLiioLig5JcIixcbiAgXCJ2bnN1cFwiOiBcIuKKg+KDklwiLFxuICBcInZvcGZcIjogXCLwnZWnXCIsXG4gIFwidnByb3BcIjogXCLiiJ1cIixcbiAgXCJ2cnRyaVwiOiBcIuKKs1wiLFxuICBcInZzY3JcIjogXCLwnZOLXCIsXG4gIFwidnN1Ym5FXCI6IFwi4quL77iAXCIsXG4gIFwidnN1Ym5lXCI6IFwi4oqK77iAXCIsXG4gIFwidnN1cG5FXCI6IFwi4quM77iAXCIsXG4gIFwidnN1cG5lXCI6IFwi4oqL77iAXCIsXG4gIFwidnppZ3phZ1wiOiBcIuKmmlwiLFxuICBcIndjaXJjXCI6IFwixbVcIixcbiAgXCJ3ZWRiYXJcIjogXCLiqZ9cIixcbiAgXCJ3ZWRnZVwiOiBcIuKIp1wiLFxuICBcIndlZGdlcVwiOiBcIuKJmVwiLFxuICBcIndlaWVycFwiOiBcIuKEmFwiLFxuICBcIndmclwiOiBcIvCdlLRcIixcbiAgXCJ3b3BmXCI6IFwi8J2VqFwiLFxuICBcIndwXCI6IFwi4oSYXCIsXG4gIFwid3JcIjogXCLiiYBcIixcbiAgXCJ3cmVhdGhcIjogXCLiiYBcIixcbiAgXCJ3c2NyXCI6IFwi8J2TjFwiLFxuICBcInhjYXBcIjogXCLii4JcIixcbiAgXCJ4Y2lyY1wiOiBcIuKXr1wiLFxuICBcInhjdXBcIjogXCLii4NcIixcbiAgXCJ4ZHRyaVwiOiBcIuKWvVwiLFxuICBcInhmclwiOiBcIvCdlLVcIixcbiAgXCJ4aEFyclwiOiBcIuKfulwiLFxuICBcInhoYXJyXCI6IFwi4p+3XCIsXG4gIFwieGlcIjogXCLOvlwiLFxuICBcInhsQXJyXCI6IFwi4p+4XCIsXG4gIFwieGxhcnJcIjogXCLin7VcIixcbiAgXCJ4bWFwXCI6IFwi4p+8XCIsXG4gIFwieG5pc1wiOiBcIuKLu1wiLFxuICBcInhvZG90XCI6IFwi4qiAXCIsXG4gIFwieG9wZlwiOiBcIvCdlalcIixcbiAgXCJ4b3BsdXNcIjogXCLiqIFcIixcbiAgXCJ4b3RpbWVcIjogXCLiqIJcIixcbiAgXCJ4ckFyclwiOiBcIuKfuVwiLFxuICBcInhyYXJyXCI6IFwi4p+2XCIsXG4gIFwieHNjclwiOiBcIvCdk41cIixcbiAgXCJ4c3FjdXBcIjogXCLiqIZcIixcbiAgXCJ4dXBsdXNcIjogXCLiqIRcIixcbiAgXCJ4dXRyaVwiOiBcIuKWs1wiLFxuICBcInh2ZWVcIjogXCLii4FcIixcbiAgXCJ4d2VkZ2VcIjogXCLii4BcIixcbiAgXCJ5YWN1dFwiOiBcIsO9XCIsXG4gIFwieWFjdXRlXCI6IFwiw71cIixcbiAgXCJ5YWN5XCI6IFwi0Y9cIixcbiAgXCJ5Y2lyY1wiOiBcIsW3XCIsXG4gIFwieWN5XCI6IFwi0YtcIixcbiAgXCJ5ZVwiOiBcIsKlXCIsXG4gIFwieWVuXCI6IFwiwqVcIixcbiAgXCJ5ZnJcIjogXCLwnZS2XCIsXG4gIFwieWljeVwiOiBcItGXXCIsXG4gIFwieW9wZlwiOiBcIvCdlapcIixcbiAgXCJ5c2NyXCI6IFwi8J2TjlwiLFxuICBcInl1Y3lcIjogXCLRjlwiLFxuICBcInl1bVwiOiBcIsO/XCIsXG4gIFwieXVtbFwiOiBcIsO/XCIsXG4gIFwiemFjdXRlXCI6IFwixbpcIixcbiAgXCJ6Y2Fyb25cIjogXCLFvlwiLFxuICBcInpjeVwiOiBcItC3XCIsXG4gIFwiemRvdFwiOiBcIsW8XCIsXG4gIFwiemVldHJmXCI6IFwi4oSoXCIsXG4gIFwiemV0YVwiOiBcIs62XCIsXG4gIFwiemZyXCI6IFwi8J2Ut1wiLFxuICBcInpoY3lcIjogXCLQtlwiLFxuICBcInppZ3JhcnJcIjogXCLih51cIixcbiAgXCJ6b3BmXCI6IFwi8J2Vq1wiLFxuICBcInpzY3JcIjogXCLwnZOPXCIsXG4gIFwiendqXCI6IFwi4oCNXCIsXG4gIFwiendualwiOiBcIuKAjFwiXG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwiMFwiOiBcIu+/vVwiLFxuICBcIjEyOFwiOiBcIuKCrFwiLFxuICBcIjEzMFwiOiBcIuKAmlwiLFxuICBcIjEzMVwiOiBcIsaSXCIsXG4gIFwiMTMyXCI6IFwi4oCeXCIsXG4gIFwiMTMzXCI6IFwi4oCmXCIsXG4gIFwiMTM0XCI6IFwi4oCgXCIsXG4gIFwiMTM1XCI6IFwi4oChXCIsXG4gIFwiMTM2XCI6IFwiy4ZcIixcbiAgXCIxMzdcIjogXCLigLBcIixcbiAgXCIxMzhcIjogXCLFoFwiLFxuICBcIjEzOVwiOiBcIuKAuVwiLFxuICBcIjE0MFwiOiBcIsWSXCIsXG4gIFwiMTQyXCI6IFwixb1cIixcbiAgXCIxNDVcIjogXCLigJhcIixcbiAgXCIxNDZcIjogXCLigJlcIixcbiAgXCIxNDdcIjogXCLigJxcIixcbiAgXCIxNDhcIjogXCLigJ1cIixcbiAgXCIxNDlcIjogXCLigKJcIixcbiAgXCIxNTBcIjogXCLigJNcIixcbiAgXCIxNTFcIjogXCLigJRcIixcbiAgXCIxNTJcIjogXCLLnFwiLFxuICBcIjE1M1wiOiBcIuKEolwiLFxuICBcIjE1NFwiOiBcIsWhXCIsXG4gIFwiMTU1XCI6IFwi4oC6XCIsXG4gIFwiMTU2XCI6IFwixZNcIixcbiAgXCIxNThcIjogXCLFvlwiLFxuICBcIjE1OVwiOiBcIsW4XCJcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFscGhhYmV0aWNhbCA9IHJlcXVpcmUoJ2lzLWFscGhhYmV0aWNhbCcpO1xudmFyIGRlY2ltYWwgPSByZXF1aXJlKCdpcy1kZWNpbWFsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYWxwaGFudW1lcmljYWw7XG5cbi8qIENoZWNrIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY29kZSwgb3IgdGhlIGNoYXJhY3RlclxuICogY29kZSBhdCB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpcyBhbHBoYW51bWVyaWNhbC4gKi9cbmZ1bmN0aW9uIGFscGhhbnVtZXJpY2FsKGNoYXJhY3Rlcikge1xuICByZXR1cm4gYWxwaGFiZXRpY2FsKGNoYXJhY3RlcikgfHwgZGVjaW1hbChjaGFyYWN0ZXIpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhleGFkZWNpbWFsO1xuXG4vKiBDaGVjayBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUsIG9yIHRoZSBjaGFyYWN0ZXJcbiAqIGNvZGUgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciwgaXMgaGV4YWRlY2ltYWwuICovXG5mdW5jdGlvbiBoZXhhZGVjaW1hbChjaGFyYWN0ZXIpIHtcbiAgdmFyIGNvZGUgPSB0eXBlb2YgY2hhcmFjdGVyID09PSAnc3RyaW5nJyA/XG4gICAgY2hhcmFjdGVyLmNoYXJDb2RlQXQoMCkgOiBjaGFyYWN0ZXI7XG5cbiAgcmV0dXJuIChjb2RlID49IDk3IC8qIGEgKi8gJiYgY29kZSA8PSAxMDIgLyogeiAqLykgfHxcbiAgICAoY29kZSA+PSA2NSAvKiBBICovICYmIGNvZGUgPD0gNzAgLyogWiAqLykgfHxcbiAgICAoY29kZSA+PSA0OCAvKiBBICovICYmIGNvZGUgPD0gNTcgLyogWiAqLyk7XG59XG4iLCIvKiFcbiAqIHJlcGVhdC1zdHJpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3JlcGVhdC1zdHJpbmc+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXN1bHRzIGNhY2hlXG4gKi9cblxudmFyIHJlcyA9ICcnO1xudmFyIGNhY2hlO1xuXG4vKipcbiAqIEV4cG9zZSBgcmVwZWF0YFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVwZWF0O1xuXG4vKipcbiAqIFJlcGVhdCB0aGUgZ2l2ZW4gYHN0cmluZ2AgdGhlIHNwZWNpZmllZCBgbnVtYmVyYFxuICogb2YgdGltZXMuXG4gKlxuICogKipFeGFtcGxlOioqXG4gKlxuICogYGBganNcbiAqIHZhciByZXBlYXQgPSByZXF1aXJlKCdyZXBlYXQtc3RyaW5nJyk7XG4gKiByZXBlYXQoJ0EnLCA1KTtcbiAqIC8vPT4gQUFBQUFcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyaW5nYCBUaGUgc3RyaW5nIHRvIHJlcGVhdFxuICogQHBhcmFtIHtOdW1iZXJ9IGBudW1iZXJgIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ30gUmVwZWF0ZWQgc3RyaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHIsIG51bSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBhIHN0cmluZycpO1xuICB9XG5cbiAgLy8gY292ZXIgY29tbW9uLCBxdWljayB1c2UgY2FzZXNcbiAgaWYgKG51bSA9PT0gMSkgcmV0dXJuIHN0cjtcbiAgaWYgKG51bSA9PT0gMikgcmV0dXJuIHN0ciArIHN0cjtcblxuICB2YXIgbWF4ID0gc3RyLmxlbmd0aCAqIG51bTtcbiAgaWYgKGNhY2hlICE9PSBzdHIgfHwgdHlwZW9mIGNhY2hlID09PSAndW5kZWZpbmVkJykge1xuICAgIGNhY2hlID0gc3RyO1xuICAgIHJlcyA9ICcnO1xuICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPj0gbWF4KSB7XG4gICAgcmV0dXJuIHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgfVxuXG4gIHdoaWxlIChtYXggPiByZXMubGVuZ3RoICYmIG51bSA+IDEpIHtcbiAgICBpZiAobnVtICYgMSkge1xuICAgICAgcmVzICs9IHN0cjtcbiAgICB9XG5cbiAgICBudW0gPj49IDE7XG4gICAgc3RyICs9IHN0cjtcbiAgfVxuXG4gIHJlcyArPSBzdHI7XG4gIHJlcyA9IHJlcy5zdWJzdHIoMCwgbWF4KTtcbiAgcmV0dXJuIHJlcztcbn1cbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSBzdGF0ZS10b2dnbGVcbiAqIEBmaWxlb3ZlcnZpZXcgRW50ZXIvZXhpdCBhIHN0YXRlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50LWVudiBjb21tb25qcyAqL1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc3RhdGUgYHRvZ2dsZXJgOiBhIGZ1bmN0aW9uIHdoaWNoIGludmVyc2VzXG4gKiBgcHJvcGVydHlgIGluIGNvbnRleHQgYmFzZWQgb24gaXRzIGN1cnJlbnQgdmFsdWUuXG4gKiBUaGUgYnkgYHRvZ2dsZXJgIHJldHVybmVkIGZ1bmN0aW9uIHJlc3RvcmVzIHRoYXQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFByb3BlcnR5IHRvIHRvZ2dsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3RhdGUgLSBEZWZhdWx0IHN0YXRlLlxuICogQHBhcmFtIHtPYmplY3Q/fSBbY3R4XSAtIENvbnRleHQgb2JqZWN0LlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gRW50ZXIuXG4gKi9cbmZ1bmN0aW9uIGZhY3Rvcnkoa2V5LCBzdGF0ZSwgY3R4KSB7XG4gIC8qKlxuICAgKiBFbnRlciBhIHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gLSBFeGl0IHN0YXRlLlxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29udGV4dCA9IGN0eCB8fCB0aGlzO1xuICAgIHZhciBjdXJyZW50ID0gY29udGV4dFtrZXldO1xuXG4gICAgY29udGV4dFtrZXldID0gIXN0YXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHN0YXRlIHRvIGl0cyB2YWx1ZSBiZWZvcmUgZW50ZXJpbmcuXG4gICAgICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IGN1cnJlbnQ7XG4gICAgfTtcbiAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0cmltVHJhaWxpbmdMaW5lcztcblxudmFyIGxpbmUgPSAnXFxuJztcblxuLyogUmVtb3ZlIGZpbmFsIG5ld2xpbmUgY2hhcmFjdGVycyBmcm9tIGB2YWx1ZWAuICovXG5mdW5jdGlvbiB0cmltVHJhaWxpbmdMaW5lcyh2YWx1ZSkge1xuICB2YXIgdmFsID0gU3RyaW5nKHZhbHVlKTtcbiAgdmFyIGluZGV4ID0gdmFsLmxlbmd0aDtcblxuICB3aGlsZSAodmFsLmNoYXJBdCgtLWluZGV4KSA9PT0gbGluZSkgeyAvKiBlbXB0eSAqLyB9XG5cbiAgcmV0dXJuIHZhbC5zbGljZSgwLCBpbmRleCArIDEpO1xufVxuIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE1IFRpdHVzIFdvcm1lclxuICogQGxpY2Vuc2UgTUlUXG4gKiBAbW9kdWxlIHVuaGVyaXRcbiAqIEBmaWxlb3ZlcnZpZXcgQ3JlYXRlIGEgY3VzdG9tIGNvbnN0cnVjdG9yIHdoaWNoIGNhbiBiZSBtb2RpZmllZFxuICogICB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3JpZ2luYWwgY2xhc3MuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBEZXBlbmRlbmNpZXMuICovXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB1bmhlcml0O1xuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBjb25zdHJ1Y3RvciB3aGljaCBjYW4gYmUgbW9kaWZpZWRcbiAqIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjbGFzcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBTdXBlciAtIFN1cGVyLWNsYXNzLlxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29uc3RydWN0b3IgYWN0aW5nIGxpa2UgYFN1cGVyYCxcbiAqICAgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbFxuICogICBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gdW5oZXJpdChTdXBlcikge1xuICB2YXIgcmVzdWx0O1xuICB2YXIga2V5O1xuICB2YXIgdmFsdWU7XG5cbiAgaW5oZXJpdHMoT2YsIFN1cGVyKTtcbiAgaW5oZXJpdHMoRnJvbSwgT2YpO1xuXG4gIC8qIENsb25lIHZhbHVlcy4gKi9cbiAgcmVzdWx0ID0gT2YucHJvdG90eXBlO1xuXG4gIGZvciAoa2V5IGluIHJlc3VsdCkge1xuICAgIHZhbHVlID0gcmVzdWx0W2tleV07XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSAnY29uY2F0JyBpbiB2YWx1ZSA/IHZhbHVlLmNvbmNhdCgpIDogeHRlbmQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPZjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgYWNjZXB0aW5nIGEgc2luZ2xlIGFyZ3VtZW50LFxuICAgKiB3aGljaCBpdHNlbGYgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgKi9cbiAgZnVuY3Rpb24gRnJvbShwYXJhbWV0ZXJzKSB7XG4gICAgcmV0dXJuIFN1cGVyLmFwcGx5KHRoaXMsIHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGFjY2VwdGluZyB2YXJpYWRpYyBhcmd1bWVudHMuXG4gICAqL1xuICBmdW5jdGlvbiBPZigpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2YpKSB7XG4gICAgICByZXR1cm4gbmV3IEZyb20oYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB2aXNpdCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtdmlzaXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZW1vdmVQb3NpdGlvbjtcblxuLyogUmVtb3ZlIGBwb3NpdGlvbmBzIGZyb20gYHRyZWVgLiAqL1xuZnVuY3Rpb24gcmVtb3ZlUG9zaXRpb24obm9kZSwgZm9yY2UpIHtcbiAgdmlzaXQobm9kZSwgZm9yY2UgPyBoYXJkIDogc29mdCk7XG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBoYXJkKG5vZGUpIHtcbiAgZGVsZXRlIG5vZGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNvZnQobm9kZSkge1xuICBub2RlLnBvc2l0aW9uID0gdW5kZWZpbmVkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBFeHBvc2UuICovXG5tb2R1bGUuZXhwb3J0cyA9IHZpc2l0O1xuXG4vKiBWaXNpdC4gKi9cbmZ1bmN0aW9uIHZpc2l0KHRyZWUsIHR5cGUsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3I7XG4gICAgdmlzaXRvciA9IHR5cGU7XG4gICAgdHlwZSA9IG51bGw7XG4gIH1cblxuICBvbmUodHJlZSk7XG5cbiAgLyogVmlzaXQgYSBzaW5nbGUgbm9kZS4gKi9cbiAgZnVuY3Rpb24gb25lKG5vZGUsIGluZGV4LCBwYXJlbnQpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaW5kZXggPSBpbmRleCB8fCAocGFyZW50ID8gMCA6IG51bGwpO1xuXG4gICAgaWYgKCF0eXBlIHx8IG5vZGUudHlwZSA9PT0gdHlwZSkge1xuICAgICAgcmVzdWx0ID0gdmlzaXRvcihub2RlLCBpbmRleCwgcGFyZW50IHx8IG51bGwpO1xuICAgIH1cblxuICAgIGlmIChub2RlLmNoaWxkcmVuICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBhbGwobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qIFZpc2l0IGNoaWxkcmVuIGluIGBwYXJlbnRgLiAqL1xuICBmdW5jdGlvbiBhbGwoY2hpbGRyZW4sIHBhcmVudCkge1xuICAgIHZhciBzdGVwID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgICB2YXIgbWF4ID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHZhciBtaW4gPSAtMTtcbiAgICB2YXIgaW5kZXggPSAocmV2ZXJzZSA/IG1heCA6IG1pbikgKyBzdGVwO1xuICAgIHZhciBjaGlsZDtcblxuICAgIHdoaWxlIChpbmRleCA+IG1pbiAmJiBpbmRleCA8IG1heCkge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07XG5cbiAgICAgIGlmIChjaGlsZCAmJiBvbmUoY2hpbGQsIGluZGV4LCBwYXJlbnQpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ICs9IHN0ZXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5O1xuXG4vKiBGYWN0b3J5LiAqL1xuZnVuY3Rpb24gZmFjdG9yeShmaWxlKSB7XG4gIHZhciBjb250ZW50cyA9IGluZGljZXMoU3RyaW5nKGZpbGUpKTtcblxuICByZXR1cm4ge1xuICAgIHRvUG9zaXRpb246IG9mZnNldFRvUG9zaXRpb25GYWN0b3J5KGNvbnRlbnRzKSxcbiAgICB0b09mZnNldDogcG9zaXRpb25Ub09mZnNldEZhY3RvcnkoY29udGVudHMpXG4gIH07XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IHRoZSBsaW5lIGFuZCBjb2x1bW4tYmFzZWQgYHBvc2l0aW9uYCBmb3JcbiAqIGBvZmZzZXRgIGluIHRoZSBib3VuZCBpbmRpY2VzLiAqL1xuZnVuY3Rpb24gb2Zmc2V0VG9Qb3NpdGlvbkZhY3RvcnkoaW5kaWNlcykge1xuICByZXR1cm4gb2Zmc2V0VG9Qb3NpdGlvbjtcblxuICAvKiBHZXQgdGhlIGxpbmUgYW5kIGNvbHVtbi1iYXNlZCBgcG9zaXRpb25gIGZvclxuICAgKiBgb2Zmc2V0YCBpbiB0aGUgYm91bmQgaW5kaWNlcy4gKi9cbiAgZnVuY3Rpb24gb2Zmc2V0VG9Qb3NpdGlvbihvZmZzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICB2YXIgbGVuZ3RoID0gaW5kaWNlcy5sZW5ndGg7XG5cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaW5kaWNlc1tpbmRleF0gPiBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiBpbmRleCArIDEsXG4gICAgICAgICAgY29sdW1uOiAob2Zmc2V0IC0gKGluZGljZXNbaW5kZXggLSAxXSB8fCAwKSkgKyAxLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IHRoZSBgb2Zmc2V0YCBmb3IgYSBsaW5lIGFuZCBjb2x1bW4tYmFzZWRcbiAqIGBwb3NpdGlvbmAgaW4gdGhlIGJvdW5kIGluZGljZXMuICovXG5mdW5jdGlvbiBwb3NpdGlvblRvT2Zmc2V0RmFjdG9yeShpbmRpY2VzKSB7XG4gIHJldHVybiBwb3NpdGlvblRvT2Zmc2V0O1xuXG4gIC8qIEdldCB0aGUgYG9mZnNldGAgZm9yIGEgbGluZSBhbmQgY29sdW1uLWJhc2VkXG4gICAqIGBwb3NpdGlvbmAgaW4gdGhlIGJvdW5kIGluZGljZXMuICovXG4gIGZ1bmN0aW9uIHBvc2l0aW9uVG9PZmZzZXQocG9zaXRpb24pIHtcbiAgICB2YXIgbGluZSA9IHBvc2l0aW9uICYmIHBvc2l0aW9uLmxpbmU7XG4gICAgdmFyIGNvbHVtbiA9IHBvc2l0aW9uICYmIHBvc2l0aW9uLmNvbHVtbjtcblxuICAgIGlmICghaXNOYU4obGluZSkgJiYgIWlzTmFOKGNvbHVtbikgJiYgbGluZSAtIDEgaW4gaW5kaWNlcykge1xuICAgICAgcmV0dXJuICgoaW5kaWNlc1tsaW5lIC0gMl0gfHwgMCkgKyBjb2x1bW4gLSAxKSB8fCAwO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufVxuXG4vKiBHZXQgaW5kaWNlcyBvZiBsaW5lLWJyZWFrcyBpbiBgdmFsdWVgLiAqL1xuZnVuY3Rpb24gaW5kaWNlcyh2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IHZhbHVlLmluZGV4T2YoJ1xcbicpO1xuXG4gIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcbiAgICByZXN1bHQucHVzaChpbmRleCArIDEpO1xuICAgIGluZGV4ID0gdmFsdWUuaW5kZXhPZignXFxuJywgaW5kZXggKyAxKTtcbiAgfVxuXG4gIHJlc3VsdC5wdXNoKHZhbHVlLmxlbmd0aCArIDEpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdW5oZXJpdCA9IHJlcXVpcmUoJ3VuaGVyaXQnKTtcbnZhciB4dGVuZCA9IHJlcXVpcmUoJ3h0ZW5kJyk7XG52YXIgUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvcGFyc2VyLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG5wYXJzZS5QYXJzZXIgPSBQYXJzZXI7XG5cbmZ1bmN0aW9uIHBhcnNlKG9wdGlvbnMpIHtcbiAgdmFyIExvY2FsID0gdW5oZXJpdChQYXJzZXIpO1xuICBMb2NhbC5wcm90b3R5cGUub3B0aW9ucyA9IHh0ZW5kKExvY2FsLnByb3RvdHlwZS5vcHRpb25zLCB0aGlzLmRhdGEoJ3NldHRpbmdzJyksIG9wdGlvbnMpO1xuICB0aGlzLlBhcnNlciA9IExvY2FsO1xufVxuIl19
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
module.exports = require('./lib/index.js');
},{"./lib/index.js":28}],2:[function(require,module,exports){
'use strict';
module.exports = all;
var trim = require('trim');
var one = require('./one');
/* Transform the children of `parent`. */
function all(h, parent) {
var nodes = parent.children || [];
var length = nodes.length;
var values = [];
var index = -1;
var result;
var head;
while (++index < length) {
result = one(h, nodes[index], parent);
if (result) {
if (index && nodes[index - 1].type === 'break') {
if (result.value) {
result.value = trim.left(result.value);
}
head = result.children && result.children[0];
if (head && head.value) {
head.value = trim.left(head.value);
}
}
values = values.concat(result);
}
}
return values;
}
},{"./one":29,"trim":37}],3:[function(require,module,exports){
'use strict';
module.exports = failsafe;
var u = require('unist-builder');
var all = require('./all');
/* Return the content of a reference without definition
* as markdown. */
function failsafe(h, node, definition) {
var subtype = node.referenceType;
if (subtype !== 'collapsed' && subtype !== 'full' && !definition) {
if (node.type === 'imageReference') {
return u('text', '![' + node.alt + ']');
}
return [u('text', '[')].concat(all(h, node), u('text', ']'));
}
}
},{"./all":2,"unist-builder":38}],4:[function(require,module,exports){
'use strict';
module.exports = generateFootnotes;
var thematicBreak = require('./handlers/thematic-break');
var list = require('./handlers/list');
var wrap = require('./wrap');
/* Transform all footnote definitions, if any. */
function generateFootnotes(h) {
var footnotes = h.footnotes;
var length = footnotes.length;
var index = -1;
var listItems = [];
var def;
if (!length) {
return null;
}
while (++index < length) {
def = footnotes[index];
listItems[index] = {
type: 'listItem',
data: {hProperties: {id: 'fn-' + def.identifier}},
children: def.children.concat({
type: 'link',
url: '#fnref-' + def.identifier,
data: {hProperties: {className: ['footnote-backref']}},
children: [{
type: 'text',
value: '↩'
}]
}),
position: def.position
};
}
return h(null, 'div', {
className: ['footnotes']
}, wrap([
thematicBreak(h),
list(h, {
type: 'list',
ordered: true,
children: listItems
})
], true));
}
},{"./handlers/list":21,"./handlers/thematic-break":27,"./wrap":30}],5:[function(require,module,exports){
'use strict';
module.exports = blockquote;
var wrap = require('../wrap');
var all = require('../all');
/* Transform a block quote. */
function blockquote(h, node) {
return h(node, 'blockquote', wrap(all(h, node), true));
}
},{"../all":2,"../wrap":30}],6:[function(require,module,exports){
'use strict';
module.exports = hardBreak;
var u = require('unist-builder');
/* Transform an inline break. */
function hardBreak(h, node) {
return [h(node, 'br'), u('text', '\n')];
}
},{"unist-builder":38}],7:[function(require,module,exports){
'use strict';
module.exports = code;
var detab = require('detab');
var u = require('unist-builder');
/* Transform a code block. */
function code(h, node) {
var value = node.value ? detab(node.value + '\n') : '';
var lang = node.lang && node.lang.match(/^[^ \t]+(?=[ \t]|$)/);
var props = {};
if (lang) {
props.className = ['language-' + lang];
}
return h(node.position, 'pre', [
h(node, 'code', props, [u('text', value)])
]);
}
},{"detab":32,"unist-builder":38}],8:[function(require,module,exports){
'use strict';
module.exports = strikethrough;
var all = require('../all');
/* Transform deletions. */
function strikethrough(h, node) {
return h(node, 'del', all(h, node));
}
},{"../all":2}],9:[function(require,module,exports){
'use strict';
module.exports = emphasis;
var all = require('../all');
/* Transform emphasis. */
function emphasis(h, node) {
return h(node, 'em', all(h, node));
}
},{"../all":2}],10:[function(require,module,exports){
'use strict';
module.exports = footnoteReference;
var u = require('unist-builder');
/* Transform a reference to a footnote. */
function footnoteReference(h, node) {
var identifier = node.identifier;
return h(node.position, 'sup', {id: 'fnref-' + identifier}, [
h(node, 'a', {
href: '#fn-' + identifier,
className: ['footnote-ref']
}, [u('text', identifier)])
]);
}
},{"unist-builder":38}],11:[function(require,module,exports){
'use strict';
module.exports = footnote;
var footnoteReference = require('./footnote-reference');
/* Transform an inline footnote. */
function footnote(h, node) {
var identifiers = [];
var identifier = 1;
var footnotes = h.footnotes;
var length = footnotes.length;
var index = -1;
while (++index < length) {
identifiers[index] = footnotes[index].identifier;
}
while (identifiers.indexOf(String(identifier)) !== -1) {
identifier++;
}
identifier = String(identifier);
footnotes.push({
type: 'footnoteDefinition',
identifier: identifier,
children: node.children,
position: node.position
});
return footnoteReference(h, {
type: 'footnoteReference',
identifier: identifier,
position: node.position
});
}
},{"./footnote-reference":10}],12:[function(require,module,exports){
'use strict';
module.exports = heading;
var all = require('../all');
/* Transform a heading. */
function heading(h, node) {
return h(node, 'h' + node.depth, all(h, node));
}
},{"../all":2}],13:[function(require,module,exports){
'use strict';
module.exports = html;
var u = require('unist-builder');
/* Return either a `raw` node, in dangerous mode, or
* nothing. */
function html(h, node) {
return h.dangerous ? h.augment(node, u('raw', node.value)) : null;
}
},{"unist-builder":38}],14:[function(require,module,exports){
'use strict';
module.exports = imageReference;
var normalize = require('normalize-uri');
var failsafe = require('../failsafe');
/* Transform a reference to an image. */
function imageReference(h, node) {
var def = h.definition(node.identifier);
var props = {src: normalize((def && def.url) || ''), alt: node.alt};
if (def && def.title !== null && def.title !== undefined) {
props.title = def.title;
}
return failsafe(h, node, def) || h(node, 'img', props);
}
},{"../failsafe":3,"normalize-uri":35}],15:[function(require,module,exports){
'use strict';
var normalize = require('normalize-uri');
module.exports = image;
/* Transform an image. */
function image(h, node) {
var props = {src: normalize(node.url), alt: node.alt};
if (node.title !== null && node.title !== undefined) {
props.title = node.title;
}
return h(node, 'img', props);
}
},{"normalize-uri":35}],16:[function(require,module,exports){
'use strict';
module.exports = {
blockquote: require('./blockquote'),
break: require('./break'),
code: require('./code'),
delete: require('./delete'),
emphasis: require('./emphasis'),
footnoteReference: require('./footnote-reference'),
footnote: require('./footnote'),
heading: require('./heading'),
html: require('./html'),
imageReference: require('./image-reference'),
image: require('./image'),
inlineCode: require('./inline-code'),
linkReference: require('./link-reference'),
link: require('./link'),
listItem: require('./list-item'),
list: require('./list'),
paragraph: require('./paragraph'),
root: require('./root'),
strong: require('./strong'),
table: require('./table'),
text: require('./text'),
thematicBreak: require('./thematic-break'),
yaml: ignore,
definition: ignore,
footnoteDefinition: ignore
};
/* Return nothing for nodes which are ignored. */
function ignore() {
return null;
}
},{"./blockquote":5,"./break":6,"./code":7,"./delete":8,"./emphasis":9,"./footnote":11,"./footnote-reference":10,"./heading":12,"./html":13,"./image":15,"./image-reference":14,"./inline-code":17,"./link":19,"./link-reference":18,"./list":21,"./list-item":20,"./paragraph":22,"./root":23,"./strong":24,"./table":25,"./text":26,"./thematic-break":27}],17:[function(require,module,exports){
'use strict';
module.exports = inlineCode;
var collapse = require('collapse-white-space');
var u = require('unist-builder');
/* Transform inline code. */
function inlineCode(h, node) {
return h(node, 'code', [u('text', collapse(node.value))]);
}
},{"collapse-white-space":31,"unist-builder":38}],18:[function(require,module,exports){
'use strict';
module.exports = linkReference;
var normalize = require('normalize-uri');
var failsafe = require('../failsafe');
var all = require('../all');
/* Transform a reference to a link. */
function linkReference(h, node) {
var def = h.definition(node.identifier);
var props = {href: normalize((def && def.url) || '')};
if (def && def.title !== null && def.title !== undefined) {
props.title = def.title;
}
return failsafe(h, node, def) || h(node, 'a', props, all(h, node));
}
},{"../all":2,"../failsafe":3,"normalize-uri":35}],19:[function(require,module,exports){
'use strict';
var normalize = require('normalize-uri');
var all = require('../all');
module.exports = link;
/* Transform a link. */
function link(h, node) {
var props = {href: normalize(node.url)};
if (node.title !== null && node.title !== undefined) {
props.title = node.title;
}
return h(node, 'a', props, all(h, node));
}
},{"../all":2,"normalize-uri":35}],20:[function(require,module,exports){
'use strict';
module.exports = listItem;
var u = require('unist-builder');
var wrap = require('../wrap');
var all = require('../all');
/* Transform a list-item. */
function listItem(h, node, parent) {
var children = node.children;
var head = children[0];
var props = {};
var single = false;
var result;
var container;
if ((!parent || !parent.loose) && children.length === 1 && head.type === 'paragraph') {
single = true;
}
result = all(h, single ? head : node);
if (typeof node.checked === 'boolean') {
if (!single && (!head || head.type !== 'paragraph')) {
result.unshift(h(null, 'p', []));
}
container = single ? result : result[0].children;
if (container.length !== 0) {
container.unshift(u('text', ' '));
}
container.unshift(h(null, 'input', {
type: 'checkbox',
checked: node.checked,
disabled: true
}));
/* According to github-markdown-css, this class hides bullet. */
props.className = ['task-list-item'];
}
if (!single && result.length !== 0) {
result = wrap(result, true);
}
return h(node, 'li', props, result);
}
},{"../all":2,"../wrap":30,"unist-builder":38}],21:[function(require,module,exports){
'use strict';
module.exports = list;
var wrap = require('../wrap');
var all = require('../all');
/* Transform a list. */
function list(h, node) {
var props = {};
var name = node.ordered ? 'ol' : 'ul';
if (typeof node.start === 'number' && node.start !== 1) {
props.start = node.start;
}
return h(node, name, props, wrap(all(h, node), true));
}
},{"../all":2,"../wrap":30}],22:[function(require,module,exports){
'use strict';
module.exports = paragraph;
var all = require('../all');
/* Transform a paragraph. */
function paragraph(h, node) {
return h(node, 'p', all(h, node));
}
},{"../all":2}],23:[function(require,module,exports){
'use strict';
module.exports = root;
var u = require('unist-builder');
var wrap = require('../wrap');
var all = require('../all');
/* Transform a `root`. */
function root(h, node) {
return h.augment(node, u('root', wrap(all(h, node))));
}
},{"../all":2,"../wrap":30,"unist-builder":38}],24:[function(require,module,exports){
'use strict';
module.exports = strong;
var all = require('../all');
/* Transform importance. */
function strong(h, node) {
return h(node, 'strong', all(h, node));
}
},{"../all":2}],25:[function(require,module,exports){
'use strict';
module.exports = table;
var position = require('unist-util-position');
var wrap = require('../wrap');
var all = require('../all');
/* Transform a table. */
function table(h, node) {
var rows = node.children;
var index = rows.length;
var align = node.align;
var alignLength = align.length;
var result = [];
var pos;
var row;
var out;
var name;
var cell;
while (index--) {
row = rows[index].children;
name = index === 0 ? 'th' : 'td';
pos = alignLength;
out = [];
while (pos--) {
cell = row[pos];
out[pos] = h(cell, name, {
align: align[pos]
}, cell ? wrap(all(h, cell)) : []);
}
result[index] = h(rows[index], 'tr', wrap(out, true));
}
return h(node, 'table', wrap([
h(result[0].position, 'thead', wrap([result[0]], true)),
h({
start: position.start(result[1]),
end: position.end(result[result.length - 1])
}, 'tbody', wrap(result.slice(1), true))
], true));
}
},{"../all":2,"../wrap":30,"unist-util-position":41}],26:[function(require,module,exports){
'use strict';
module.exports = text;
var u = require('unist-builder');
var trimLines = require('trim-lines');
/* Transform text. */
function text(h, node) {
return h.augment(node, u('text', trimLines(node.value)));
}
},{"trim-lines":36,"unist-builder":38}],27:[function(require,module,exports){
'use strict';
module.exports = thematicBreak;
/* Transform a thematic break / horizontal rule. */
function thematicBreak(h, node) {
return h(node, 'hr');
}
},{}],28:[function(require,module,exports){
'use strict';
module.exports = toHAST;
var xtend = require('xtend');
var u = require('unist-builder');
var visit = require('unist-util-visit');
var position = require('unist-util-position');
var generated = require('unist-util-generated');
var definitions = require('mdast-util-definitions');
var one = require('./one');
var footer = require('./footer');
var handlers = require('./handlers');
/* Factory to transform. */
function factory(tree, options) {
var settings = options || {};
var dangerous = settings.allowDangerousHTML;
h.dangerous = dangerous;
h.definition = definitions(tree, settings);
h.footnotes = [];
h.augment = augment;
h.handlers = xtend(handlers, (settings.handlers || {}));
visit(tree, 'footnoteDefinition', visitor);
return h;
/* Finalise the created `right`, a HAST node, from
* `left`, an MDAST node. */
function augment(left, right) {
var data;
var ctx;
/* Handle `data.hName`, `data.hProperties, `hChildren`. */
if (left && 'data' in left) {
data = left.data;
if (right.type === 'element' && data.hName) {
right.tagName = data.hName;
}
if (right.type === 'element' && data.hProperties) {
right.properties = xtend(right.properties, data.hProperties);
}
if (right.children && data.hChildren) {
right.children = data.hChildren;
}
}
ctx = left && left.position ? left : {position: left};
if (!generated(ctx)) {
right.position = {
start: position.start(ctx),
end: position.end(ctx)
};
}
return right;
}
/* Create an element for a `node`. */
function h(node, tagName, props, children) {
if (
(children === undefined || children === null) &&
typeof props === 'object' &&
'length' in props
) {
children = props;
props = {};
}
return augment(node, {
type: 'element',
tagName: tagName,
properties: props || {},
children: children || []
});
}
function visitor(definition) {
h.footnotes.push(definition);
}
}
/* Transform `tree`, which is an MDAST node, to a HAST node. */
function toHAST(tree, options) {
var h = factory(tree, options);
var node = one(h, tree);
var footnotes = footer(h);
if (node && node.children && footnotes) {
node.children = node.children.concat(u('text', '\n'), footnotes);
}
return node;
}
},{"./footer":4,"./handlers":16,"./one":29,"mdast-util-definitions":34,"unist-builder":38,"unist-util-generated":40,"unist-util-position":41,"unist-util-visit":42,"xtend":43}],29:[function(require,module,exports){
'use strict';
module.exports = one;
var u = require('unist-builder');
var all = require('./all');
var own = {}.hasOwnProperty;
/* Transform an unknown node. */
function unknown(h, node) {
if (text(node)) {
return h.augment(node, u('text', node.value));
}
return h(node, 'div', all(h, node));
}
/* Visit a node. */
function one(h, node, parent) {
var type = node && node.type;
var fn = own.call(h.handlers, type) ? h.handlers[type] : null;
/* Fail on non-nodes. */
if (!type) {
throw new Error('Expected node, got `' + node + '`');
}
return (typeof fn === 'function' ? fn : unknown)(h, node, parent);
}
/* Check if the node should be renderered a text node. */
function text(node) {
var data = node.data || {};
if (own.call(data, 'hName') || own.call(data, 'hProperties') || own.call(data, 'hChildren')) {
return false;
}
return 'value' in node;
}
},{"./all":2,"unist-builder":38}],30:[function(require,module,exports){
'use strict';
module.exports = wrap;
var u = require('unist-builder');
/* Wrap `nodes` with newlines between each entry.
* Optionally adds newlines at the start and end. */
function wrap(nodes, loose) {
var result = [];
var index = -1;
var length = nodes.length;
if (loose) {
result.push(u('text', '\n'));
}
while (++index < length) {
if (index) {
result.push(u('text', '\n'));
}
result.push(nodes[index]);
}
if (loose && nodes.length !== 0) {
result.push(u('text', '\n'));
}
return result;
}
},{"unist-builder":38}],31:[function(require,module,exports){
'use strict';
module.exports = collapse;
/* collapse(' \t\nbar \nbaz\t'); // ' bar baz ' */
function collapse(value) {
return String(value).replace(/\s+/g, ' ');
}
},{}],32:[function(require,module,exports){
'use strict';
module.exports = detab;
var repeat = require('repeat-string');
var TAB = 0x09;
var LF = 0x0A;
var CR = 0x0D;
/* Replace tabs with spaces, being smart about which
* column the tab is at and which size should be used. */
function detab(value, size) {
var string = typeof value === 'string';
var length = string && value.length;
var start = 0;
var index = -1;
var column = -1;
var tabSize = size || 4;
var results = [];
var code;
var add;
if (!string) {
throw new Error('detab expected string');
}
while (++index < length) {
code = value.charCodeAt(index);
if (code === TAB) {
add = tabSize - ((column + 1) % tabSize);
column += add;
results.push(value.slice(start, index) + repeat(' ', add));
start = index + 1;
} else if (code === LF || code === CR) {
column = -1;
} else {
column++;
}
}
results.push(value.slice(start));
return results.join('');
}
},{"repeat-string":33}],33:[function(require,module,exports){
/*!
* repeat-string <https://github.com/jonschlinkert/repeat-string>
*
* Copyright (c) 2014-2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
/**
* Results cache
*/
var res = '';
var cache;
/**
* Expose `repeat`
*/
module.exports = repeat;
/**
* Repeat the given `string` the specified `number`
* of times.
*
* **Example:**
*
* ```js
* var repeat = require('repeat-string');
* repeat('A', 5);
* //=> AAAAA
* ```
*
* @param {String} `string` The string to repeat
* @param {Number} `number` The number of times to repeat the string
* @return {String} Repeated string
* @api public
*/
function repeat(str, num) {
if (typeof str !== 'string') {
throw new TypeError('expected a string');
}
// cover common, quick use cases
if (num === 1) return str;
if (num === 2) return str + str;
var max = str.length * num;
if (cache !== str || typeof cache === 'undefined') {
cache = str;
res = '';
} else if (res.length >= max) {
return res.substr(0, max);
}
while (max > res.length && num > 1) {
if (num & 1) {
res += str;
}
num >>= 1;
str += str;
}
res += str;
res = res.substr(0, max);
return res;
}
},{}],34:[function(require,module,exports){
'use strict';
var visit = require('unist-util-visit');
module.exports = getDefinitionFactory;
var own = {}.hasOwnProperty;
/* Get a definition in `node` by `identifier`. */
function getDefinitionFactory(node, options) {
return getterFactory(gather(node, options));
}
/* Gather all definitions in `node` */
function gather(node, options) {
var cache = {};
if (!node || !node.type) {
throw new Error('mdast-util-definitions expected node');
}
visit(node, 'definition', options && options.commonmark ? commonmark : normal);
return cache;
function commonmark(definition) {
var id = normalise(definition.identifier);
if (!own.call(cache, id)) {
cache[id] = definition;
}
}
function normal(definition) {
cache[normalise(definition.identifier)] = definition;
}
}
/* Factory to get a node from the given definition-cache. */
function getterFactory(cache) {
return getter;
/* Get a node from the bound definition-cache. */
function getter(identifier) {
var id = identifier && normalise(identifier);
return id && own.call(cache, id) ? cache[id] : null;
}
}
function normalise(identifier) {
return identifier.toUpperCase();
}
},{"unist-util-visit":42}],35:[function(require,module,exports){
'use strict';
module.exports = returner;
try {
normalize('');
module.exports = normalize;
} catch (err) {}
/* Normalize `uri`. */
function normalize(uri) {
return encodeURI(decodeURI(uri));
}
/* istanbul ignore next - Fallback, return input. */
function returner(uri) {
return uri;
}
},{}],36:[function(require,module,exports){
'use strict';
module.exports = trimLines;
var ws = /[ \t]*\n+[ \t]*/g;
var newline = '\n';
function trimLines(value) {
return String(value).replace(ws, newline);
}
},{}],37:[function(require,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],38:[function(require,module,exports){
'use strict';
var assign = require('object-assign');
module.exports = function u (type, props, value) {
if (value == null && (typeof props != 'object' || Array.isArray(props))) {
value = props;
props = {};
}
return assign({}, props, { type: String(type) },
value != null && (Array.isArray(value)
? { children: value }
: { value: String(value) }));
};
},{"object-assign":39}],39:[function(require,module,exports){
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
'use strict';
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
module.exports = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
},{}],40:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = generated;
/* Detect if a node was available in the original document. */
function generated(node) {
var position = optional(optional(node).position);
var start = optional(position.start);
var end = optional(position.end);
return !start.line || !start.column || !end.line || !end.column;
}
/* Return `value` if it’s an object, an empty object
* otherwise. */
function optional(value) {
return value && typeof value === 'object' ? value : {};
}
},{}],41:[function(require,module,exports){
'use strict';
/* Expose. */
var position = exports;
position.start = positionFactory('start');
position.end = positionFactory('end');
/* Factory to get a position at `type`. */
function positionFactory(type) {
return pos;
/* Get a position in `node` at a bound `type`. */
function pos(node) {
var pos = (node && node.position && node.position[type]) || {};
return {
line: pos.line || null,
column: pos.column || null,
offset: isNaN(pos.offset) ? null : pos.offset
};
}
}
},{}],42:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = visit;
/* Visit. */
function visit(tree, type, visitor, reverse) {
if (typeof type === 'function') {
reverse = visitor;
visitor = type;
type = null;
}
one(tree);
/* Visit a single node. */
function one(node, index, parent) {
var result;
index = index || (parent ? 0 : null);
if (!type || node.type === type) {
result = visitor(node, index, parent || null);
}
if (node.children && result !== false) {
return all(node.children, node);
}
return result;
}
/* Visit children in `parent`. */
function all(children, parent) {
var step = reverse ? -1 : 1;
var max = children.length;
var min = -1;
var index = (reverse ? max : min) + step;
var child;
while (index > min && index < max) {
child = children[index];
if (child && one(child, index, parent) === false) {
return false;
}
index += step;
}
return true;
}
}
},{}],43:[function(require,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],"remark-rehype":[function(require,module,exports){
'use strict';
var mdast2hast = require('mdast-util-to-hast');
module.exports = remark2rehype;
/* Attacher.
* If a destination is given, runs the destination with
* the new HAST tree (bridge-mode).
* Without destination, returns the HAST tree: further
* plug-ins run on that tree (mutate-mode). */
function remark2rehype(destination, options) {
if (destination && !destination.process) {
options = destination;
destination = null;
}
return destination ? bridge(destination, options) : mutate(options);
}
/* Bridge-mode. Runs the destination with the new HAST
* tree. */
function bridge(destination, options) {
return transformer;
function transformer(node, file, next) {
destination.run(mdast2hast(node, options), file, done);
function done(err) {
next(err);
}
}
}
/* Mutate-mode. Further transformers run on the HAST tree. */
function mutate(options) {
return transformer;
function transformer(node) {
return mdast2hast(node, options);
}
}
},{"mdast-util-to-hast":1}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9hbGwuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9mYWlsc2FmZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2Zvb3Rlci5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Jsb2NrcXVvdGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9icmVhay5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2NvZGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9kZWxldGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9lbXBoYXNpcy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLXJlZmVyZW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2Zvb3Rub3RlLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaGVhZGluZy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2h0bWwuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS1yZWZlcmVuY2UuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9pbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvaW5saW5lLWNvZGUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saW5rLXJlZmVyZW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL2xpbmsuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saXN0LWl0ZW0uanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9oYW5kbGVycy9saXN0LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcGFyYWdyYXBoLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvcm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3N0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RhYmxlLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaGFuZGxlcnMvdGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3QvbGliL2hhbmRsZXJzL3RoZW1hdGljLWJyZWFrLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi9vbmUuanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L2xpYi93cmFwLmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvY29sbGFwc2Utd2hpdGUtc3BhY2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy9kZXRhYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL2RldGFiL25vZGVfbW9kdWxlcy9yZXBlYXQtc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1kZWZpbml0aW9ucy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL25vcm1hbGl6ZS11cmkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy90cmltLWxpbmVzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdHJpbS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL3VuaXN0LWJ1aWxkZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy91bmlzdC1idWlsZGVyL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1nZW5lcmF0ZWQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWRhc3QtdXRpbC10by1oYXN0L25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXBvc2l0aW9uL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtdG8taGFzdC9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC12aXNpdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tZGFzdC11dGlsLXRvLWhhc3Qvbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIsInJlbWFyay1yZWh5cGUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0Jztcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaW5kZXguanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBhbGw7XG5cbnZhciB0cmltID0gcmVxdWlyZSgndHJpbScpO1xudmFyIG9uZSA9IHJlcXVpcmUoJy4vb25lJyk7XG5cbi8qIFRyYW5zZm9ybSB0aGUgY2hpbGRyZW4gb2YgYHBhcmVudGAuICovXG5mdW5jdGlvbiBhbGwoaCwgcGFyZW50KSB7XG4gIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgdmFyIGxlbmd0aCA9IG5vZGVzLmxlbmd0aDtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGhlYWQ7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHQgPSBvbmUoaCwgbm9kZXNbaW5kZXhdLCBwYXJlbnQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgaWYgKGluZGV4ICYmIG5vZGVzW2luZGV4IC0gMV0udHlwZSA9PT0gJ2JyZWFrJykge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdHJpbS5sZWZ0KHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBoZWFkID0gcmVzdWx0LmNoaWxkcmVuICYmIHJlc3VsdC5jaGlsZHJlblswXTtcblxuICAgICAgICBpZiAoaGVhZCAmJiBoZWFkLnZhbHVlKSB7XG4gICAgICAgICAgaGVhZC52YWx1ZSA9IHRyaW0ubGVmdChoZWFkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlsc2FmZTtcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi9hbGwnKTtcblxuLyogUmV0dXJuIHRoZSBjb250ZW50IG9mIGEgcmVmZXJlbmNlIHdpdGhvdXQgZGVmaW5pdGlvblxuICogYXMgbWFya2Rvd24uICovXG5mdW5jdGlvbiBmYWlsc2FmZShoLCBub2RlLCBkZWZpbml0aW9uKSB7XG4gIHZhciBzdWJ0eXBlID0gbm9kZS5yZWZlcmVuY2VUeXBlO1xuXG4gIGlmIChzdWJ0eXBlICE9PSAnY29sbGFwc2VkJyAmJiBzdWJ0eXBlICE9PSAnZnVsbCcgJiYgIWRlZmluaXRpb24pIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnaW1hZ2VSZWZlcmVuY2UnKSB7XG4gICAgICByZXR1cm4gdSgndGV4dCcsICchWycgKyBub2RlLmFsdCArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt1KCd0ZXh0JywgJ1snKV0uY29uY2F0KGFsbChoLCBub2RlKSwgdSgndGV4dCcsICddJykpO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGVGb290bm90ZXM7XG5cbnZhciB0aGVtYXRpY0JyZWFrID0gcmVxdWlyZSgnLi9oYW5kbGVycy90aGVtYXRpYy1icmVhaycpO1xudmFyIGxpc3QgPSByZXF1aXJlKCcuL2hhbmRsZXJzL2xpc3QnKTtcbnZhciB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyk7XG5cbi8qIFRyYW5zZm9ybSBhbGwgZm9vdG5vdGUgZGVmaW5pdGlvbnMsIGlmIGFueS4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRm9vdG5vdGVzKGgpIHtcbiAgdmFyIGZvb3Rub3RlcyA9IGguZm9vdG5vdGVzO1xuICB2YXIgbGVuZ3RoID0gZm9vdG5vdGVzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBsaXN0SXRlbXMgPSBbXTtcbiAgdmFyIGRlZjtcblxuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBkZWYgPSBmb290bm90ZXNbaW5kZXhdO1xuXG4gICAgbGlzdEl0ZW1zW2luZGV4XSA9IHtcbiAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICBkYXRhOiB7aFByb3BlcnRpZXM6IHtpZDogJ2ZuLScgKyBkZWYuaWRlbnRpZmllcn19LFxuICAgICAgY2hpbGRyZW46IGRlZi5jaGlsZHJlbi5jb25jYXQoe1xuICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgIHVybDogJyNmbnJlZi0nICsgZGVmLmlkZW50aWZpZXIsXG4gICAgICAgIGRhdGE6IHtoUHJvcGVydGllczoge2NsYXNzTmFtZTogWydmb290bm90ZS1iYWNrcmVmJ119fSxcbiAgICAgICAgY2hpbGRyZW46IFt7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHZhbHVlOiAn4oapJ1xuICAgICAgICB9XVxuICAgICAgfSksXG4gICAgICBwb3NpdGlvbjogZGVmLnBvc2l0aW9uXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBoKG51bGwsICdkaXYnLCB7XG4gICAgY2xhc3NOYW1lOiBbJ2Zvb3Rub3RlcyddXG4gIH0sIHdyYXAoW1xuICAgIHRoZW1hdGljQnJlYWsoaCksXG4gICAgbGlzdChoLCB7XG4gICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IGxpc3RJdGVtc1xuICAgIH0pXG4gIF0sIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBibG9ja3F1b3RlO1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3dyYXAnKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgYmxvY2sgcXVvdGUuICovXG5mdW5jdGlvbiBibG9ja3F1b3RlKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2Jsb2NrcXVvdGUnLCB3cmFwKGFsbChoLCBub2RlKSwgdHJ1ZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhhcmRCcmVhaztcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG5cbi8qIFRyYW5zZm9ybSBhbiBpbmxpbmUgYnJlYWsuICovXG5mdW5jdGlvbiBoYXJkQnJlYWsoaCwgbm9kZSkge1xuICByZXR1cm4gW2gobm9kZSwgJ2JyJyksIHUoJ3RleHQnLCAnXFxuJyldO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvZGU7XG5cbnZhciBkZXRhYiA9IHJlcXVpcmUoJ2RldGFiJyk7XG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcblxuLyogVHJhbnNmb3JtIGEgY29kZSBibG9jay4gKi9cbmZ1bmN0aW9uIGNvZGUoaCwgbm9kZSkge1xuICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlID8gZGV0YWIobm9kZS52YWx1ZSArICdcXG4nKSA6ICcnO1xuICB2YXIgbGFuZyA9IG5vZGUubGFuZyAmJiBub2RlLmxhbmcubWF0Y2goL15bXiBcXHRdKyg/PVsgXFx0XXwkKS8pO1xuICB2YXIgcHJvcHMgPSB7fTtcblxuICBpZiAobGFuZykge1xuICAgIHByb3BzLmNsYXNzTmFtZSA9IFsnbGFuZ3VhZ2UtJyArIGxhbmddO1xuICB9XG5cbiAgcmV0dXJuIGgobm9kZS5wb3NpdGlvbiwgJ3ByZScsIFtcbiAgICBoKG5vZGUsICdjb2RlJywgcHJvcHMsIFt1KCd0ZXh0JywgdmFsdWUpXSlcbiAgXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWtldGhyb3VnaDtcblxudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gZGVsZXRpb25zLiAqL1xuZnVuY3Rpb24gc3RyaWtldGhyb3VnaChoLCBub2RlKSB7XG4gIHJldHVybiBoKG5vZGUsICdkZWwnLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcGhhc2lzO1xuXG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBlbXBoYXNpcy4gKi9cbmZ1bmN0aW9uIGVtcGhhc2lzKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2VtJywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmb290bm90ZVJlZmVyZW5jZTtcblxudmFyIHUgPSByZXF1aXJlKCd1bmlzdC1idWlsZGVyJyk7XG5cbi8qIFRyYW5zZm9ybSBhIHJlZmVyZW5jZSB0byBhIGZvb3Rub3RlLiAqL1xuZnVuY3Rpb24gZm9vdG5vdGVSZWZlcmVuY2UoaCwgbm9kZSkge1xuICB2YXIgaWRlbnRpZmllciA9IG5vZGUuaWRlbnRpZmllcjtcblxuICByZXR1cm4gaChub2RlLnBvc2l0aW9uLCAnc3VwJywge2lkOiAnZm5yZWYtJyArIGlkZW50aWZpZXJ9LCBbXG4gICAgaChub2RlLCAnYScsIHtcbiAgICAgIGhyZWY6ICcjZm4tJyArIGlkZW50aWZpZXIsXG4gICAgICBjbGFzc05hbWU6IFsnZm9vdG5vdGUtcmVmJ11cbiAgICB9LCBbdSgndGV4dCcsIGlkZW50aWZpZXIpXSlcbiAgXSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9vdG5vdGU7XG5cbnZhciBmb290bm90ZVJlZmVyZW5jZSA9IHJlcXVpcmUoJy4vZm9vdG5vdGUtcmVmZXJlbmNlJyk7XG5cbi8qIFRyYW5zZm9ybSBhbiBpbmxpbmUgZm9vdG5vdGUuICovXG5mdW5jdGlvbiBmb290bm90ZShoLCBub2RlKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICB2YXIgaWRlbnRpZmllciA9IDE7XG4gIHZhciBmb290bm90ZXMgPSBoLmZvb3Rub3RlcztcbiAgdmFyIGxlbmd0aCA9IGZvb3Rub3Rlcy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IC0xO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWRlbnRpZmllcnNbaW5kZXhdID0gZm9vdG5vdGVzW2luZGV4XS5pZGVudGlmaWVyO1xuICB9XG5cbiAgd2hpbGUgKGlkZW50aWZpZXJzLmluZGV4T2YoU3RyaW5nKGlkZW50aWZpZXIpKSAhPT0gLTEpIHtcbiAgICBpZGVudGlmaWVyKys7XG4gIH1cblxuICBpZGVudGlmaWVyID0gU3RyaW5nKGlkZW50aWZpZXIpO1xuXG4gIGZvb3Rub3Rlcy5wdXNoKHtcbiAgICB0eXBlOiAnZm9vdG5vdGVEZWZpbml0aW9uJyxcbiAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLFxuICAgIHBvc2l0aW9uOiBub2RlLnBvc2l0aW9uXG4gIH0pO1xuXG4gIHJldHVybiBmb290bm90ZVJlZmVyZW5jZShoLCB7XG4gICAgdHlwZTogJ2Zvb3Rub3RlUmVmZXJlbmNlJyxcbiAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgIHBvc2l0aW9uOiBub2RlLnBvc2l0aW9uXG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhlYWRpbmc7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgaGVhZGluZy4gKi9cbmZ1bmN0aW9uIGhlYWRpbmcoaCwgbm9kZSkge1xuICByZXR1cm4gaChub2RlLCAnaCcgKyBub2RlLmRlcHRoLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGh0bWw7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBSZXR1cm4gZWl0aGVyIGEgYHJhd2Agbm9kZSwgaW4gZGFuZ2Vyb3VzIG1vZGUsIG9yXG4gKiBub3RoaW5nLiAqL1xuZnVuY3Rpb24gaHRtbChoLCBub2RlKSB7XG4gIHJldHVybiBoLmRhbmdlcm91cyA/IGguYXVnbWVudChub2RlLCB1KCdyYXcnLCBub2RlLnZhbHVlKSkgOiBudWxsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGltYWdlUmVmZXJlbmNlO1xuXG52YXIgbm9ybWFsaXplID0gcmVxdWlyZSgnbm9ybWFsaXplLXVyaScpO1xudmFyIGZhaWxzYWZlID0gcmVxdWlyZSgnLi4vZmFpbHNhZmUnKTtcblxuLyogVHJhbnNmb3JtIGEgcmVmZXJlbmNlIHRvIGFuIGltYWdlLiAqL1xuZnVuY3Rpb24gaW1hZ2VSZWZlcmVuY2UoaCwgbm9kZSkge1xuICB2YXIgZGVmID0gaC5kZWZpbml0aW9uKG5vZGUuaWRlbnRpZmllcik7XG4gIHZhciBwcm9wcyA9IHtzcmM6IG5vcm1hbGl6ZSgoZGVmICYmIGRlZi51cmwpIHx8ICcnKSwgYWx0OiBub2RlLmFsdH07XG5cbiAgaWYgKGRlZiAmJiBkZWYudGl0bGUgIT09IG51bGwgJiYgZGVmLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgfVxuXG4gIHJldHVybiBmYWlsc2FmZShoLCBub2RlLCBkZWYpIHx8IGgobm9kZSwgJ2ltZycsIHByb3BzKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJ25vcm1hbGl6ZS11cmknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbWFnZTtcblxuLyogVHJhbnNmb3JtIGFuIGltYWdlLiAqL1xuZnVuY3Rpb24gaW1hZ2UoaCwgbm9kZSkge1xuICB2YXIgcHJvcHMgPSB7c3JjOiBub3JtYWxpemUobm9kZS51cmwpLCBhbHQ6IG5vZGUuYWx0fTtcblxuICBpZiAobm9kZS50aXRsZSAhPT0gbnVsbCAmJiBub2RlLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IG5vZGUudGl0bGU7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnaW1nJywgcHJvcHMpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYmxvY2txdW90ZTogcmVxdWlyZSgnLi9ibG9ja3F1b3RlJyksXG4gIGJyZWFrOiByZXF1aXJlKCcuL2JyZWFrJyksXG4gIGNvZGU6IHJlcXVpcmUoJy4vY29kZScpLFxuICBkZWxldGU6IHJlcXVpcmUoJy4vZGVsZXRlJyksXG4gIGVtcGhhc2lzOiByZXF1aXJlKCcuL2VtcGhhc2lzJyksXG4gIGZvb3Rub3RlUmVmZXJlbmNlOiByZXF1aXJlKCcuL2Zvb3Rub3RlLXJlZmVyZW5jZScpLFxuICBmb290bm90ZTogcmVxdWlyZSgnLi9mb290bm90ZScpLFxuICBoZWFkaW5nOiByZXF1aXJlKCcuL2hlYWRpbmcnKSxcbiAgaHRtbDogcmVxdWlyZSgnLi9odG1sJyksXG4gIGltYWdlUmVmZXJlbmNlOiByZXF1aXJlKCcuL2ltYWdlLXJlZmVyZW5jZScpLFxuICBpbWFnZTogcmVxdWlyZSgnLi9pbWFnZScpLFxuICBpbmxpbmVDb2RlOiByZXF1aXJlKCcuL2lubGluZS1jb2RlJyksXG4gIGxpbmtSZWZlcmVuY2U6IHJlcXVpcmUoJy4vbGluay1yZWZlcmVuY2UnKSxcbiAgbGluazogcmVxdWlyZSgnLi9saW5rJyksXG4gIGxpc3RJdGVtOiByZXF1aXJlKCcuL2xpc3QtaXRlbScpLFxuICBsaXN0OiByZXF1aXJlKCcuL2xpc3QnKSxcbiAgcGFyYWdyYXBoOiByZXF1aXJlKCcuL3BhcmFncmFwaCcpLFxuICByb290OiByZXF1aXJlKCcuL3Jvb3QnKSxcbiAgc3Ryb25nOiByZXF1aXJlKCcuL3N0cm9uZycpLFxuICB0YWJsZTogcmVxdWlyZSgnLi90YWJsZScpLFxuICB0ZXh0OiByZXF1aXJlKCcuL3RleHQnKSxcbiAgdGhlbWF0aWNCcmVhazogcmVxdWlyZSgnLi90aGVtYXRpYy1icmVhaycpLFxuICB5YW1sOiBpZ25vcmUsXG4gIGRlZmluaXRpb246IGlnbm9yZSxcbiAgZm9vdG5vdGVEZWZpbml0aW9uOiBpZ25vcmVcbn07XG5cbi8qIFJldHVybiBub3RoaW5nIGZvciBub2RlcyB3aGljaCBhcmUgaWdub3JlZC4gKi9cbmZ1bmN0aW9uIGlnbm9yZSgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5saW5lQ29kZTtcblxudmFyIGNvbGxhcHNlID0gcmVxdWlyZSgnY29sbGFwc2Utd2hpdGUtc3BhY2UnKTtcbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBUcmFuc2Zvcm0gaW5saW5lIGNvZGUuICovXG5mdW5jdGlvbiBpbmxpbmVDb2RlKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ2NvZGUnLCBbdSgndGV4dCcsIGNvbGxhcHNlKG5vZGUudmFsdWUpKV0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxpbmtSZWZlcmVuY2U7XG5cbnZhciBub3JtYWxpemUgPSByZXF1aXJlKCdub3JtYWxpemUtdXJpJyk7XG52YXIgZmFpbHNhZmUgPSByZXF1aXJlKCcuLi9mYWlsc2FmZScpO1xudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gYSByZWZlcmVuY2UgdG8gYSBsaW5rLiAqL1xuZnVuY3Rpb24gbGlua1JlZmVyZW5jZShoLCBub2RlKSB7XG4gIHZhciBkZWYgPSBoLmRlZmluaXRpb24obm9kZS5pZGVudGlmaWVyKTtcbiAgdmFyIHByb3BzID0ge2hyZWY6IG5vcm1hbGl6ZSgoZGVmICYmIGRlZi51cmwpIHx8ICcnKX07XG5cbiAgaWYgKGRlZiAmJiBkZWYudGl0bGUgIT09IG51bGwgJiYgZGVmLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgfVxuXG4gIHJldHVybiBmYWlsc2FmZShoLCBub2RlLCBkZWYpIHx8IGgobm9kZSwgJ2EnLCBwcm9wcywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG5vcm1hbGl6ZSA9IHJlcXVpcmUoJ25vcm1hbGl6ZS11cmknKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsaW5rO1xuXG4vKiBUcmFuc2Zvcm0gYSBsaW5rLiAqL1xuZnVuY3Rpb24gbGluayhoLCBub2RlKSB7XG4gIHZhciBwcm9wcyA9IHtocmVmOiBub3JtYWxpemUobm9kZS51cmwpfTtcblxuICBpZiAobm9kZS50aXRsZSAhPT0gbnVsbCAmJiBub2RlLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwcm9wcy50aXRsZSA9IG5vZGUudGl0bGU7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnYScsIHByb3BzLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RJdGVtO1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciB3cmFwID0gcmVxdWlyZSgnLi4vd3JhcCcpO1xudmFyIGFsbCA9IHJlcXVpcmUoJy4uL2FsbCcpO1xuXG4vKiBUcmFuc2Zvcm0gYSBsaXN0LWl0ZW0uICovXG5mdW5jdGlvbiBsaXN0SXRlbShoLCBub2RlLCBwYXJlbnQpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGhlYWQgPSBjaGlsZHJlblswXTtcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBzaW5nbGUgPSBmYWxzZTtcbiAgdmFyIHJlc3VsdDtcbiAgdmFyIGNvbnRhaW5lcjtcblxuICBpZiAoKCFwYXJlbnQgfHwgIXBhcmVudC5sb29zZSkgJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGhlYWQudHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICBzaW5nbGUgPSB0cnVlO1xuICB9XG5cbiAgcmVzdWx0ID0gYWxsKGgsIHNpbmdsZSA/IGhlYWQgOiBub2RlKTtcblxuICBpZiAodHlwZW9mIG5vZGUuY2hlY2tlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgaWYgKCFzaW5nbGUgJiYgKCFoZWFkIHx8IGhlYWQudHlwZSAhPT0gJ3BhcmFncmFwaCcpKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChoKG51bGwsICdwJywgW10pKTtcbiAgICB9XG5cbiAgICBjb250YWluZXIgPSBzaW5nbGUgPyByZXN1bHQgOiByZXN1bHRbMF0uY2hpbGRyZW47XG5cbiAgICBpZiAoY29udGFpbmVyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29udGFpbmVyLnVuc2hpZnQodSgndGV4dCcsICcgJykpO1xuICAgIH1cblxuICAgIGNvbnRhaW5lci51bnNoaWZ0KGgobnVsbCwgJ2lucHV0Jywge1xuICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgIGNoZWNrZWQ6IG5vZGUuY2hlY2tlZCxcbiAgICAgIGRpc2FibGVkOiB0cnVlXG4gICAgfSkpO1xuXG4gICAgLyogQWNjb3JkaW5nIHRvIGdpdGh1Yi1tYXJrZG93bi1jc3MsIHRoaXMgY2xhc3MgaGlkZXMgYnVsbGV0LiAqL1xuICAgIHByb3BzLmNsYXNzTmFtZSA9IFsndGFzay1saXN0LWl0ZW0nXTtcbiAgfVxuXG4gIGlmICghc2luZ2xlICYmIHJlc3VsdC5sZW5ndGggIT09IDApIHtcbiAgICByZXN1bHQgPSB3cmFwKHJlc3VsdCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnbGknLCBwcm9wcywgcmVzdWx0KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0O1xuXG52YXIgd3JhcCA9IHJlcXVpcmUoJy4uL3dyYXAnKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgbGlzdC4gKi9cbmZ1bmN0aW9uIGxpc3QoaCwgbm9kZSkge1xuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIG5hbWUgPSBub2RlLm9yZGVyZWQgPyAnb2wnIDogJ3VsJztcblxuICBpZiAodHlwZW9mIG5vZGUuc3RhcnQgPT09ICdudW1iZXInICYmIG5vZGUuc3RhcnQgIT09IDEpIHtcbiAgICBwcm9wcy5zdGFydCA9IG5vZGUuc3RhcnQ7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCBuYW1lLCBwcm9wcywgd3JhcChhbGwoaCwgbm9kZSksIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJhZ3JhcGg7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGEgcGFyYWdyYXBoLiAqL1xuZnVuY3Rpb24gcGFyYWdyYXBoKGgsIG5vZGUpIHtcbiAgcmV0dXJuIGgobm9kZSwgJ3AnLCBhbGwoaCwgbm9kZSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuLi93cmFwJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBhIGByb290YC4gKi9cbmZ1bmN0aW9uIHJvb3QoaCwgbm9kZSkge1xuICByZXR1cm4gaC5hdWdtZW50KG5vZGUsIHUoJ3Jvb3QnLCB3cmFwKGFsbChoLCBub2RlKSkpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJvbmc7XG5cbnZhciBhbGwgPSByZXF1aXJlKCcuLi9hbGwnKTtcblxuLyogVHJhbnNmb3JtIGltcG9ydGFuY2UuICovXG5mdW5jdGlvbiBzdHJvbmcoaCwgbm9kZSkge1xuICByZXR1cm4gaChub2RlLCAnc3Ryb25nJywgYWxsKGgsIG5vZGUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0YWJsZTtcblxudmFyIHBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1wb3NpdGlvbicpO1xudmFyIHdyYXAgPSByZXF1aXJlKCcuLi93cmFwJyk7XG52YXIgYWxsID0gcmVxdWlyZSgnLi4vYWxsJyk7XG5cbi8qIFRyYW5zZm9ybSBhIHRhYmxlLiAqL1xuZnVuY3Rpb24gdGFibGUoaCwgbm9kZSkge1xuICB2YXIgcm93cyA9IG5vZGUuY2hpbGRyZW47XG4gIHZhciBpbmRleCA9IHJvd3MubGVuZ3RoO1xuICB2YXIgYWxpZ24gPSBub2RlLmFsaWduO1xuICB2YXIgYWxpZ25MZW5ndGggPSBhbGlnbi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHBvcztcbiAgdmFyIHJvdztcbiAgdmFyIG91dDtcbiAgdmFyIG5hbWU7XG4gIHZhciBjZWxsO1xuXG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgcm93ID0gcm93c1tpbmRleF0uY2hpbGRyZW47XG4gICAgbmFtZSA9IGluZGV4ID09PSAwID8gJ3RoJyA6ICd0ZCc7XG4gICAgcG9zID0gYWxpZ25MZW5ndGg7XG4gICAgb3V0ID0gW107XG5cbiAgICB3aGlsZSAocG9zLS0pIHtcbiAgICAgIGNlbGwgPSByb3dbcG9zXTtcbiAgICAgIG91dFtwb3NdID0gaChjZWxsLCBuYW1lLCB7XG4gICAgICAgIGFsaWduOiBhbGlnbltwb3NdXG4gICAgICB9LCBjZWxsID8gd3JhcChhbGwoaCwgY2VsbCkpIDogW10pO1xuICAgIH1cblxuICAgIHJlc3VsdFtpbmRleF0gPSBoKHJvd3NbaW5kZXhdLCAndHInLCB3cmFwKG91dCwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGgobm9kZSwgJ3RhYmxlJywgd3JhcChbXG4gICAgaChyZXN1bHRbMF0ucG9zaXRpb24sICd0aGVhZCcsIHdyYXAoW3Jlc3VsdFswXV0sIHRydWUpKSxcbiAgICBoKHtcbiAgICAgIHN0YXJ0OiBwb3NpdGlvbi5zdGFydChyZXN1bHRbMV0pLFxuICAgICAgZW5kOiBwb3NpdGlvbi5lbmQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSlcbiAgICB9LCAndGJvZHknLCB3cmFwKHJlc3VsdC5zbGljZSgxKSwgdHJ1ZSkpXG4gIF0sIHRydWUpKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0ZXh0O1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciB0cmltTGluZXMgPSByZXF1aXJlKCd0cmltLWxpbmVzJyk7XG5cbi8qIFRyYW5zZm9ybSB0ZXh0LiAqL1xuZnVuY3Rpb24gdGV4dChoLCBub2RlKSB7XG4gIHJldHVybiBoLmF1Z21lbnQobm9kZSwgdSgndGV4dCcsIHRyaW1MaW5lcyhub2RlLnZhbHVlKSkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRoZW1hdGljQnJlYWs7XG5cbi8qIFRyYW5zZm9ybSBhIHRoZW1hdGljIGJyZWFrIC8gaG9yaXpvbnRhbCBydWxlLiAqL1xuZnVuY3Rpb24gdGhlbWF0aWNCcmVhayhoLCBub2RlKSB7XG4gIHJldHVybiBoKG5vZGUsICdocicpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRvSEFTVDtcblxudmFyIHh0ZW5kID0gcmVxdWlyZSgneHRlbmQnKTtcbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xudmFyIHZpc2l0ID0gcmVxdWlyZSgndW5pc3QtdXRpbC12aXNpdCcpO1xudmFyIHBvc2l0aW9uID0gcmVxdWlyZSgndW5pc3QtdXRpbC1wb3NpdGlvbicpO1xudmFyIGdlbmVyYXRlZCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtZ2VuZXJhdGVkJyk7XG52YXIgZGVmaW5pdGlvbnMgPSByZXF1aXJlKCdtZGFzdC11dGlsLWRlZmluaXRpb25zJyk7XG52YXIgb25lID0gcmVxdWlyZSgnLi9vbmUnKTtcbnZhciBmb290ZXIgPSByZXF1aXJlKCcuL2Zvb3RlcicpO1xudmFyIGhhbmRsZXJzID0gcmVxdWlyZSgnLi9oYW5kbGVycycpO1xuXG4vKiBGYWN0b3J5IHRvIHRyYW5zZm9ybS4gKi9cbmZ1bmN0aW9uIGZhY3RvcnkodHJlZSwgb3B0aW9ucykge1xuICB2YXIgc2V0dGluZ3MgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZGFuZ2Vyb3VzID0gc2V0dGluZ3MuYWxsb3dEYW5nZXJvdXNIVE1MO1xuXG4gIGguZGFuZ2Vyb3VzID0gZGFuZ2Vyb3VzO1xuICBoLmRlZmluaXRpb24gPSBkZWZpbml0aW9ucyh0cmVlLCBzZXR0aW5ncyk7XG4gIGguZm9vdG5vdGVzID0gW107XG4gIGguYXVnbWVudCA9IGF1Z21lbnQ7XG4gIGguaGFuZGxlcnMgPSB4dGVuZChoYW5kbGVycywgKHNldHRpbmdzLmhhbmRsZXJzIHx8IHt9KSk7XG5cbiAgdmlzaXQodHJlZSwgJ2Zvb3Rub3RlRGVmaW5pdGlvbicsIHZpc2l0b3IpO1xuXG4gIHJldHVybiBoO1xuXG4gIC8qIEZpbmFsaXNlIHRoZSBjcmVhdGVkIGByaWdodGAsIGEgSEFTVCBub2RlLCBmcm9tXG4gICAqIGBsZWZ0YCwgYW4gTURBU1Qgbm9kZS4gICAqL1xuICBmdW5jdGlvbiBhdWdtZW50KGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdmFyIGN0eDtcblxuICAgIC8qIEhhbmRsZSBgZGF0YS5oTmFtZWAsIGBkYXRhLmhQcm9wZXJ0aWVzLCBgaENoaWxkcmVuYC4gKi9cbiAgICBpZiAobGVmdCAmJiAnZGF0YScgaW4gbGVmdCkge1xuICAgICAgZGF0YSA9IGxlZnQuZGF0YTtcblxuICAgICAgaWYgKHJpZ2h0LnR5cGUgPT09ICdlbGVtZW50JyAmJiBkYXRhLmhOYW1lKSB7XG4gICAgICAgIHJpZ2h0LnRhZ05hbWUgPSBkYXRhLmhOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHQudHlwZSA9PT0gJ2VsZW1lbnQnICYmIGRhdGEuaFByb3BlcnRpZXMpIHtcbiAgICAgICAgcmlnaHQucHJvcGVydGllcyA9IHh0ZW5kKHJpZ2h0LnByb3BlcnRpZXMsIGRhdGEuaFByb3BlcnRpZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmlnaHQuY2hpbGRyZW4gJiYgZGF0YS5oQ2hpbGRyZW4pIHtcbiAgICAgICAgcmlnaHQuY2hpbGRyZW4gPSBkYXRhLmhDaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHggPSBsZWZ0ICYmIGxlZnQucG9zaXRpb24gPyBsZWZ0IDoge3Bvc2l0aW9uOiBsZWZ0fTtcblxuICAgIGlmICghZ2VuZXJhdGVkKGN0eCkpIHtcbiAgICAgIHJpZ2h0LnBvc2l0aW9uID0ge1xuICAgICAgICBzdGFydDogcG9zaXRpb24uc3RhcnQoY3R4KSxcbiAgICAgICAgZW5kOiBwb3NpdGlvbi5lbmQoY3R4KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmlnaHQ7XG4gIH1cblxuICAvKiBDcmVhdGUgYW4gZWxlbWVudCBmb3IgYSBgbm9kZWAuICovXG4gIGZ1bmN0aW9uIGgobm9kZSwgdGFnTmFtZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgaWYgKFxuICAgICAgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4gPT09IG51bGwpICYmXG4gICAgICB0eXBlb2YgcHJvcHMgPT09ICdvYmplY3QnICYmXG4gICAgICAnbGVuZ3RoJyBpbiBwcm9wc1xuICAgICkge1xuICAgICAgY2hpbGRyZW4gPSBwcm9wcztcbiAgICAgIHByb3BzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF1Z21lbnQobm9kZSwge1xuICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICAgIHByb3BlcnRpZXM6IHByb3BzIHx8IHt9LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpdG9yKGRlZmluaXRpb24pIHtcbiAgICBoLmZvb3Rub3Rlcy5wdXNoKGRlZmluaXRpb24pO1xuICB9XG59XG5cbi8qIFRyYW5zZm9ybSBgdHJlZWAsIHdoaWNoIGlzIGFuIE1EQVNUIG5vZGUsIHRvIGEgSEFTVCBub2RlLiAqL1xuZnVuY3Rpb24gdG9IQVNUKHRyZWUsIG9wdGlvbnMpIHtcbiAgdmFyIGggPSBmYWN0b3J5KHRyZWUsIG9wdGlvbnMpO1xuICB2YXIgbm9kZSA9IG9uZShoLCB0cmVlKTtcbiAgdmFyIGZvb3Rub3RlcyA9IGZvb3RlcihoKTtcblxuICBpZiAobm9kZSAmJiBub2RlLmNoaWxkcmVuICYmIGZvb3Rub3Rlcykge1xuICAgIG5vZGUuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLmNvbmNhdCh1KCd0ZXh0JywgJ1xcbicpLCBmb290bm90ZXMpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gb25lO1xuXG52YXIgdSA9IHJlcXVpcmUoJ3VuaXN0LWJ1aWxkZXInKTtcbnZhciBhbGwgPSByZXF1aXJlKCcuL2FsbCcpO1xuXG52YXIgb3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qIFRyYW5zZm9ybSBhbiB1bmtub3duIG5vZGUuICovXG5mdW5jdGlvbiB1bmtub3duKGgsIG5vZGUpIHtcbiAgaWYgKHRleHQobm9kZSkpIHtcbiAgICByZXR1cm4gaC5hdWdtZW50KG5vZGUsIHUoJ3RleHQnLCBub2RlLnZhbHVlKSk7XG4gIH1cblxuICByZXR1cm4gaChub2RlLCAnZGl2JywgYWxsKGgsIG5vZGUpKTtcbn1cblxuLyogVmlzaXQgYSBub2RlLiAqL1xuZnVuY3Rpb24gb25lKGgsIG5vZGUsIHBhcmVudCkge1xuICB2YXIgdHlwZSA9IG5vZGUgJiYgbm9kZS50eXBlO1xuICB2YXIgZm4gPSBvd24uY2FsbChoLmhhbmRsZXJzLCB0eXBlKSA/IGguaGFuZGxlcnNbdHlwZV0gOiBudWxsO1xuXG4gIC8qIEZhaWwgb24gbm9uLW5vZGVzLiAqL1xuICBpZiAoIXR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vZGUsIGdvdCBgJyArIG5vZGUgKyAnYCcpO1xuICB9XG5cbiAgcmV0dXJuICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgPyBmbiA6IHVua25vd24pKGgsIG5vZGUsIHBhcmVudCk7XG59XG5cbi8qIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSByZW5kZXJlcmVkIGEgdGV4dCBub2RlLiAqL1xuZnVuY3Rpb24gdGV4dChub2RlKSB7XG4gIHZhciBkYXRhID0gbm9kZS5kYXRhIHx8IHt9O1xuXG4gIGlmIChvd24uY2FsbChkYXRhLCAnaE5hbWUnKSB8fCBvd24uY2FsbChkYXRhLCAnaFByb3BlcnRpZXMnKSB8fCBvd24uY2FsbChkYXRhLCAnaENoaWxkcmVuJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gJ3ZhbHVlJyBpbiBub2RlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbnZhciB1ID0gcmVxdWlyZSgndW5pc3QtYnVpbGRlcicpO1xuXG4vKiBXcmFwIGBub2Rlc2Agd2l0aCBuZXdsaW5lcyBiZXR3ZWVuIGVhY2ggZW50cnkuXG4gKiBPcHRpb25hbGx5IGFkZHMgbmV3bGluZXMgYXQgdGhlIHN0YXJ0IGFuZCBlbmQuICovXG5mdW5jdGlvbiB3cmFwKG5vZGVzLCBsb29zZSkge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgbGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXG4gIGlmIChsb29zZSkge1xuICAgIHJlc3VsdC5wdXNoKHUoJ3RleHQnLCAnXFxuJykpO1xuICB9XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoaW5kZXgpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHUoJ3RleHQnLCAnXFxuJykpO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKG5vZGVzW2luZGV4XSk7XG4gIH1cblxuICBpZiAobG9vc2UgJiYgbm9kZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmVzdWx0LnB1c2godSgndGV4dCcsICdcXG4nKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbGxhcHNlO1xuXG4vKiBjb2xsYXBzZSgnIFxcdFxcbmJhciBcXG5iYXpcXHQnKTsgLy8gJyBiYXIgYmF6ICcgKi9cbmZ1bmN0aW9uIGNvbGxhcHNlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBkZXRhYjtcblxudmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcblxudmFyIFRBQiA9IDB4MDk7XG52YXIgTEYgPSAweDBBO1xudmFyIENSID0gMHgwRDtcblxuLyogUmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzLCBiZWluZyBzbWFydCBhYm91dCB3aGljaFxuICogY29sdW1uIHRoZSB0YWIgaXMgYXQgYW5kIHdoaWNoIHNpemUgc2hvdWxkIGJlIHVzZWQuICovXG5mdW5jdGlvbiBkZXRhYih2YWx1ZSwgc2l6ZSkge1xuICB2YXIgc3RyaW5nID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgdmFyIGxlbmd0aCA9IHN0cmluZyAmJiB2YWx1ZS5sZW5ndGg7XG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBpbmRleCA9IC0xO1xuICB2YXIgY29sdW1uID0gLTE7XG4gIHZhciB0YWJTaXplID0gc2l6ZSB8fCA0O1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgY29kZTtcbiAgdmFyIGFkZDtcblxuICBpZiAoIXN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcignZGV0YWIgZXhwZWN0ZWQgc3RyaW5nJyk7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgIGlmIChjb2RlID09PSBUQUIpIHtcbiAgICAgIGFkZCA9IHRhYlNpemUgLSAoKGNvbHVtbiArIDEpICUgdGFiU2l6ZSk7XG4gICAgICBjb2x1bW4gKz0gYWRkO1xuICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlLnNsaWNlKHN0YXJ0LCBpbmRleCkgKyByZXBlYXQoJyAnLCBhZGQpKTtcbiAgICAgIHN0YXJ0ID0gaW5kZXggKyAxO1xuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gTEYgfHwgY29kZSA9PT0gQ1IpIHtcbiAgICAgIGNvbHVtbiA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW4rKztcbiAgICB9XG4gIH1cblxuICByZXN1bHRzLnB1c2godmFsdWUuc2xpY2Uoc3RhcnQpKTtcblxuICByZXR1cm4gcmVzdWx0cy5qb2luKCcnKTtcbn1cbiIsIi8qIVxuICogcmVwZWF0LXN0cmluZyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvcmVwZWF0LXN0cmluZz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlc3VsdHMgY2FjaGVcbiAqL1xuXG52YXIgcmVzID0gJyc7XG52YXIgY2FjaGU7XG5cbi8qKlxuICogRXhwb3NlIGByZXBlYXRgXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXBlYXQ7XG5cbi8qKlxuICogUmVwZWF0IHRoZSBnaXZlbiBgc3RyaW5nYCB0aGUgc3BlY2lmaWVkIGBudW1iZXJgXG4gKiBvZiB0aW1lcy5cbiAqXG4gKiAqKkV4YW1wbGU6KipcbiAqXG4gKiBgYGBqc1xuICogdmFyIHJlcGVhdCA9IHJlcXVpcmUoJ3JlcGVhdC1zdHJpbmcnKTtcbiAqIHJlcGVhdCgnQScsIDUpO1xuICogLy89PiBBQUFBQVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJpbmdgIFRoZSBzdHJpbmcgdG8gcmVwZWF0XG4gKiBAcGFyYW0ge051bWJlcn0gYG51bWJlcmAgVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZ1xuICogQHJldHVybiB7U3RyaW5nfSBSZXBlYXRlZCBzdHJpbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVwZWF0KHN0ciwgbnVtKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICAvLyBjb3ZlciBjb21tb24sIHF1aWNrIHVzZSBjYXNlc1xuICBpZiAobnVtID09PSAxKSByZXR1cm4gc3RyO1xuICBpZiAobnVtID09PSAyKSByZXR1cm4gc3RyICsgc3RyO1xuXG4gIHZhciBtYXggPSBzdHIubGVuZ3RoICogbnVtO1xuICBpZiAoY2FjaGUgIT09IHN0ciB8fCB0eXBlb2YgY2FjaGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgY2FjaGUgPSBzdHI7XG4gICAgcmVzID0gJyc7XG4gIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+PSBtYXgpIHtcbiAgICByZXR1cm4gcmVzLnN1YnN0cigwLCBtYXgpO1xuICB9XG5cbiAgd2hpbGUgKG1heCA+IHJlcy5sZW5ndGggJiYgbnVtID4gMSkge1xuICAgIGlmIChudW0gJiAxKSB7XG4gICAgICByZXMgKz0gc3RyO1xuICAgIH1cblxuICAgIG51bSA+Pj0gMTtcbiAgICBzdHIgKz0gc3RyO1xuICB9XG5cbiAgcmVzICs9IHN0cjtcbiAgcmVzID0gcmVzLnN1YnN0cigwLCBtYXgpO1xuICByZXR1cm4gcmVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdmlzaXQgPSByZXF1aXJlKCd1bmlzdC11dGlsLXZpc2l0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RGVmaW5pdGlvbkZhY3Rvcnk7XG5cbnZhciBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuLyogR2V0IGEgZGVmaW5pdGlvbiBpbiBgbm9kZWAgYnkgYGlkZW50aWZpZXJgLiAqL1xuZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbkZhY3Rvcnkobm9kZSwgb3B0aW9ucykge1xuICByZXR1cm4gZ2V0dGVyRmFjdG9yeShnYXRoZXIobm9kZSwgb3B0aW9ucykpO1xufVxuXG4vKiBHYXRoZXIgYWxsIGRlZmluaXRpb25zIGluIGBub2RlYCAqL1xuZnVuY3Rpb24gZ2F0aGVyKG5vZGUsIG9wdGlvbnMpIHtcbiAgdmFyIGNhY2hlID0ge307XG5cbiAgaWYgKCFub2RlIHx8ICFub2RlLnR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21kYXN0LXV0aWwtZGVmaW5pdGlvbnMgZXhwZWN0ZWQgbm9kZScpO1xuICB9XG5cbiAgdmlzaXQobm9kZSwgJ2RlZmluaXRpb24nLCBvcHRpb25zICYmIG9wdGlvbnMuY29tbW9ubWFyayA/IGNvbW1vbm1hcmsgOiBub3JtYWwpO1xuXG4gIHJldHVybiBjYWNoZTtcblxuICBmdW5jdGlvbiBjb21tb25tYXJrKGRlZmluaXRpb24pIHtcbiAgICB2YXIgaWQgPSBub3JtYWxpc2UoZGVmaW5pdGlvbi5pZGVudGlmaWVyKTtcbiAgICBpZiAoIW93bi5jYWxsKGNhY2hlLCBpZCkpIHtcbiAgICAgIGNhY2hlW2lkXSA9IGRlZmluaXRpb247XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsKGRlZmluaXRpb24pIHtcbiAgICBjYWNoZVtub3JtYWxpc2UoZGVmaW5pdGlvbi5pZGVudGlmaWVyKV0gPSBkZWZpbml0aW9uO1xuICB9XG59XG5cbi8qIEZhY3RvcnkgdG8gZ2V0IGEgbm9kZSBmcm9tIHRoZSBnaXZlbiBkZWZpbml0aW9uLWNhY2hlLiAqL1xuZnVuY3Rpb24gZ2V0dGVyRmFjdG9yeShjYWNoZSkge1xuICByZXR1cm4gZ2V0dGVyO1xuXG4gIC8qIEdldCBhIG5vZGUgZnJvbSB0aGUgYm91bmQgZGVmaW5pdGlvbi1jYWNoZS4gKi9cbiAgZnVuY3Rpb24gZ2V0dGVyKGlkZW50aWZpZXIpIHtcbiAgICB2YXIgaWQgPSBpZGVudGlmaWVyICYmIG5vcm1hbGlzZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gaWQgJiYgb3duLmNhbGwoY2FjaGUsIGlkKSA/IGNhY2hlW2lkXSA6IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXNlKGlkZW50aWZpZXIpIHtcbiAgcmV0dXJuIGlkZW50aWZpZXIudG9VcHBlckNhc2UoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXR1cm5lcjtcblxudHJ5IHtcbiAgbm9ybWFsaXplKCcnKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemU7XG59IGNhdGNoIChlcnIpIHt9XG5cbi8qIE5vcm1hbGl6ZSBgdXJpYC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSh1cmkpIHtcbiAgcmV0dXJuIGVuY29kZVVSSShkZWNvZGVVUkkodXJpKSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gRmFsbGJhY2ssIHJldHVybiBpbnB1dC4gKi9cbmZ1bmN0aW9uIHJldHVybmVyKHVyaSkge1xuICByZXR1cm4gdXJpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1MaW5lcztcblxudmFyIHdzID0gL1sgXFx0XSpcXG4rWyBcXHRdKi9nO1xudmFyIG5ld2xpbmUgPSAnXFxuJztcblxuZnVuY3Rpb24gdHJpbUxpbmVzKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2Uod3MsIG5ld2xpbmUpO1xufVxuIiwiXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB0cmltO1xuXG5mdW5jdGlvbiB0cmltKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyp8XFxzKiQvZywgJycpO1xufVxuXG5leHBvcnRzLmxlZnQgPSBmdW5jdGlvbihzdHIpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpO1xufTtcblxuZXhwb3J0cy5yaWdodCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdSAodHlwZSwgcHJvcHMsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICh0eXBlb2YgcHJvcHMgIT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcm9wcykpKSB7XG4gICAgdmFsdWUgPSBwcm9wcztcbiAgICBwcm9wcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHsgdHlwZTogU3RyaW5nKHR5cGUpIH0sXG4gICAgICAgICAgICAgICAgdmFsdWUgIT0gbnVsbCAmJiAoQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgY2hpbGRyZW46IHZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IFN0cmluZyh2YWx1ZSkgfSkpO1xufTtcbiIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbm1vZHVsZS5leHBvcnRzID0gZ2VuZXJhdGVkO1xuXG4vKiBEZXRlY3QgaWYgYSBub2RlIHdhcyBhdmFpbGFibGUgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50LiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVkKG5vZGUpIHtcbiAgdmFyIHBvc2l0aW9uID0gb3B0aW9uYWwob3B0aW9uYWwobm9kZSkucG9zaXRpb24pO1xuICB2YXIgc3RhcnQgPSBvcHRpb25hbChwb3NpdGlvbi5zdGFydCk7XG4gIHZhciBlbmQgPSBvcHRpb25hbChwb3NpdGlvbi5lbmQpO1xuXG4gIHJldHVybiAhc3RhcnQubGluZSB8fCAhc3RhcnQuY29sdW1uIHx8ICFlbmQubGluZSB8fCAhZW5kLmNvbHVtbjtcbn1cblxuLyogUmV0dXJuIGB2YWx1ZWAgaWYgaXTigJlzIGFuIG9iamVjdCwgYW4gZW1wdHkgb2JqZWN0XG4gKiBvdGhlcndpc2UuICovXG5mdW5jdGlvbiBvcHRpb25hbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDoge307XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbnZhciBwb3NpdGlvbiA9IGV4cG9ydHM7XG5cbnBvc2l0aW9uLnN0YXJ0ID0gcG9zaXRpb25GYWN0b3J5KCdzdGFydCcpO1xucG9zaXRpb24uZW5kID0gcG9zaXRpb25GYWN0b3J5KCdlbmQnKTtcblxuLyogRmFjdG9yeSB0byBnZXQgYSBwb3NpdGlvbiBhdCBgdHlwZWAuICovXG5mdW5jdGlvbiBwb3NpdGlvbkZhY3RvcnkodHlwZSkge1xuICByZXR1cm4gcG9zO1xuXG4gIC8qIEdldCBhIHBvc2l0aW9uIGluIGBub2RlYCBhdCBhIGJvdW5kIGB0eXBlYC4gKi9cbiAgZnVuY3Rpb24gcG9zKG5vZGUpIHtcbiAgICB2YXIgcG9zID0gKG5vZGUgJiYgbm9kZS5wb3NpdGlvbiAmJiBub2RlLnBvc2l0aW9uW3R5cGVdKSB8fCB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBwb3MubGluZSB8fCBudWxsLFxuICAgICAgY29sdW1uOiBwb3MuY29sdW1uIHx8IG51bGwsXG4gICAgICBvZmZzZXQ6IGlzTmFOKHBvcy5vZmZzZXQpID8gbnVsbCA6IHBvcy5vZmZzZXRcbiAgICB9O1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIEV4cG9zZS4gKi9cbm1vZHVsZS5leHBvcnRzID0gdmlzaXQ7XG5cbi8qIFZpc2l0LiAqL1xuZnVuY3Rpb24gdmlzaXQodHJlZSwgdHlwZSwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvcjtcbiAgICB2aXNpdG9yID0gdHlwZTtcbiAgICB0eXBlID0gbnVsbDtcbiAgfVxuXG4gIG9uZSh0cmVlKTtcblxuICAvKiBWaXNpdCBhIHNpbmdsZSBub2RlLiAqL1xuICBmdW5jdGlvbiBvbmUobm9kZSwgaW5kZXgsIHBhcmVudCkge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICBpbmRleCA9IGluZGV4IHx8IChwYXJlbnQgPyAwIDogbnVsbCk7XG5cbiAgICBpZiAoIXR5cGUgfHwgbm9kZS50eXBlID09PSB0eXBlKSB7XG4gICAgICByZXN1bHQgPSB2aXNpdG9yKG5vZGUsIGluZGV4LCBwYXJlbnQgfHwgbnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgcmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGFsbChub2RlLmNoaWxkcmVuLCBub2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyogVmlzaXQgY2hpbGRyZW4gaW4gYHBhcmVudGAuICovXG4gIGZ1bmN0aW9uIGFsbChjaGlsZHJlbiwgcGFyZW50KSB7XG4gICAgdmFyIHN0ZXAgPSByZXZlcnNlID8gLTEgOiAxO1xuICAgIHZhciBtYXggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgdmFyIG1pbiA9IC0xO1xuICAgIHZhciBpbmRleCA9IChyZXZlcnNlID8gbWF4IDogbWluKSArIHN0ZXA7XG4gICAgdmFyIGNoaWxkO1xuXG4gICAgd2hpbGUgKGluZGV4ID4gbWluICYmIGluZGV4IDwgbWF4KSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTtcblxuICAgICAgaWYgKGNoaWxkICYmIG9uZShjaGlsZCwgaW5kZXgsIHBhcmVudCkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gc3RlcDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBleHRlbmRcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIHZhciB0YXJnZXQgPSB7fVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIG1kYXN0Mmhhc3QgPSByZXF1aXJlKCdtZGFzdC11dGlsLXRvLWhhc3QnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZW1hcmsycmVoeXBlO1xuXG4vKiBBdHRhY2hlci5cbiAqIElmIGEgZGVzdGluYXRpb24gaXMgZ2l2ZW4sIHJ1bnMgdGhlIGRlc3RpbmF0aW9uIHdpdGhcbiAqIHRoZSBuZXcgSEFTVCB0cmVlIChicmlkZ2UtbW9kZSkuXG4gKiBXaXRob3V0IGRlc3RpbmF0aW9uLCByZXR1cm5zIHRoZSBIQVNUIHRyZWU6IGZ1cnRoZXJcbiAqIHBsdWctaW5zIHJ1biBvbiB0aGF0IHRyZWUgKG11dGF0ZS1tb2RlKS4gKi9cbmZ1bmN0aW9uIHJlbWFyazJyZWh5cGUoZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgaWYgKGRlc3RpbmF0aW9uICYmICFkZXN0aW5hdGlvbi5wcm9jZXNzKSB7XG4gICAgb3B0aW9ucyA9IGRlc3RpbmF0aW9uO1xuICAgIGRlc3RpbmF0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBkZXN0aW5hdGlvbiA/IGJyaWRnZShkZXN0aW5hdGlvbiwgb3B0aW9ucykgOiBtdXRhdGUob3B0aW9ucyk7XG59XG5cbi8qIEJyaWRnZS1tb2RlLiAgUnVucyB0aGUgZGVzdGluYXRpb24gd2l0aCB0aGUgbmV3IEhBU1RcbiAqIHRyZWUuICovXG5mdW5jdGlvbiBicmlkZ2UoZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyO1xuICBmdW5jdGlvbiB0cmFuc2Zvcm1lcihub2RlLCBmaWxlLCBuZXh0KSB7XG4gICAgZGVzdGluYXRpb24ucnVuKG1kYXN0Mmhhc3Qobm9kZSwgb3B0aW9ucyksIGZpbGUsIGRvbmUpO1xuICAgIGZ1bmN0aW9uIGRvbmUoZXJyKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgfVxuICB9XG59XG5cbi8qIE11dGF0ZS1tb2RlLiAgRnVydGhlciB0cmFuc2Zvcm1lcnMgcnVuIG9uIHRoZSBIQVNUIHRyZWUuICovXG5mdW5jdGlvbiBtdXRhdGUob3B0aW9ucykge1xuICByZXR1cm4gdHJhbnNmb3JtZXI7XG4gIGZ1bmN0aW9uIHRyYW5zZm9ybWVyKG5vZGUpIHtcbiAgICByZXR1cm4gbWRhc3QyaGFzdChub2RlLCBvcHRpb25zKTtcbiAgfVxufVxuIl19
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var emoji = require('emoji-regex')
module.exports = BananaSlug
function BananaSlug () {
var self = this
if (!(self instanceof BananaSlug)) return new BananaSlug()
self.reset()
}
/**
* Generate a unique slug.
* @param {string} value String of text to slugify
* @return {string} A unique slug string
*/
BananaSlug.prototype.slug = function (value) {
var self = this
var slug = slugger(value)
var occurrences = self.occurrences[slug]
if (self.occurrences.hasOwnProperty(slug)) {
occurrences++
} else {
occurrences = 0
}
self.occurrences[slug] = occurrences
if (occurrences) {
slug = slug + '-' + occurrences
}
return slug
}
/**
* Reset - Forget all previous slugs
* @return void
*/
BananaSlug.prototype.reset = function () {
this.occurrences = {}
}
var whitespace = /\s/g
function lower (string) {
return string.toLowerCase()
}
function slugger (string) {
var re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g
var maintainCase = false
var replacement = '-'
if (typeof string !== 'string') return ''
if (!maintainCase) string = string.replace(/[A-Z]+/g, lower)
return string.trim()
.replace(re, '')
.replace(emoji(), '')
.replace(whitespace, replacement)
}
},{"emoji-regex":2}],2:[function(require,module,exports){
module.exports = function() {
return /[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267B\u267F\u2692-\u2694\u2696\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD79\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED0\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3]|\uD83E[\uDD10-\uDD18\uDD80-\uDD84\uDDC0]|\uD83C\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uD83C\uDDFE\uD83C[\uDDEA\uDDF9]|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDFC\uD83C[\uDDEB\uDDF8]|\uD83C\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uD83C\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF8\uDDFE\uDDFF]|\uD83C\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uD83C\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uD83C\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uD83C\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uD83C\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uD83C\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uD83C\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uD83C\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uD83C\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uD83C\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uD83C\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uD83C\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uD83C\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uD83C\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uD83C\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uD83C\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|[#\*0-9]\u20E3/g;
};
},{}],3:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module hast:util:has-property
* @fileoverview Check whether a node has a property.
*/
'use strict';
/* eslint-env commonjs */
/*
* Methods.
*/
var has = Object.prototype.hasOwnProperty;
/**
* Check if `node` has `name`.
*
* @param {Node?} node - Node to check.
* @param {string} name - Property to check.
* @return {boolean} - Whether `node` has `name`.
*/
function hasProperty(node, name) {
var props;
var value;
if (
!node ||
!name ||
typeof node !== 'object' ||
node.type !== 'element'
) {
return false;
}
props = node.properties;
value = props && has.call(props, name) && node.properties[name];
return value !== null && value !== undefined && value !== false;
}
/*
* Expose.
*/
module.exports = hasProperty;
},{}],4:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module rehype:lint:util:is-element
*/
'use strict';
/* eslint-env commonjs */
/**
* Check if a node is a (certain) element.
*
* @param {*} node - Thing to check.
* @param {string|Array.<string>?} [tagNames] - Name of element.
* @return {boolean} - Whether a node is a (certain) element.
* @throws {Error} - When `tagNames` is given but invalid.
*/
function isElement(node, tagNames) {
var name;
if (
!(
tagNames === null ||
tagNames === undefined ||
typeof tagNames === 'string' ||
(typeof tagNames === 'object' && tagNames.length)
)
) {
throw new Error(
'Expected `string` or `Array.<string>` for ' +
'`tagNames`, not `' + tagNames + '`'
);
}
if (
!node ||
typeof node !== 'object' ||
node.type !== 'element' ||
typeof node.tagName !== 'string'
) {
return false;
}
if (tagNames === null || tagNames === undefined) {
return true;
}
name = node.tagName;
if (typeof tagNames === 'string') {
return name === tagNames;
}
return tagNames.indexOf(name) !== -1;
}
/*
* Expose.
*/
module.exports = isElement;
},{}],5:[function(require,module,exports){
/**
* @fileoverview
* Get the plain-text value of a HAST node.
* @longdescription
* ## Usage
*
* ```javascript
* var h = require('hastscript');
* var toString = require('hast-util-to-string');
*
* toString(h('p', 'Alpha'));
* //=> 'Alpha'
* toString(h('div', [h('b', 'Bold'), ' and ', h('i', 'italic'), '.']));
* //=> 'Bold and italic.'
* ```
*
* ## API
*
* ### `toString(node)`
*
* Transform a node to string.
*/
'use strict';
module.exports = toString;
function toString(node) {
/* “The concatenation of data of all the Text node descendants
* of the context object, in tree order.” */
if ('children' in node) {
return all(node);
}
/* “Context object’s data.” */
return 'value' in node ? node.value : '';
}
function one(node) {
if (node.type === 'text') {
return node.value;
}
return node.children ? all(node) : '';
}
function all(node) {
var children = node.children;
var length = children.length;
var index = -1;
var result = [];
while (++index < length) {
result[index] = one(children[index]);
}
return result.join('');
}
},{}],6:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = visit;
/* Visit. */
function visit(tree, type, visitor, reverse) {
if (typeof type === 'function') {
reverse = visitor;
visitor = type;
type = null;
}
one(tree);
/* Visit a single node. */
function one(node, index, parent) {
var result;
index = index || (parent ? 0 : null);
if (!type || node.type === type) {
result = visitor(node, index, parent || null);
}
if (node.children && result !== false) {
return all(node.children, node);
}
return result;
}
/* Visit children in `parent`. */
function all(children, parent) {
var step = reverse ? -1 : 1;
var max = children.length;
var min = -1;
var index = (reverse ? max : min) + step;
var child;
while (index > min && index < max) {
child = children[index];
if (child && one(child, index, parent) === false) {
return false;
}
index += step;
}
return true;
}
}
},{}],"rehype-slug":[function(require,module,exports){
'use strict';
var slugs = require('github-slugger')();
var visit = require('unist-util-visit');
var toString = require('hast-util-to-string');
var is = require('hast-util-is-element');
var has = require('hast-util-has-property');
module.exports = slug;
var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
function slug() {
return transformer;
}
function transformer(tree) {
slugs.reset();
visit(tree, 'element', function (node) {
if (is(node, headings) && !has(node, 'id')) {
node.properties.id = slugs.slug(toString(node));
}
});
}
},{"github-slugger":1,"hast-util-has-property":3,"hast-util-is-element":4,"hast-util-to-string":5,"unist-util-visit":6}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9naXRodWItc2x1Z2dlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9naXRodWItc2x1Z2dlci9ub2RlX21vZHVsZXMvZW1vamktcmVnZXgvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaGFzdC11dGlsLWhhcy1wcm9wZXJ0eS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtaXMtZWxlbWVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtdG8tc3RyaW5nL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiLCJyZWh5cGUtc2x1ZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJ2YXIgZW1vamkgPSByZXF1aXJlKCdlbW9qaS1yZWdleCcpXG5cbm1vZHVsZS5leHBvcnRzID0gQmFuYW5hU2x1Z1xuXG5mdW5jdGlvbiBCYW5hbmFTbHVnICgpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBCYW5hbmFTbHVnKSkgcmV0dXJuIG5ldyBCYW5hbmFTbHVnKClcblxuICBzZWxmLnJlc2V0KClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHVuaXF1ZSBzbHVnLlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBTdHJpbmcgb2YgdGV4dCB0byBzbHVnaWZ5XG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgIEEgdW5pcXVlIHNsdWcgc3RyaW5nXG4gKi9cbkJhbmFuYVNsdWcucHJvdG90eXBlLnNsdWcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIHZhciBzbHVnID0gc2x1Z2dlcih2YWx1ZSlcbiAgdmFyIG9jY3VycmVuY2VzID0gc2VsZi5vY2N1cnJlbmNlc1tzbHVnXVxuXG4gIGlmIChzZWxmLm9jY3VycmVuY2VzLmhhc093blByb3BlcnR5KHNsdWcpKSB7XG4gICAgb2NjdXJyZW5jZXMrK1xuICB9IGVsc2Uge1xuICAgIG9jY3VycmVuY2VzID0gMFxuICB9XG5cbiAgc2VsZi5vY2N1cnJlbmNlc1tzbHVnXSA9IG9jY3VycmVuY2VzXG5cbiAgaWYgKG9jY3VycmVuY2VzKSB7XG4gICAgc2x1ZyA9IHNsdWcgKyAnLScgKyBvY2N1cnJlbmNlc1xuICB9XG5cbiAgcmV0dXJuIHNsdWdcbn1cblxuLyoqXG4gKiBSZXNldCAtIEZvcmdldCBhbGwgcHJldmlvdXMgc2x1Z3NcbiAqIEByZXR1cm4gdm9pZFxuICovXG5CYW5hbmFTbHVnLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5vY2N1cnJlbmNlcyA9IHt9XG59XG5cbnZhciB3aGl0ZXNwYWNlID0gL1xccy9nXG5cbmZ1bmN0aW9uIGxvd2VyIChzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIHNsdWdnZXIgKHN0cmluZykge1xuICB2YXIgcmUgPSAvW1xcdTIwMDAtXFx1MjA2RlxcdTJFMDAtXFx1MkU3RlxcXFwnIVwiIyQlJigpKissLi86Ozw9Pj9AW1xcXV5ge3x9fl0vZ1xuICB2YXIgbWFpbnRhaW5DYXNlID0gZmFsc2VcbiAgdmFyIHJlcGxhY2VtZW50ID0gJy0nXG5cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSByZXR1cm4gJydcbiAgaWYgKCFtYWludGFpbkNhc2UpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9bQS1aXSsvZywgbG93ZXIpXG4gIHJldHVybiBzdHJpbmcudHJpbSgpXG4gICAgLnJlcGxhY2UocmUsICcnKVxuICAgIC5yZXBsYWNlKGVtb2ppKCksICcnKVxuICAgIC5yZXBsYWNlKHdoaXRlc3BhY2UsIHJlcGxhY2VtZW50KVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIC9bXFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMUFcXHUyMzFCXFx1MjMyOFxcdTIzQ0ZcXHUyM0U5LVxcdTIzRjNcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkItXFx1MjVGRVxcdTI2MDAtXFx1MjYwNFxcdTI2MEVcXHUyNjExXFx1MjYxNFxcdTI2MTVcXHUyNjE4XFx1MjYxRFxcdTI2MjBcXHUyNjIyXFx1MjYyM1xcdTI2MjZcXHUyNjJBXFx1MjYyRVxcdTI2MkZcXHUyNjM4LVxcdTI2M0FcXHUyNjQ4LVxcdTI2NTNcXHUyNjYwXFx1MjY2M1xcdTI2NjVcXHUyNjY2XFx1MjY2OFxcdTI2N0JcXHUyNjdGXFx1MjY5Mi1cXHUyNjk0XFx1MjY5NlxcdTI2OTdcXHUyNjk5XFx1MjY5QlxcdTI2OUNcXHUyNkEwXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCMFxcdTI2QjFcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDOFxcdTI2Q0VcXHUyNkNGXFx1MjZEMVxcdTI2RDNcXHUyNkQ0XFx1MjZFOVxcdTI2RUFcXHUyNkYwLVxcdTI2RjVcXHUyNkY3LVxcdTI2RkFcXHUyNkZEXFx1MjcwMlxcdTI3MDVcXHUyNzA4LVxcdTI3MERcXHUyNzBGXFx1MjcxMlxcdTI3MTRcXHUyNzE2XFx1MjcxRFxcdTI3MjFcXHUyNzI4XFx1MjczM1xcdTI3MzRcXHUyNzQ0XFx1Mjc0N1xcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3NjNcXHUyNzY0XFx1Mjc5NS1cXHUyNzk3XFx1MjdBMVxcdTI3QjBcXHUyN0JGXFx1MjkzNFxcdTI5MzVcXHUyQjA1LVxcdTJCMDdcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XFx1MzAzMFxcdTMwM0RcXHUzMjk3XFx1MzI5OV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdURENzBcXHVERDcxXFx1REQ3RVxcdUREN0ZcXHVERDhFXFx1REQ5MS1cXHVERDlBXFx1REUwMVxcdURFMDJcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIxXFx1REYyNC1cXHVERjkzXFx1REY5NlxcdURGOTdcXHVERjk5LVxcdURGOUJcXHVERjlFLVxcdURGRjBcXHVERkYzLVxcdURGRjVcXHVERkY3LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQ0ZEXFx1RENGRi1cXHVERDNEXFx1REQ0OS1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ2RlxcdURENzBcXHVERDczLVxcdURENzlcXHVERDg3XFx1REQ4QS1cXHVERDhEXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQwXFx1REVFMC1cXHVERUU1XFx1REVFOVxcdURFRUJcXHVERUVDXFx1REVGMFxcdURFRjNdfFxcdUQ4M0VbXFx1REQxMC1cXHVERDE4XFx1REQ4MC1cXHVERDg0XFx1RERDMF18XFx1RDgzQ1xcdURERkZcXHVEODNDW1xcdURERTZcXHVEREYyXFx1RERGQ118XFx1RDgzQ1xcdURERkVcXHVEODNDW1xcdURERUFcXHVEREY5XXxcXHVEODNDXFx1RERGRFxcdUQ4M0NcXHVEREYwfFxcdUQ4M0NcXHVEREZDXFx1RDgzQ1tcXHVEREVCXFx1RERGOF18XFx1RDgzQ1xcdURERkJcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdfFxcdUQ4M0NcXHVEREZBXFx1RDgzQ1tcXHVEREU2XFx1RERFQ1xcdURERjJcXHVEREY4XFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREY5XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERTlcXHVEREVCLVxcdURERURcXHVEREVGLVxcdURERjRcXHVEREY3XFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRl18XFx1RDgzQ1xcdURERjhcXHVEODNDW1xcdURERTYtXFx1RERFQVxcdURERUMtXFx1RERGNFxcdURERjctXFx1RERGOVxcdURERkJcXHVEREZELVxcdURERkZdfFxcdUQ4M0NcXHVEREY3XFx1RDgzQ1tcXHVEREVBXFx1RERGNFxcdURERjhcXHVEREZBXFx1RERGQ118XFx1RDgzQ1xcdURERjZcXHVEODNDXFx1RERFNnxcXHVEODNDXFx1RERGNVxcdUQ4M0NbXFx1RERFNlxcdURERUEtXFx1RERFRFxcdURERjAtXFx1RERGM1xcdURERjctXFx1RERGOVxcdURERkNcXHVEREZFXXxcXHVEODNDXFx1RERGNFxcdUQ4M0NcXHVEREYyfFxcdUQ4M0NcXHVEREYzXFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdfFxcdUQ4M0NcXHVEREYyXFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXXxcXHVEODNDXFx1RERGMVxcdUQ4M0NbXFx1RERFNi1cXHVEREU4XFx1RERFRVxcdURERjBcXHVEREY3LVxcdURERkJcXHVEREZFXXxcXHVEODNDXFx1RERGMFxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREVGXFx1RDgzQ1tcXHVEREVBXFx1RERGMlxcdURERjRcXHVEREY1XXxcXHVEODNDXFx1RERFRVxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XXxcXHVEODNDXFx1RERFRFxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXXxcXHVEODNDXFx1RERFQ1xcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV18XFx1RDgzQ1xcdURERUJcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN118XFx1RDgzQ1xcdURERUFcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXXxcXHVEODNDXFx1RERFOVxcdUQ4M0NbXFx1RERFQVxcdURERUNcXHVEREVGXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGRl18XFx1RDgzQ1xcdURERThcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRVxcdURERjAtXFx1RERGNVxcdURERjdcXHVEREZBLVxcdURERkZdfFxcdUQ4M0NcXHVEREU3XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdfFxcdUQ4M0NcXHVEREU2XFx1RDgzQ1tcXHVEREU4LVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjJcXHVEREY0XFx1RERGNi1cXHVEREZBXFx1RERGQ1xcdURERkRcXHVEREZGXXxbI1xcKjAtOV1cXHUyMEUzL2c7XG59O1xuIiwiLyoqXG4gKiBAYXV0aG9yIFRpdHVzIFdvcm1lclxuICogQGNvcHlyaWdodCAyMDE2IFRpdHVzIFdvcm1lclxuICogQGxpY2Vuc2UgTUlUXG4gKiBAbW9kdWxlIGhhc3Q6dXRpbDpoYXMtcHJvcGVydHlcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciBhIG5vZGUgaGFzIGEgcHJvcGVydHkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qXG4gKiBNZXRob2RzLlxuICovXG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrIGlmIGBub2RlYCBoYXMgYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7Tm9kZT99IG5vZGUgLSBOb2RlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBQcm9wZXJ0eSB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBgbm9kZWAgaGFzIGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gaGFzUHJvcGVydHkobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wcztcbiAgICB2YXIgdmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgICFuYW1lIHx8XG4gICAgICAgIHR5cGVvZiBub2RlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBub2RlLnR5cGUgIT09ICdlbGVtZW50J1xuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvcHMgPSBub2RlLnByb3BlcnRpZXM7XG4gICAgdmFsdWUgPSBwcm9wcyAmJiBoYXMuY2FsbChwcm9wcywgbmFtZSkgJiYgbm9kZS5wcm9wZXJ0aWVzW25hbWVdO1xuXG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKlxuICogRXhwb3NlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gaGFzUHJvcGVydHk7XG4iLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgcmVoeXBlOmxpbnQ6dXRpbDppcy1lbGVtZW50XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBlc2xpbnQtZW52IGNvbW1vbmpzICovXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBub2RlIGlzIGEgKGNlcnRhaW4pIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSBub2RlIC0gVGhpbmcgdG8gY2hlY2suXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheS48c3RyaW5nPj99IFt0YWdOYW1lc10gLSBOYW1lIG9mIGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSAtIFdoZXRoZXIgYSBub2RlIGlzIGEgKGNlcnRhaW4pIGVsZW1lbnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBXaGVuIGB0YWdOYW1lc2AgaXMgZ2l2ZW4gYnV0IGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlLCB0YWdOYW1lcykge1xuICAgIHZhciBuYW1lO1xuXG4gICAgaWYgKFxuICAgICAgICAhKFxuICAgICAgICAgICAgdGFnTmFtZXMgPT09IG51bGwgfHxcbiAgICAgICAgICAgIHRhZ05hbWVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0YWdOYW1lcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICh0eXBlb2YgdGFnTmFtZXMgPT09ICdvYmplY3QnICYmIHRhZ05hbWVzLmxlbmd0aClcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRXhwZWN0ZWQgYHN0cmluZ2Agb3IgYEFycmF5LjxzdHJpbmc+YCBmb3IgJyArXG4gICAgICAgICAgICAnYHRhZ05hbWVzYCwgbm90IGAnICsgdGFnTmFtZXMgKyAnYCdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgIHR5cGVvZiBub2RlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBub2RlLnR5cGUgIT09ICdlbGVtZW50JyB8fFxuICAgICAgICB0eXBlb2Ygbm9kZS50YWdOYW1lICE9PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRhZ05hbWVzID09PSBudWxsIHx8IHRhZ05hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbmFtZSA9IG5vZGUudGFnTmFtZTtcblxuICAgIGlmICh0eXBlb2YgdGFnTmFtZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBuYW1lID09PSB0YWdOYW1lcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnTmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBpc0VsZW1lbnQ7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqICAgR2V0IHRoZSBwbGFpbi10ZXh0IHZhbHVlIG9mIGEgSEFTVCBub2RlLlxuICogQGxvbmdkZXNjcmlwdGlvblxuICogICAjIyBVc2FnZVxuICpcbiAqICAgYGBgamF2YXNjcmlwdFxuICogICB2YXIgaCA9IHJlcXVpcmUoJ2hhc3RzY3JpcHQnKTtcbiAqICAgdmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnaGFzdC11dGlsLXRvLXN0cmluZycpO1xuICpcbiAqICAgdG9TdHJpbmcoaCgncCcsICdBbHBoYScpKTtcbiAqICAgLy89PiAnQWxwaGEnXG4gKiAgIHRvU3RyaW5nKGgoJ2RpdicsIFtoKCdiJywgJ0JvbGQnKSwgJyBhbmQgJywgaCgnaScsICdpdGFsaWMnKSwgJy4nXSkpO1xuICogICAvLz0+ICdCb2xkIGFuZCBpdGFsaWMuJ1xuICogICBgYGBcbiAqXG4gKiAgICMjIEFQSVxuICpcbiAqICAgIyMjIGB0b1N0cmluZyhub2RlKWBcbiAqXG4gKiAgIFRyYW5zZm9ybSBhIG5vZGUgdG8gc3RyaW5nLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB0b1N0cmluZztcblxuZnVuY3Rpb24gdG9TdHJpbmcobm9kZSkge1xuICAvKiDigJxUaGUgY29uY2F0ZW5hdGlvbiBvZiBkYXRhIG9mIGFsbCB0aGUgVGV4dCBub2RlIGRlc2NlbmRhbnRzXG4gICAqIG9mIHRoZSBjb250ZXh0IG9iamVjdCwgaW4gdHJlZSBvcmRlci7igJ0gKi9cbiAgaWYgKCdjaGlsZHJlbicgaW4gbm9kZSkge1xuICAgIHJldHVybiBhbGwobm9kZSk7XG4gIH1cblxuICAvKiDigJxDb250ZXh0IG9iamVjdOKAmXMgZGF0YS7igJ0gKi9cbiAgcmV0dXJuICd2YWx1ZScgaW4gbm9kZSA/IG5vZGUudmFsdWUgOiAnJztcbn1cblxuZnVuY3Rpb24gb25lKG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gbm9kZS5jaGlsZHJlbiA/IGFsbChub2RlKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBhbGwobm9kZSkge1xuICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IG9uZShjaGlsZHJlbltpbmRleF0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB2aXNpdDtcblxuLyogVmlzaXQuICovXG5mdW5jdGlvbiB2aXNpdCh0cmVlLCB0eXBlLCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yO1xuICAgIHZpc2l0b3IgPSB0eXBlO1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG5cbiAgb25lKHRyZWUpO1xuXG4gIC8qIFZpc2l0IGEgc2luZ2xlIG5vZGUuICovXG4gIGZ1bmN0aW9uIG9uZShub2RlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIGluZGV4ID0gaW5kZXggfHwgKHBhcmVudCA/IDAgOiBudWxsKTtcblxuICAgIGlmICghdHlwZSB8fCBub2RlLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJlc3VsdCA9IHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudCB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gYWxsKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiBWaXNpdCBjaGlsZHJlbiBpbiBgcGFyZW50YC4gKi9cbiAgZnVuY3Rpb24gYWxsKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICB2YXIgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7XG4gICAgdmFyIG1heCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICB2YXIgbWluID0gLTE7XG4gICAgdmFyIGluZGV4ID0gKHJldmVyc2UgPyBtYXggOiBtaW4pICsgc3RlcDtcbiAgICB2YXIgY2hpbGQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPiBtaW4gJiYgaW5kZXggPCBtYXgpIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpZiAoY2hpbGQgJiYgb25lKGNoaWxkLCBpbmRleCwgcGFyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbHVncyA9IHJlcXVpcmUoJ2dpdGh1Yi1zbHVnZ2VyJykoKTtcbnZhciB2aXNpdCA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtdmlzaXQnKTtcbnZhciB0b1N0cmluZyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC10by1zdHJpbmcnKTtcbnZhciBpcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1pcy1lbGVtZW50Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnaGFzdC11dGlsLWhhcy1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNsdWc7XG5cbnZhciBoZWFkaW5ncyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXTtcblxuZnVuY3Rpb24gc2x1ZygpIHtcbiAgcmV0dXJuIHRyYW5zZm9ybWVyO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1lcih0cmVlKSB7XG4gIHNsdWdzLnJlc2V0KCk7XG5cbiAgdmlzaXQodHJlZSwgJ2VsZW1lbnQnLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChpcyhub2RlLCBoZWFkaW5ncykgJiYgIWhhcyhub2RlLCAnaWQnKSkge1xuICAgICAgbm9kZS5wcm9wZXJ0aWVzLmlkID0gc2x1Z3Muc2x1Zyh0b1N0cmluZyhub2RlKSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module hast:util:has-property
* @fileoverview Check whether a node has a property.
*/
'use strict';
/* eslint-env commonjs */
/*
* Methods.
*/
var has = Object.prototype.hasOwnProperty;
/**
* Check if `node` has `name`.
*
* @param {Node?} node - Node to check.
* @param {string} name - Property to check.
* @return {boolean} - Whether `node` has `name`.
*/
function hasProperty(node, name) {
var props;
var value;
if (
!node ||
!name ||
typeof node !== 'object' ||
node.type !== 'element'
) {
return false;
}
props = node.properties;
value = props && has.call(props, name) && node.properties[name];
return value !== null && value !== undefined && value !== false;
}
/*
* Expose.
*/
module.exports = hasProperty;
},{}],2:[function(require,module,exports){
/**
* @author Titus Wormer
* @copyright 2016 Titus Wormer
* @license MIT
* @module rehype:lint:util:is-element
*/
'use strict';
/* eslint-env commonjs */
/**
* Check if a node is a (certain) element.
*
* @param {*} node - Thing to check.
* @param {string|Array.<string>?} [tagNames] - Name of element.
* @return {boolean} - Whether a node is a (certain) element.
* @throws {Error} - When `tagNames` is given but invalid.
*/
function isElement(node, tagNames) {
var name;
if (
!(
tagNames === null ||
tagNames === undefined ||
typeof tagNames === 'string' ||
(typeof tagNames === 'object' && tagNames.length)
)
) {
throw new Error(
'Expected `string` or `Array.<string>` for ' +
'`tagNames`, not `' + tagNames + '`'
);
}
if (
!node ||
typeof node !== 'object' ||
node.type !== 'element' ||
typeof node.tagName !== 'string'
) {
return false;
}
if (tagNames === null || tagNames === undefined) {
return true;
}
name = node.tagName;
if (typeof tagNames === 'string') {
return name === tagNames;
}
return tagNames.indexOf(name) !== -1;
}
/*
* Expose.
*/
module.exports = isElement;
},{}],3:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = visit;
/* Visit. */
function visit(tree, type, visitor, reverse) {
if (typeof type === 'function') {
reverse = visitor;
visitor = type;
type = null;
}
one(tree);
/* Visit a single node. */
function one(node, index, parent) {
var result;
index = index || (parent ? 0 : null);
if (!type || node.type === type) {
result = visitor(node, index, parent || null);
}
if (node.children && result !== false) {
return all(node.children, node);
}
return result;
}
/* Visit children in `parent`. */
function all(children, parent) {
var step = reverse ? -1 : 1;
var max = children.length;
var min = -1;
var index = (reverse ? max : min) + step;
var child;
while (index > min && index < max) {
child = children[index];
if (child && one(child, index, parent) === false) {
return false;
}
index += step;
}
return true;
}
}
},{}],4:[function(require,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],"rehype-autolink-headings":[function(require,module,exports){
'use strict';
var xtend = require('xtend');
var visit = require('unist-util-visit');
var has = require('hast-util-has-property');
var is = require('hast-util-is-element');
module.exports = autolink;
var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
var methods = {prepend: 'unshift', append: 'push'};
var contentDefaults = {
type: 'element',
tagName: 'span',
properties: {className: ['icon', 'icon-link']}
};
function autolink(options) {
var settings = options || {};
var props = settings.properties;
var behavior = settings.behaviour || settings.behavior || 'prepend';
var content = settings.content || contentDefaults;
var fn = behavior === 'wrap' ? wrap : inject;
if (behavior !== 'wrap' && !props) {
props = {ariaHidden: true};
}
if (content && typeof content === 'object' && !('length' in content)) {
content = [content];
}
return transformer;
function transformer(tree) {
visit(tree, visitor);
}
function visitor(node) {
if (is(node, headings) && has(node, 'id')) {
fn(node);
}
}
function wrap(node) {
var child = icon(node);
child.children = node.children;
node.children = [child];
}
function inject(node) {
var child = icon(node);
child.children = content.concat();
node.children[methods[behavior]](child);
}
function icon(node) {
return {
type: 'element',
tagName: 'a',
properties: xtend(props, {href: '#' + node.properties.id})
};
}
}
},{"hast-util-has-property":1,"hast-util-is-element":2,"unist-util-visit":3,"xtend":4}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9oYXN0LXV0aWwtaGFzLXByb3BlcnR5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhc3QtdXRpbC1pcy1lbGVtZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiwicmVoeXBlLWF1dG9saW5rLWhlYWRpbmdzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKipcbiAqIEBhdXRob3IgVGl0dXMgV29ybWVyXG4gKiBAY29weXJpZ2h0IDIwMTYgVGl0dXMgV29ybWVyXG4gKiBAbGljZW5zZSBNSVRcbiAqIEBtb2R1bGUgaGFzdDp1dGlsOmhhcy1wcm9wZXJ0eVxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIGEgbm9kZSBoYXMgYSBwcm9wZXJ0eS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLypcbiAqIE1ldGhvZHMuXG4gKi9cblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYG5vZGVgIGhhcyBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtOb2RlP30gbm9kZSAtIE5vZGUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFByb3BlcnR5IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gLSBXaGV0aGVyIGBub2RlYCBoYXMgYG5hbWVgLlxuICovXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShub2RlLCBuYW1lKSB7XG4gICAgdmFyIHByb3BzO1xuICAgIHZhciB2YWx1ZTtcblxuICAgIGlmIChcbiAgICAgICAgIW5vZGUgfHxcbiAgICAgICAgIW5hbWUgfHxcbiAgICAgICAgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8XG4gICAgICAgIG5vZGUudHlwZSAhPT0gJ2VsZW1lbnQnXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wcyA9IG5vZGUucHJvcGVydGllcztcbiAgICB2YWx1ZSA9IHByb3BzICYmIGhhcy5jYWxsKHByb3BzLCBuYW1lKSAmJiBub2RlLnByb3BlcnRpZXNbbmFtZV07XG5cbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2U7XG59XG5cbi8qXG4gKiBFeHBvc2UuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNQcm9wZXJ0eTtcbiIsIi8qKlxuICogQGF1dGhvciBUaXR1cyBXb3JtZXJcbiAqIEBjb3B5cmlnaHQgMjAxNiBUaXR1cyBXb3JtZXJcbiAqIEBsaWNlbnNlIE1JVFxuICogQG1vZHVsZSByZWh5cGU6bGludDp1dGlsOmlzLWVsZW1lbnRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgY29tbW9uanMgKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhIG5vZGUgaXMgYSAoY2VydGFpbikgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IG5vZGUgLSBUaGluZyB0byBjaGVjay5cbiAqIEBwYXJhbSB7c3RyaW5nfEFycmF5LjxzdHJpbmc+P30gW3RhZ05hbWVzXSAtIE5hbWUgb2YgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IC0gV2hldGhlciBhIG5vZGUgaXMgYSAoY2VydGFpbikgZWxlbWVudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFdoZW4gYHRhZ05hbWVzYCBpcyBnaXZlbiBidXQgaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50KG5vZGUsIHRhZ05hbWVzKSB7XG4gICAgdmFyIG5hbWU7XG5cbiAgICBpZiAoXG4gICAgICAgICEoXG4gICAgICAgICAgICB0YWdOYW1lcyA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdGFnTmFtZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRhZ05hbWVzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHR5cGVvZiB0YWdOYW1lcyA9PT0gJ29iamVjdCcgJiYgdGFnTmFtZXMubGVuZ3RoKVxuICAgICAgICApXG4gICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdFeHBlY3RlZCBgc3RyaW5nYCBvciBgQXJyYXkuPHN0cmluZz5gIGZvciAnICtcbiAgICAgICAgICAgICdgdGFnTmFtZXNgLCBub3QgYCcgKyB0YWdOYW1lcyArICdgJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgIW5vZGUgfHxcbiAgICAgICAgdHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8XG4gICAgICAgIG5vZGUudHlwZSAhPT0gJ2VsZW1lbnQnIHx8XG4gICAgICAgIHR5cGVvZiBub2RlLnRhZ05hbWUgIT09ICdzdHJpbmcnXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGFnTmFtZXMgPT09IG51bGwgfHwgdGFnTmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBuYW1lID0gbm9kZS50YWdOYW1lO1xuXG4gICAgaWYgKHR5cGVvZiB0YWdOYW1lcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgPT09IHRhZ05hbWVzO1xuICAgIH1cblxuICAgIHJldHVybiB0YWdOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbn1cblxuLypcbiAqIEV4cG9zZS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRWxlbWVudDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogRXhwb3NlLiAqL1xubW9kdWxlLmV4cG9ydHMgPSB2aXNpdDtcblxuLyogVmlzaXQuICovXG5mdW5jdGlvbiB2aXNpdCh0cmVlLCB0eXBlLCB2aXNpdG9yLCByZXZlcnNlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldmVyc2UgPSB2aXNpdG9yO1xuICAgIHZpc2l0b3IgPSB0eXBlO1xuICAgIHR5cGUgPSBudWxsO1xuICB9XG5cbiAgb25lKHRyZWUpO1xuXG4gIC8qIFZpc2l0IGEgc2luZ2xlIG5vZGUuICovXG4gIGZ1bmN0aW9uIG9uZShub2RlLCBpbmRleCwgcGFyZW50KSB7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIGluZGV4ID0gaW5kZXggfHwgKHBhcmVudCA/IDAgOiBudWxsKTtcblxuICAgIGlmICghdHlwZSB8fCBub2RlLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJlc3VsdCA9IHZpc2l0b3Iobm9kZSwgaW5kZXgsIHBhcmVudCB8fCBudWxsKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiByZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gYWxsKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiBWaXNpdCBjaGlsZHJlbiBpbiBgcGFyZW50YC4gKi9cbiAgZnVuY3Rpb24gYWxsKGNoaWxkcmVuLCBwYXJlbnQpIHtcbiAgICB2YXIgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDE7XG4gICAgdmFyIG1heCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICB2YXIgbWluID0gLTE7XG4gICAgdmFyIGluZGV4ID0gKHJldmVyc2UgPyBtYXggOiBtaW4pICsgc3RlcDtcbiAgICB2YXIgY2hpbGQ7XG5cbiAgICB3aGlsZSAoaW5kZXggPiBtaW4gJiYgaW5kZXggPCBtYXgpIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICBpZiAoY2hpbGQgJiYgb25lKGNoaWxkLCBpbmRleCwgcGFyZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSBzdGVwO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGV4dGVuZFxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gICAgdmFyIHRhcmdldCA9IHt9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldXG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgeHRlbmQgPSByZXF1aXJlKCd4dGVuZCcpO1xudmFyIHZpc2l0ID0gcmVxdWlyZSgndW5pc3QtdXRpbC12aXNpdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1oYXMtcHJvcGVydHknKTtcbnZhciBpcyA9IHJlcXVpcmUoJ2hhc3QtdXRpbC1pcy1lbGVtZW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYXV0b2xpbms7XG5cbnZhciBoZWFkaW5ncyA9IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnXTtcbnZhciBtZXRob2RzID0ge3ByZXBlbmQ6ICd1bnNoaWZ0JywgYXBwZW5kOiAncHVzaCd9O1xudmFyIGNvbnRlbnREZWZhdWx0cyA9IHtcbiAgdHlwZTogJ2VsZW1lbnQnLFxuICB0YWdOYW1lOiAnc3BhbicsXG4gIHByb3BlcnRpZXM6IHtjbGFzc05hbWU6IFsnaWNvbicsICdpY29uLWxpbmsnXX1cbn07XG5cbmZ1bmN0aW9uIGF1dG9saW5rKG9wdGlvbnMpIHtcbiAgdmFyIHNldHRpbmdzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHByb3BzID0gc2V0dGluZ3MucHJvcGVydGllcztcbiAgdmFyIGJlaGF2aW9yID0gc2V0dGluZ3MuYmVoYXZpb3VyIHx8IHNldHRpbmdzLmJlaGF2aW9yIHx8ICdwcmVwZW5kJztcbiAgdmFyIGNvbnRlbnQgPSBzZXR0aW5ncy5jb250ZW50IHx8IGNvbnRlbnREZWZhdWx0cztcbiAgdmFyIGZuID0gYmVoYXZpb3IgPT09ICd3cmFwJyA/IHdyYXAgOiBpbmplY3Q7XG5cbiAgaWYgKGJlaGF2aW9yICE9PSAnd3JhcCcgJiYgIXByb3BzKSB7XG4gICAgcHJvcHMgPSB7YXJpYUhpZGRlbjogdHJ1ZX07XG4gIH1cblxuICBpZiAoY29udGVudCAmJiB0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgISgnbGVuZ3RoJyBpbiBjb250ZW50KSkge1xuICAgIGNvbnRlbnQgPSBbY29udGVudF07XG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3JtZXI7XG5cbiAgZnVuY3Rpb24gdHJhbnNmb3JtZXIodHJlZSkge1xuICAgIHZpc2l0KHRyZWUsIHZpc2l0b3IpO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaXRvcihub2RlKSB7XG4gICAgaWYgKGlzKG5vZGUsIGhlYWRpbmdzKSAmJiBoYXMobm9kZSwgJ2lkJykpIHtcbiAgICAgIGZuKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAobm9kZSkge1xuICAgIHZhciBjaGlsZCA9IGljb24obm9kZSk7XG4gICAgY2hpbGQuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIG5vZGUuY2hpbGRyZW4gPSBbY2hpbGRdO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5qZWN0KG5vZGUpIHtcbiAgICB2YXIgY2hpbGQgPSBpY29uKG5vZGUpO1xuICAgIGNoaWxkLmNoaWxkcmVuID0gY29udGVudC5jb25jYXQoKTtcbiAgICBub2RlLmNoaWxkcmVuW21ldGhvZHNbYmVoYXZpb3JdXShjaGlsZCk7XG4gIH1cblxuICBmdW5jdGlvbiBpY29uKG5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2VsZW1lbnQnLFxuICAgICAgdGFnTmFtZTogJ2EnLFxuICAgICAgcHJvcGVydGllczogeHRlbmQocHJvcHMsIHtocmVmOiAnIycgKyBub2RlLnByb3BlcnRpZXMuaWR9KVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
/* Dependencies. */
var Parser = require('parse5/lib/parser');
var pos = require('unist-util-position');
var fromParse5 = require('hast-util-from-parse5');
var toParse5 = require('hast-util-to-parse5');
var voids = require('html-void-elements');
var ns = require('web-namespaces');
var zwitch = require('zwitch');
/* Expose. */
module.exports = wrap;
/* Constants. */
var IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE';
var CHARACTER_TOKEN = 'CHARACTER_TOKEN';
var START_TAG_TOKEN = 'START_TAG_TOKEN';
var END_TAG_TOKEN = 'END_TAG_TOKEN';
var HIBERNATION_TOKEN = 'HIBERNATION_TOKEN';
var COMMENT_TOKEN = 'COMMENT_TOKEN';
var DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
var DOCUMENT = 'document';
var FRAGMENT = 'fragment';
function wrap(tree, file) {
var parser = new Parser({locationInfo: true});
var one = zwitch('type');
var mode = inferMode(tree);
var preprocessor;
var result;
one.handlers.root = root;
one.handlers.element = element;
one.handlers.text = text;
one.handlers.comment = comment;
one.handlers.doctype = doctype;
one.handlers.raw = raw;
one.unknown = unknown;
result = fromParse5(mode === FRAGMENT ? fragment() : document(), file);
/* Unpack if possible and when not given a `root`. */
if (tree.type !== 'root' && result.children.length === 1) {
return result.children[0];
}
return result;
function fragment() {
var context;
var mock;
var doc;
context = {
nodeName: 'template',
tagName: 'template',
attrs: [],
namespaceURI: ns.html,
childNodes: []
};
mock = {
nodeName: 'documentmock',
tagName: 'documentmock',
attrs: [],
namespaceURI: ns.html,
childNodes: []
};
doc = {
nodeName: '#document-fragment',
childNodes: []
};
parser._bootstrap(mock, context);
parser._pushTmplInsertionMode(IN_TEMPLATE_MODE);
parser._initTokenizerForFragmentParsing();
parser._insertFakeRootElement();
parser._resetInsertionMode();
parser._findFormInFragmentContext();
preprocessor = parser.tokenizer.preprocessor;
one(tree);
parser._adoptNodes(mock.childNodes[0], doc);
return doc;
}
function document() {
var doc = parser.treeAdapter.createDocument();
parser._bootstrap(doc, null);
one(tree);
return doc;
}
function all(nodes) {
var length = nodes.length;
var index = -1;
while (++index < length) {
one(nodes[index]);
}
}
function root(node) {
all(node.children);
}
function element(node) {
var empty = voids.indexOf(node.tagName) !== -1;
parser._processToken(startTag(node, empty), ns.html);
all(node.children);
if (!empty) {
parser._processToken(endTag(node));
}
}
function text(node) {
parser._processToken({
type: CHARACTER_TOKEN,
chars: node.value,
location: {
line: pos.start(node).line,
col: pos.start(node).column,
startOffset: pos.start(node).offset,
endOffset: pos.end(node).offset
}
});
}
function doctype(node) {
var p5 = toParse5(node);
parser._processToken({
type: DOCTYPE_TOKEN,
name: p5.name,
forceQuirks: false,
publicId: p5.publicId,
systemId: p5.systemId
});
}
function comment(node) {
parser._processToken({
type: COMMENT_TOKEN,
data: node.value,
location: {
line: pos.start(node).line,
col: pos.start(node).column,
startOffset: pos.start(node).offset,
endOffset: pos.end(node).offset
}
});
}
function raw(node) {
var start = pos.start(node).offset;
preprocessor.html = null;
preprocessor.lastCharPos = -1;
preprocessor.pos = -1;
if (start !== null) {
preprocessor.droppedBufferSize = start;
}
parser.tokenizer.write(node.value);
run(parser);
}
}
function run(p) {
var tokenizer = p.tokenizer;
var token;
while (!p.stopped) {
p._setupTokenizerCDATAMode();
token = tokenizer.getNextToken();
if (token.type === HIBERNATION_TOKEN) {
token = tokenizer.currentCharacterToken || tokenizer.currentToken;
if (token) {
p._processInputToken(token);
}
tokenizer.currentToken = null;
tokenizer.currentCharacterToken = null;
break;
}
p._processInputToken(token);
}
}
function startTag(node, empty) {
var start = pos.start(node);
return {
type: START_TAG_TOKEN,
tagName: node.tagName,
selfClosing: false,
attrs: attributes(node),
location: {
line: start.line,
col: start.column,
startOffset: start.offset,
endOffset: start.offset,
attrs: {},
startTag: {
line: start.line,
col: start.column,
startOffset: start.offset,
endOffset: empty ? pos.end(node).offset : start.offset
}
}
};
}
function attributes(node) {
return toParse5({
type: 'element',
properties: node.properties
}).attrs;
}
function endTag(node) {
var end = pos.end(node);
return {
type: END_TAG_TOKEN,
tagName: node.tagName,
attrs: [],
location: {
line: end.line,
col: end.column,
startOffset: end.offset,
endOffset: end.offset
}
};
}
function unknown(node) {
throw new Error('Cannot compile `' + node.type + '` node');
}
function inferMode(node) {
var head = node.type === 'root' ? node.children[0] : node;
if (head && (head.type === 'doctype' || head.tagName === 'html')) {
return DOCUMENT;
}
return FRAGMENT;
}
},{"hast-util-from-parse5":2,"hast-util-to-parse5":12,"html-void-elements":31,"parse5/lib/parser":40,"unist-util-position":46,"web-namespaces":47,"zwitch":48}],2:[function(require,module,exports){
'use strict';
var information = require('property-information');
var camelcase = require('camelcase');
var vfileLocation = require('vfile-location');
var h = require('hastscript');
module.exports = wrapper;
var own = {}.hasOwnProperty;
/* Handlers. */
var map = {
'#document': root,
'#document-fragment': root,
'#text': text,
'#comment': comment,
'#documentType': doctype
};
/* Wrapper to normalise options. */
function wrapper(ast, options) {
var settings = options || {};
var file;
if (settings.messages) {
file = settings;
settings = {};
} else {
file = settings.file;
}
return transform(ast, {
file: file,
toPosition: file ? vfileLocation(file).toPosition : null,
verbose: settings.verbose,
location: false
});
}
/* Transform a node. */
function transform(ast, config) {
var fn = own.call(map, ast.nodeName) ? map[ast.nodeName] : element;
var children;
var node;
var position;
if (ast.childNodes) {
children = nodes(ast.childNodes, config);
}
node = fn(ast, children, config);
if (ast.__location && config.toPosition) {
config.location = true;
position = location(ast.__location, ast, node, config);
if (position) {
node.position = position;
}
}
return node;
}
/* Transform children. */
function nodes(children, config) {
var length = children.length;
var index = -1;
var result = [];
while (++index < length) {
result[index] = transform(children[index], config);
}
return result;
}
/* Transform a document.
* Stores `ast.quirksMode` in `node.data.quirksMode`. */
function root(ast, children, config) {
var quirks = ast.mode === 'quirks' || ast.mode === 'limited-quirks';
var node = {type: 'root', children: children};
var position;
node.data = {quirksMode: quirks};
if (ast.__location) {
if (config.toPosition) {
config.location = true;
position = ast.__location;
}
} else if (config.file && config.location) {
position = {startOffset: 0, endOffset: String(config.file).length};
}
position = position && location(position, ast, node, config);
if (position) {
node.position = position;
}
return node;
}
/* Transform a doctype. */
function doctype(ast) {
return {
type: 'doctype',
name: ast.name || '',
public: ast.publicId || null,
system: ast.systemId || null
};
}
/* Transform a text. */
function text(ast) {
return {type: 'text', value: ast.value};
}
/* Transform a comment. */
function comment(ast) {
return {type: 'comment', value: ast.data};
}
/* Transform an element. */
function element(ast, children, config) {
var props = {};
var values = ast.attrs;
var length = values.length;
var index = -1;
var attr;
var node;
var fragment;
while (++index < length) {
attr = values[index];
props[(attr.prefix ? attr.prefix + ':' : '') + attr.name] = attr.value;
}
node = h(ast.tagName, props, children);
if (ast.nodeName === 'template' && 'content' in ast) {
fragment = ast.content;
if (ast.__location) {
fragment.__location = {
startOffset: ast.__location.startTag.endOffset,
endOffset: ast.__location.endTag.startOffset
};
}
node.content = transform(ast.content, config);
}
return node;
}
/* Create clean positional information. */
function loc(toPosition, dirty) {
return {
start: toPosition(dirty.startOffset),
end: toPosition(dirty.endOffset)
};
}
/* Create clean positional information. */
function location(info, ast, node, config) {
var start = info.startOffset;
var end = info.endOffset;
var values = info.attrs || {};
var propPositions = {};
var prop;
var name;
var reference;
for (prop in values) {
name = (information(prop) || {}).propertyName || camelcase(prop);
propPositions[name] = loc(config.toPosition, values[prop]);
}
/* Upstream: https://github.com/inikulin/parse5/issues/109 */
if (node.type === 'element' && !info.endTag) {
reference = node.children[node.children.length - 1];
/* Unclosed with children: */
if (reference && reference.position) {
if (reference.position.end) {
end = reference.position.end.offset;
} else {
end = null;
}
/* Unclosed without children: */
} else if (info.startTag) {
end = info.startTag.endOffset;
}
}
if (config.verbose && node.type === 'element') {
node.data = {
position: {
opening: loc(config.toPosition, info.startTag || info),
closing: info.endTag ? loc(config.toPosition, info.endTag) : null,
properties: propPositions
}
};
}
start = typeof start === 'number' ? config.toPosition(start) : null;
end = typeof end === 'number' ? config.toPosition(end) : null;
if (!start && !end) {
return undefined;
}
return {start: start, end: end};
}
},{"camelcase":3,"hastscript":4,"property-information":10,"vfile-location":11}],3:[function(require,module,exports){
'use strict';
function preserveCamelCase(str) {
var isLastCharLower = false;
for (var i = 0; i < str.length; i++) {
var c = str.charAt(i);
if (isLastCharLower && (/[a-zA-Z]/).test(c) && c.toUpperCase() === c) {
str = str.substr(0, i) + '-' + str.substr(i);
isLastCharLower = false;
i++;
} else {
isLastCharLower = (c.toLowerCase() === c);
}
}
return str;
}
module.exports = function () {
var str = [].map.call(arguments, function (str) {
return str.trim();
}).filter(function (str) {
return str.length;
}).join('-');
if (!str.length) {
return '';
}
if (str.length === 1) {
return str.toLowerCase();
}
if (!(/[_.\- ]+/).test(str)) {
if (str === str.toUpperCase()) {
return str.toLowerCase();
}
if (str[0] !== str[0].toLowerCase()) {
return str[0].toLowerCase() + str.slice(1);
}
return str;
}
str = preserveCamelCase(str);
return str
.replace(/^[_.\- ]+/, '')
.toLowerCase()
.replace(/[_.\- ]+(\w|$)/g, function (m, p1) {
return p1.toUpperCase();
});
};
},{}],4:[function(require,module,exports){
'use strict';
var parseSelector = require('hast-util-parse-selector');
var camelcase = require('camelcase');
var propertyInformation = require('property-information');
var spaces = require('space-separated-tokens').parse;
var commas = require('comma-separated-tokens').parse;
module.exports = h;
/* Hyperscript compatible DSL for creating virtual HAST
* trees. */
function h(selector, properties, children) {
var node = parseSelector(selector);
var property;
if (
properties &&
!children &&
(
typeof properties === 'string' ||
'length' in properties ||
isNode(node.tagName, properties)
)
) {
children = properties;
properties = null;
}
if (properties) {
for (property in properties) {
addProperty(node.properties, property, properties[property]);
}
}
addChild(node.children, children);
if (node.tagName === 'template') {
node.content = {type: 'root', children: node.children};
node.children = [];
}
return node;
}
/* Check if `value` is a valid child node of `tagName`. */
function isNode(tagName, value) {
var type = value.type;
if (typeof type === 'string') {
type = type.toLowerCase();
}
if (tagName === 'input' || !type || typeof type !== 'string') {
return false;
}
if (typeof value.children === 'object' && 'length' in value.children) {
return true;
}
if (tagName === 'button') {
return type !== 'menu' &&
type !== 'submit' &&
type !== 'reset' &&
type !== 'button';
}
return 'value' in value;
}
/* Add `value` as a child to `nodes`. */
function addChild(nodes, value) {
var index;
var length;
if (value === null || value === undefined) {
return;
}
if (typeof value === 'string' || typeof value === 'number') {
value = {type: 'text', value: String(value)};
}
if (typeof value === 'object' && 'length' in value) {
index = -1;
length = value.length;
while (++index < length) {
addChild(nodes, value[index]);
}
return;
}
if (typeof value !== 'object' || !('type' in value)) {
throw new Error('Expected node, nodes, or string, got `' + value + '`');
}
nodes.push(value);
}
/* Add `name` and its `value` to `properties`. `properties` can
* be prefilled by `parseSelector`: it can have `id` and `className`
* properties. */
function addProperty(properties, name, value) {
var info = propertyInformation(name) || {};
var result = value;
var key;
/* Ignore nully and NaN values. */
if (value === null || value === undefined || value !== value) {
return;
}
/* Handle values. */
if (name === 'style') {
/* Accept `object`. */
if (typeof value !== 'string') {
result = [];
for (key in value) {
result.push([key, value[key]].join(': '));
}
result = result.join('; ');
}
} else if (info.spaceSeparated) {
/* Accept both `string` and `Array`. */
result = typeof value === 'string' ? spaces(result) : result;
/* Class-names (which can be added both on
* the `selector` and here). */
if (name === 'class' && properties.className) {
result = properties.className.concat(result);
}
} else if (info.commaSeparated) {
/* Accept both `string` and `Array`. */
result = typeof value === 'string' ? commas(result) : result;
}
result = parsePrimitive(info, name, result);
properties[info.propertyName || camelcase(name)] = result;
}
/* Parse a (list of) primitives. */
function parsePrimitive(info, name, value) {
var result = value;
var index;
var length;
if (typeof value === 'object' && 'length' in value) {
length = value.length;
index = -1;
result = [];
while (++index < length) {
result[index] = parsePrimitive(info, name, value[index]);
}
return result;
}
if (info.numeric || info.positiveNumeric) {
if (!isNaN(result) && result !== '') {
result = Number(result);
}
} else if (info.boolean || info.overloadedBoolean) {
/* Accept `boolean` and `string`. */
if (
typeof result === 'string' &&
(result === '' || value.toLowerCase() === name)
) {
result = true;
}
}
return result;
}
},{"camelcase":3,"comma-separated-tokens":5,"hast-util-parse-selector":7,"property-information":10,"space-separated-tokens":8}],5:[function(require,module,exports){
'use strict';
exports.parse = parse;
exports.stringify = stringify;
var trim = require('trim');
var C_COMMA = ',';
var C_SPACE = ' ';
var EMPTY = '';
/* Parse comma-separated tokens to an array. */
function parse(value) {
var values = [];
var input = String(value || EMPTY);
var index = input.indexOf(C_COMMA);
var lastIndex = 0;
var end = false;
var val;
while (!end) {
if (index === -1) {
index = input.length;
end = true;
}
val = trim(input.slice(lastIndex, index));
if (val || !end) {
values.push(val);
}
lastIndex = index + 1;
index = input.indexOf(C_COMMA, lastIndex);
}
return values;
}
/* Compile an array to comma-separated tokens.
* `options.padLeft` (default: `true`) pads a space left of each
* token, and `options.padRight` (default: `false`) pads a space
* to the right of each token. */
function stringify(values, options) {
var settings = options || {};
var left = settings.padLeft;
/* Ensure the last empty entry is seen. */
if (values[values.length - 1] === EMPTY) {
values = values.concat(EMPTY);
}
return trim(values.join(
(settings.padRight ? C_SPACE : EMPTY) +
C_COMMA +
(left || left === undefined || left === null ? C_SPACE : EMPTY)
));
}
},{"trim":6}],6:[function(require,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],7:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = parse;
/* Characters */
var dot = '.'.charCodeAt(0);
var hash = '#'.charCodeAt(0);
/* Parse a simple CSS selector into a HAST node. */
function parse(selector) {
var id = null;
var className = [];
var value = selector || '';
var name = 'div';
var node;
var type = null;
var index = -1;
var code;
var length = value.length;
var subvalue;
var lastIndex;
node = {
type: 'element',
tagName: null,
properties: {},
children: []
};
type = null;
while (++index <= length) {
code = value.charCodeAt(index);
if (!code || code === dot || code === hash) {
subvalue = value.slice(lastIndex, index);
if (subvalue) {
if (type === dot) {
className.push(subvalue);
} else if (type === hash) {
id = subvalue;
} else {
name = subvalue;
}
}
lastIndex = index + 1;
type = code;
}
}
node.tagName = name;
if (id) {
node.properties.id = id;
}
if (className.length !== 0) {
node.properties.className = className;
}
return node;
}
},{}],8:[function(require,module,exports){
'use strict';
var trim = require('trim');
exports.parse = parse;
exports.stringify = stringify;
var empty = '';
var space = ' ';
var whiteSpace = /[ \t\n\r\f]+/g;
function parse(value) {
var input = trim(String(value || empty));
if (input === empty) {
return [];
}
return input.split(whiteSpace);
}
function stringify(values) {
return trim(values.join(space));
}
},{"trim":9}],9:[function(require,module,exports){
arguments[4][6][0].apply(exports,arguments)
},{"dup":6}],10:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = getPropertyInformation;
/* Constants. */
var USE_ATTRIBUTE = 0x1;
var USE_PROPERTY = 0x2;
var BOOLEAN_VALUE = 0x8;
var NUMERIC_VALUE = 0x10;
var POSITIVE_NUMERIC_VALUE = 0x20 | 0x10;
var OVERLOADED_BOOLEAN_VALUE = 0x40;
var SPACE_SEPARATED = 0x80;
var COMMA_SEPARATED = 0x100;
/* Map of properties. Names are camel-cased properties. */
var propertyConfig = {
/* Standard Properties. */
abbr: null,
accept: COMMA_SEPARATED,
acceptCharset: SPACE_SEPARATED,
accessKey: SPACE_SEPARATED,
action: null,
allowFullScreen: USE_ATTRIBUTE | BOOLEAN_VALUE,
allowTransparency: USE_ATTRIBUTE,
alt: null,
/* https://html.spec.whatwg.org/#attr-link-as */
as: null,
async: BOOLEAN_VALUE,
autoComplete: SPACE_SEPARATED,
autoFocus: BOOLEAN_VALUE,
autoPlay: BOOLEAN_VALUE,
capture: USE_ATTRIBUTE | BOOLEAN_VALUE,
cellPadding: null,
cellSpacing: null,
challenge: USE_ATTRIBUTE,
charSet: USE_ATTRIBUTE,
checked: USE_PROPERTY | BOOLEAN_VALUE,
cite: null,
/* To set className on SVG elements, it's necessary to
* use .setAttribute; this works on HTML elements too
* in all browsers except IE8. */
className: USE_ATTRIBUTE | SPACE_SEPARATED,
cols: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
colSpan: null,
command: null,
content: null,
contentEditable: null,
contextMenu: USE_ATTRIBUTE,
controls: USE_PROPERTY | BOOLEAN_VALUE,
/* https://github.com/WICG/controls-list/blob/gh-pages/explainer.md */
controlsList: SPACE_SEPARATED,
coords: NUMERIC_VALUE | COMMA_SEPARATED,
crossOrigin: null,
/* For `<object />` acts as `src`. */
data: null,
dateTime: USE_ATTRIBUTE,
default: BOOLEAN_VALUE,
defer: BOOLEAN_VALUE,
dir: null,
dirName: null,
disabled: USE_ATTRIBUTE | BOOLEAN_VALUE,
download: OVERLOADED_BOOLEAN_VALUE,
draggable: null,
dropzone: SPACE_SEPARATED,
encType: null,
form: USE_ATTRIBUTE,
formAction: USE_ATTRIBUTE,
formEncType: USE_ATTRIBUTE,
formMethod: USE_ATTRIBUTE,
formNoValidate: BOOLEAN_VALUE,
formTarget: USE_ATTRIBUTE,
frameBorder: USE_ATTRIBUTE,
headers: SPACE_SEPARATED,
height: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
hidden: USE_ATTRIBUTE | BOOLEAN_VALUE,
high: NUMERIC_VALUE,
href: null,
hrefLang: null,
htmlFor: SPACE_SEPARATED,
httpEquiv: SPACE_SEPARATED,
id: USE_PROPERTY,
inputMode: USE_ATTRIBUTE,
/* Web Components */
is: USE_ATTRIBUTE,
isMap: BOOLEAN_VALUE,
keyParams: USE_ATTRIBUTE,
keyType: USE_ATTRIBUTE,
kind: null,
label: null,
lang: null,
list: USE_ATTRIBUTE,
loop: USE_PROPERTY | BOOLEAN_VALUE,
low: NUMERIC_VALUE,
manifest: USE_ATTRIBUTE,
marginHeight: NUMERIC_VALUE,
marginWidth: NUMERIC_VALUE,
max: null,
maxLength: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
media: USE_ATTRIBUTE,
mediaGroup: null,
menu: null,
method: null,
min: null,
minLength: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
multiple: USE_PROPERTY | BOOLEAN_VALUE,
muted: USE_PROPERTY | BOOLEAN_VALUE,
name: null,
nonce: null,
noValidate: BOOLEAN_VALUE,
open: BOOLEAN_VALUE,
optimum: NUMERIC_VALUE,
pattern: null,
ping: SPACE_SEPARATED,
placeholder: null,
/* https://html.spec.whatwg.org/#attr-video-playsinline */
playsInline: BOOLEAN_VALUE,
poster: null,
preload: null,
/* https://html.spec.whatwg.org/#dom-head-profile */
profile: null,
radioGroup: null,
readOnly: USE_PROPERTY | BOOLEAN_VALUE,
/* https://html.spec.whatwg.org/#attr-link-referrerpolicy */
referrerPolicy: null,
/* `rel` is `relList` in DOM */
rel: SPACE_SEPARATED | USE_ATTRIBUTE,
required: BOOLEAN_VALUE,
reversed: BOOLEAN_VALUE,
role: USE_ATTRIBUTE,
rows: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
rowSpan: POSITIVE_NUMERIC_VALUE,
sandbox: SPACE_SEPARATED,
scope: null,
scoped: BOOLEAN_VALUE,
scrolling: null,
seamless: USE_ATTRIBUTE | BOOLEAN_VALUE,
selected: USE_PROPERTY | BOOLEAN_VALUE,
shape: null,
size: USE_ATTRIBUTE | POSITIVE_NUMERIC_VALUE,
sizes: USE_ATTRIBUTE | SPACE_SEPARATED,
/* https://html.spec.whatwg.org/#attr-slot */
slot: null,
sortable: BOOLEAN_VALUE,
sorted: SPACE_SEPARATED,
span: POSITIVE_NUMERIC_VALUE,
spellCheck: null,
src: null,
srcDoc: USE_PROPERTY,
srcLang: null,
srcSet: USE_ATTRIBUTE | COMMA_SEPARATED,
start: NUMERIC_VALUE,
step: null,
style: null,
summary: null,
tabIndex: NUMERIC_VALUE,
target: null,
title: null,
translate: null,
type: null,
typeMustMatch: BOOLEAN_VALUE,
useMap: null,
value: USE_PROPERTY,
volume: POSITIVE_NUMERIC_VALUE,
width: USE_ATTRIBUTE | NUMERIC_VALUE,
wmode: USE_ATTRIBUTE,
wrap: null,
/* Non-standard Properties. */
/* `autoCapitalize` and `autoCorrect` are supported in
* Mobile Safari for keyboard hints. */
autoCapitalize: null,
autoCorrect: null,
/* `autoSave` allows WebKit/Blink to persist values of
* input fields on page reloads */
autoSave: null,
/* `itemProp`, `itemScope`, `itemType` are for Microdata
* support. See http://schema.org/docs/gs.html */
itemProp: USE_ATTRIBUTE | SPACE_SEPARATED,
itemScope: USE_ATTRIBUTE | BOOLEAN_VALUE,
itemType: USE_ATTRIBUTE | SPACE_SEPARATED,
/* `itemID` and `itemRef` are for Microdata support as well
* but only specified in the the WHATWG spec document.
* See https://html.spec.whatwg.org/multipage/
* microdata.html#microdata-dom-api */
itemID: USE_ATTRIBUTE,
itemRef: USE_ATTRIBUTE | SPACE_SEPARATED,
/* `property` is supported for OpenGraph in meta tags. */
property: null,
/* `results` show looking glass icon and recent searches
* on input search fields in WebKit/Blink */
results: null,
/* IE-only attribute that specifies security
* restrictions on an iframe as an alternative to the
* sandbox attribute on IE < 10 */
security: USE_ATTRIBUTE,
/* IE-only attribute that controls focus behavior */
unselectable: USE_ATTRIBUTE,
/* Ancient. */
xmlLang: USE_ATTRIBUTE,
xmlBase: USE_ATTRIBUTE
};
/* Map of properties to attributes.
* Names are lower-case properties.
* Values are HTML attributes. */
var propertyToAttributeMapping = {
xmlbase: 'xml:base',
xmllang: 'xml:lang',
classname: 'class',
htmlfor: 'for',
httpequiv: 'http-equiv',
acceptcharset: 'accept-charset'
};
/* Expand config. */
var information = {};
var property;
var name;
var config;
getPropertyInformation.all = information;
for (property in propertyConfig) {
name = lower(property);
name = propertyToAttributeMapping[name] || name;
config = propertyConfig[property];
information[name] = {
name: name,
propertyName: property,
mustUseAttribute: check(config, USE_ATTRIBUTE),
mustUseProperty: check(config, USE_PROPERTY),
boolean: check(config, BOOLEAN_VALUE),
overloadedBoolean: check(config, OVERLOADED_BOOLEAN_VALUE),
numeric: check(config, NUMERIC_VALUE),
positiveNumeric: check(config, POSITIVE_NUMERIC_VALUE),
commaSeparated: check(config, COMMA_SEPARATED),
spaceSeparated: check(config, SPACE_SEPARATED)
};
}
/* Get a config for a property. */
function getPropertyInformation(propertyName) {
var insensitive = lower(propertyName);
return information[propertyToAttributeMapping[insensitive] || insensitive];
}
/* Check a mask. */
function check(value, bitmask) {
return (value & bitmask) === bitmask;
}
/* Lower-case a string. */
function lower(value) {
return value.toLowerCase();
}
},{}],11:[function(require,module,exports){
'use strict';
/* Expose. */
module.exports = factory;
/* Factory. */
function factory(file) {
var contents = indices(String(file));
return {
toPosition: offsetToPositionFactory(contents),
toOffset: positionToOffsetFactory(contents)
};
}
/* Factory to get the line and column-based `position` for
* `offset` in the bound indices. */
function offsetToPositionFactory(indices) {
return offsetToPosition;
/* Get the line and column-based `position` for
* `offset` in the bound indices. */
function offsetToPosition(offset) {
var index = -1;
var length = indices.length;
if (offset < 0) {
return {};
}
while (++index < length) {
if (indices[index] > offset) {
return {
line: index + 1,
column: (offset - (indices[index - 1] || 0)) + 1,
offset: offset
};
}
}
return {};
}
}
/* Factory to get the `offset` for a line and column-based
* `position` in the bound indices. */
function positionToOffsetFactory(indices) {
return positionToOffset;
/* Get the `offset` for a line and column-based
* `position` in the bound indices. */
function positionToOffset(position) {
var line = position && position.line;
var column = position && position.column;
if (!isNaN(line) && !isNaN(column) && line - 1 in indices) {
return ((indices[line - 2] || 0) + column - 1) || 0;
}
return -1;
}
}
/* Get indices of line-breaks in `value`. */
function indices(value) {
var result = [];
var index = value.indexOf('\n');
while (index !== -1) {
result.push(index + 1);
index = value.indexOf('\n', index + 1);
}
result.push(value.length + 1);
return result;
}
},{}],12:[function(require,module,exports){
'use strict';
var xtend = require('xtend');
var toH = require('hast-to-hyperscript');
var NS = require('web-namespaces');
var zwitch = require('zwitch');
var mapz = require('mapz');
module.exports = transform;
var own = {}.hasOwnProperty;
var one = zwitch('type');
var all = mapz(one, {key: 'children', indices: false});
var customProps = ['__location', 'childNodes', 'content', 'parentNode', 'namespaceURI'];
one.handlers.root = root;
one.handlers.element = element;
one.handlers.text = text;
one.handlers.comment = comment;
one.handlers.doctype = doctype;
/* Map of tag-names starting new namespaces. */
var namespaces = {
math: NS.mathml,
svg: NS.svg
};
/* Map of attributes with namespaces. */
var attributeSpaces = {
'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.xlink},
'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.xlink},
'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.xlink},
'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.xlink},
'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.xlink},
'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.xlink},
'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.xlink},
'xml:base': {prefix: 'xml', name: 'base', namespace: NS.xml},
'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.xml},
'xml:space': {prefix: 'xml', name: 'space', namespace: NS.xml},
xmlns: {prefix: '', name: 'xmlns', namespace: NS.xmlns},
'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.xmlns}
};
/* Transform a tree from HAST to Parse5’s AST. */
function transform(tree) {
return patch(one(tree), null, NS.html);
}
function root(node) {
var data = node.data || {};
var qs = own.call(data, 'quirksMode') ? Boolean(data.quirksMode) : false;
return {
nodeName: '#document',
mode: qs ? 'quirks' : 'no-quirks',
childNodes: all(node)
};
}
function element(node) {
var shallow = xtend(node);
shallow.children = [];
return toH(function (name, attrs) {
var values = [];
var content;
var value;
var key;
for (key in attrs) {
value = {name: key, value: attrs[key]};
if (own.call(attributeSpaces, key)) {
value = xtend(value, attributeSpaces[key]);
}
values.push(value);
}
if (name === 'template') {
content = transform(shallow.content);
delete content.mode;
content.nodeName = '#document-fragment';
}
return wrap(node, {
nodeName: node.tagName,
tagName: node.tagName,
attrs: values,
childNodes: node.children ? all(node) : []
}, content);
}, shallow);
}
function doctype(node) {
return wrap(node, {
nodeName: '#documentType',
name: node.name,
publicId: node.public || null,
systemId: node.system || null
});
}
function text(node) {
return wrap(node, {
nodeName: '#text',
value: node.value
});
}
function comment(node) {
return wrap(node, {
nodeName: '#comment',
data: node.value
});
}
/* Patch position. */
function wrap(node, ast, content) {
if (node.position && node.position.start && node.position.end) {
ast.__location = {
line: node.position.start.line,
col: node.position.start.column,
startOffset: node.position.start.offset,
endOffset: node.position.end.offset
};
}
if (content) {
ast.content = content;
}
return ast;
}
/* Patch a tree recursively, by adding namespaces
* and parent references where needed. */
function patch(node, parent, ns) {
var location = node.__location;
var children = node.childNodes;
var name = node.tagName;
var replacement = {};
var length;
var index;
var key;
for (key in node) {
if (customProps.indexOf(key) === -1) {
replacement[key] = node[key];
}
}
if (own.call(namespaces, name)) {
ns = namespaces[name];
}
if (own.call(replacement, 'tagName')) {
replacement.namespaceURI = ns;
}
if (children) {
replacement.childNodes = children;
length = children.length;
index = -1;
while (++index < length) {
children[index] = patch(children[index], replacement, ns);
}
}
if (name === 'template') {
replacement.content = patch(node.content, null, ns);
}
if (parent) {
replacement.parentNode = parent;
}
if (location) {
replacement.__location = location;
}
return replacement;
}
},{"hast-to-hyperscript":13,"mapz":28,"web-namespaces":47,"xtend":30,"zwitch":48}],13:[function(require,module,exports){
'use strict';
var trim = require('trim');
var paramCase = require('kebab-case');
var information = require('property-information');
var spaces = require('space-separated-tokens');
var commas = require('comma-separated-tokens');
var nan = require('is-nan');
var is = require('unist-util-is');
module.exports = wrapper;
function wrapper(h, node, prefix) {
var r;
var v;
if (typeof h !== 'function') {
throw new Error('h is not a function');
}
if (!is('element', node)) {
throw new Error('Expected element, not `' + node + '`');
}
r = react(h);
v = vdom(h);
if (prefix === null || prefix === undefined) {
prefix = r === true || v === true ? 'h-' : false;
}
return toH(h, node, {
prefix: prefix,
key: 0,
react: r,
vdom: v,
hyperscript: hyperscript(h)
});
}
/* Transform a HAST node through a hyperscript interface
* to *anything*! */
function toH(h, node, ctx) {
var selector = node.tagName;
var properties;
var attributes;
var children;
var property;
var elements;
var length;
var index;
var value;
properties = node.properties;
attributes = {};
for (property in properties) {
addAttribute(attributes, property, properties[property], ctx);
}
if (ctx.vdom === true) {
selector = selector.toUpperCase();
}
if (ctx.hyperscript === true && attributes.id) {
selector += '#' + attributes.id;
delete attributes.id;
}
if ((ctx.hyperscript === true || ctx.vdom === true) && attributes.className) {
selector += '.' + spaces.parse(attributes.className).join('.');
delete attributes.className;
}
if (typeof attributes.style === 'string') {
/* VDOM expects a `string` style in `attributes`
* See https://github.com/Matt-Esch/virtual-dom/blob/947ecf9/
* docs/vnode.md#propertiesstyle-vs-propertiesattributesstyle */
if (ctx.vdom === true) {
if (!attributes.attributes) {
attributes.attributes = {};
}
attributes.attributes.style = attributes.style;
delete attributes.style;
/* React only accepts `style` as object. */
} else if (ctx.react === true) {
attributes.style = parseStyle(attributes.style);
}
}
if (ctx.prefix) {
ctx.key++;
attributes.key = ctx.prefix + ctx.key;
}
elements = [];
children = node.children || [];
length = children.length;
index = -1;
while (++index < length) {
value = children[index];
if (is('element', value)) {
elements.push(toH(h, value, ctx));
} else if (is('text', value)) {
elements.push(value.value);
}
}
/* Ensure no React warnings are triggered for
* void elements having children passed in. */
if (elements.length === 0) {
elements = undefined;
}
return h(selector, attributes, elements);
}
/* Add `name` and its `value` to `props`. */
function addAttribute(props, name, value, ctx) {
var info = information(name) || {};
var subprop;
/* Ignore nully, `false`, `NaN`, and falsey known
* booleans. */
if (
value === null ||
value === undefined ||
value === false ||
nan(value) ||
(info.boolean && !value)
) {
return;
}
name = info.name || paramCase(name);
if (value !== null && typeof value === 'object' && 'length' in value) {
/* Accept `array`. Most props are space-separater. */
value = (info.commaSeparated ? commas : spaces).stringify(value);
}
/* Treat `true` and truthy known booleans. */
if (info.boolean && ctx.hyperscript === true) {
value = '';
}
if (info.name !== 'class' && (info.mustUseAttribute || !info.name)) {
if (ctx.vdom === true) {
subprop = 'attributes';
} else if (ctx.hyperscript === true) {
subprop = 'attrs';
}
if (subprop) {
if (props[subprop] === undefined) {
props[subprop] = {};
}
props[subprop][name] = value;
return;
}
}
props[info.propertyName || name] = value;
}
/* Check if `h` is `react.createElement`. It doesn’t accept
* `class` as an attribute, it must be added through the
* `selector`. */
function react(h) {
var node = h && h('div');
return Boolean(node && ('_owner' in node || '_store' in node) && node.key === null);
}
/* Check if `h` is `hyperscript`. It doesn’t accept
* `class` as an attribute, it must be added through the
* `selector`. */
function hyperscript(h) {
return Boolean(h && h.context && h.cleanup);
}
/**
* Check if `h` is `virtual-dom/h`. It’s the only
* hyperscript “compatible” interface needing `attributes`. */
function vdom(h) {
try {
return h('div').type === 'VirtualNode';
} catch (err) { /* Empty */ }
/* istanbul ignore next */
return false;
}
function parseStyle(value) {
var result = {};
var declarations = value.split(';');
var length = declarations.length;
var index = -1;
var declaration;
var prop;
var pos;
while (++index < length) {
declaration = declarations[index];
pos = declaration.indexOf(':');
if (pos !== -1) {
prop = camelCase(trim(declaration.slice(0, pos)));
result[prop] = trim(declaration.slice(pos + 1));
}
}
return result;
}
function camelCase(val) {
if (val.slice(0, 4) === '-ms-') {
val = 'ms-' + val.slice(4);
}
return val.replace(/-([a-z])/g, replace);
}
function replace($0, $1) {
return $1.toUpperCase();
}
},{"comma-separated-tokens":14,"is-nan":16,"kebab-case":23,"property-information":24,"space-separated-tokens":25,"trim":26,"unist-util-is":27}],14:[function(require,module,exports){
arguments[4][5][0].apply(exports,arguments)
},{"dup":5,"trim":26}],15:[function(require,module,exports){
'use strict';
/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */
module.exports = function isNaN(value) {
return value !== value;
};
},{}],16:[function(require,module,exports){
'use strict';
var define = require('define-properties');
var implementation = require('./implementation');
var getPolyfill = require('./polyfill');
var shim = require('./shim');
/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */
define(implementation, {
getPolyfill: getPolyfill,
implementation: implementation,
shim: shim
});
module.exports = implementation;
},{"./implementation":15,"./polyfill":21,"./shim":22,"define-properties":17}],17:[function(require,module,exports){
'use strict';
var keys = require('object-keys');
var foreach = require('foreach');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
var toStr = Object.prototype.toString;
var isFunction = function (fn) {
return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
};
var arePropertyDescriptorsSupported = function () {
var obj = {};
try {
Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
/* eslint-disable no-unused-vars, no-restricted-syntax */
for (var _ in obj) { return false; }
/* eslint-enable no-unused-vars, no-restricted-syntax */
return obj.x === obj;
} catch (e) { /* this is IE 8. */
return false;
}
};
var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
var defineProperty = function (object, name, value, predicate) {
if (name in object && (!isFunction(predicate) || !predicate())) {
return;
}
if (supportsDescriptors) {
Object.defineProperty(object, name, {
configurable: true,
enumerable: false,
value: value,
writable: true
});
} else {
object[name] = value;
}
};
var defineProperties = function (object, map) {
var predicates = arguments.length > 2 ? arguments[2] : {};
var props = keys(map);
if (hasSymbols) {
props = props.concat(Object.getOwnPropertySymbols(map));
}
foreach(props, function (name) {
defineProperty(object, name, map[name], predicates[name]);
});
};
defineProperties.supportsDescriptors = !!supportsDescriptors;
module.exports = defineProperties;
},{"foreach":18,"object-keys":19}],18:[function(require,module,exports){
var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;
module.exports = function forEach (obj, fn, ctx) {
if (toString.call(fn) !== '[object Function]') {
throw new TypeError('iterator must be a function');
}
var l = obj.length;
if (l === +l) {
for (var i = 0; i < l; i++) {
fn.call(ctx, obj[i], i, obj);
}
} else {
for (var k in obj) {
if (hasOwn.call(obj, k)) {
fn.call(ctx, obj[k], k, obj);
}
}
}
};
},{}],19:[function(require,module,exports){
'use strict';
// modified from https://github.com/es-shims/es5-shim
var has = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var slice = Array.prototype.slice;
var isArgs = require('./isArguments');
var isEnumerable = Object.prototype.propertyIsEnumerable;
var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
var dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
var equalsConstructorPrototype = function (o) {
var ctor = o.constructor;
return ctor && ctor.prototype === o;
};
var excludedKeys = {
$console: true,
$external: true,
$frame: true,
$frameElement: true,
$frames: true,
$innerHeight: true,
$innerWidth: true,
$outerHeight: true,
$outerWidth: true,
$pageXOffset: true,
$pageYOffset: true,
$parent: true,
$scrollLeft: true,
$scrollTop: true,
$scrollX: true,
$scrollY: true,
$self: true,
$webkitIndexedDB: true,
$webkitStorageInfo: true,
$window: true
};
var hasAutomationEqualityBug = (function () {
/* global window */
if (typeof window === 'undefined') { return false; }
for (var k in window) {
try {
if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
try {
equalsConstructorPrototype(window[k]);
} catch (e) {
return true;
}
}
} catch (e) {
return true;
}
}
return false;
}());
var equalsConstructorPrototypeIfNotBuggy = function (o) {
/* global window */
if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
return equalsConstructorPrototype(o);
}
try {
return equalsConstructorPrototype(o);
} catch (e) {
return false;
}
};
var keysShim = function keys(object) {
var isObject = object !== null && typeof object === 'object';
var isFunction = toStr.call(object) === '[object Function]';
var isArguments = isArgs(object);
var isString = isObject && toStr.call(object) === '[object String]';
var theKeys = [];
if (!isObject && !isFunction && !isArguments) {
throw new TypeError('Object.keys called on a non-object');
}
var skipProto = hasProtoEnumBug && isFunction;
if (isString && object.length > 0 && !has.call(object, 0)) {
for (var i = 0; i < object.length; ++i) {
theKeys.push(String(i));
}
}
if (isArguments && object.length > 0) {
for (var j = 0; j < object.length; ++j) {
theKeys.push(String(j));
}
} else {
for (var name in object) {
if (!(skipProto && name === 'prototype') && has.call(object, name)) {
theKeys.push(String(name));
}
}
}
if (hasDontEnumBug) {
var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
for (var k = 0; k < dontEnums.length; ++k) {
if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
theKeys.push(dontEnums[k]);
}
}
}
return theKeys;
};
keysShim.shim = function shimObjectKeys() {
if (Object.keys) {
var keysWorksWithArguments = (function () {
// Safari 5.0 bug
return (Object.keys(arguments) || '').length === 2;
}(1, 2));
if (!keysWorksWithArguments) {
var originalKeys = Object.keys;
Object.keys = function keys(object) {
if (isArgs(object)) {
return originalKeys(slice.call(object));
} else {
return originalKeys(object);
}
};
}
} else {
Object.keys = keysShim;
}
return Object.keys || keysShim;
};
module.exports = keysShim;
},{"./isArguments":20}],20:[function(require,module,exports){
'use strict';
var toStr = Object.prototype.toString;
module.exports = function isArguments(value) {
var str = toStr.call(value);
var isArgs = str === '[object Arguments]';
if (!isArgs) {
isArgs = str !== '[object Array]' &&
value !== null &&
typeof value === 'object' &&
typeof value.length === 'number' &&
value.length >= 0 &&
toStr.call(value.callee) === '[object Function]';
}
return isArgs;
};
},{}],21:[function(require,module,exports){
'use strict';
var implementation = require('./implementation');
module.exports = function getPolyfill() {
if (Number.isNaN && Number.isNaN(NaN) && !Number.isNaN('a')) {
return Number.isNaN;
}
return implementation;
};
},{"./implementation":15}],22:[function(require,module,exports){
'use strict';
var define = require('define-properties');
var getPolyfill = require('./polyfill');
/* http://www.ecma-international.org/ecma-262/6.0/#sec-number.isnan */
module.exports = function shimNumberIsNaN() {
var polyfill = getPolyfill();
define(Number, { isNaN: polyfill }, { isNaN: function () { return Number.isNaN !== polyfill; } });
return polyfill;
};
},{"./polyfill":21,"define-properties":17}],23:[function(require,module,exports){
'use strict';
var KEBAB_REGEX = /[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g;
var REVERSE_REGEX = /-[a-z\u00E0-\u00F6\u00F8-\u00FE]/g;
module.exports = exports = function kebabCase(str) {
return str.replace(KEBAB_REGEX, function (match) {
return '-' + match.toLowerCase();
});
};
exports.reverse = function (str) {
return str.replace(REVERSE_REGEX, function (match) {
return match.slice(1).toUpperCase();
});
};
},{}],24:[function(require,module,exports){
arguments[4][10][0].apply(exports,arguments)
},{"dup":10}],25:[function(require,module,exports){
arguments[4][8][0].apply(exports,arguments)
},{"dup":8,"trim":26}],26:[function(require,module,exports){
arguments[4][6][0].apply(exports,arguments)
},{"dup":6}],27:[function(require,module,exports){
'use strict';
/* eslint-disable max-params */
/* Expose. */
module.exports = is;
/* Assert if `test` passes for `node`.
* When a `parent` node is known the `index` of node */
function is(test, node, index, parent, context) {
var hasParent = parent !== null && parent !== undefined;
var hasIndex = index !== null && index !== undefined;
var check = convert(test);
if (
hasIndex &&
(typeof index !== 'number' || index < 0 || index === Infinity)
) {
throw new Error('Expected positive finite index or child node');
}
if (hasParent && (!is(null, parent) || !parent.children)) {
throw new Error('Expected parent node');
}
if (!node || !node.type || typeof node.type !== 'string') {
return false;
}
if (hasParent !== hasIndex) {
throw new Error('Expected both parent and index');
}
return Boolean(check.call(context, node, index, parent));
}
function convert(test) {
if (typeof test === 'string') {
return typeFactory(test);
}
if (test === null || test === undefined) {
return ok;
}
if (typeof test === 'object') {
return ('length' in test ? anyFactory : matchesFactory)(test);
}
if (typeof test === 'function') {
return test;
}
throw new Error('Expected function, string, or object as test');
}
function convertAll(tests) {
var results = [];
var length = tests.length;
var index = -1;
while (++index < length) {
results[index] = convert(tests[index]);
}
return results;
}
/* Utility assert each property in `test` is represented
* in `node`, and each values are strictly equal. */
function matchesFactory(test) {
return matches;
function matches(node) {
var key;
for (key in test) {
if (node[key] !== test[key]) {
return false;
}
}
return true;
}
}
function anyFactory(tests) {
var checks = convertAll(tests);
var length = checks.length;
return matches;
function matches() {
var index = -1;
while (++index < length) {
if (checks[index].apply(this, arguments)) {
return true;
}
}
return false;
}
}
/* Utility to convert a string into a function which checks
* a given node’s type for said string. */
function typeFactory(test) {
return type;
function type(node) {
return Boolean(node && node.type === test);
}
}
/* Utility to return true. */
function ok() {
return true;
}
},{}],28:[function(require,module,exports){
'use strict';
var array = require('x-is-array');
module.exports = factory;
/* Functional map with sugar. */
function factory(fn, options) {
var settings = options || {};
var key = settings.key;
var indices = settings.indices;
var gapless = settings.gapless;
if (typeof settings === 'string') {
key = settings;
}
if (indices == null) {
indices = true;
}
return all;
function all(values) {
var results = [];
var parent = values;
var index = -1;
var length;
var result;
if (key) {
if (array(values)) {
parent = null;
} else {
values = parent[key];
}
}
length = values.length;
while (++index < length) {
if (indices) {
result = fn.call(this, values[index], index, parent);
} else {
result = fn.call(this, values[index], parent);
}
if (!gapless || result != null) {
results.push(result);
}
}
return results;
}
}
},{"x-is-array":29}],29:[function(require,module,exports){
var nativeIsArray = Array.isArray
var toString = Object.prototype.toString
module.exports = nativeIsArray || isArray
function isArray(obj) {
return toString.call(obj) === "[object Array]"
}
},{}],30:[function(require,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],31:[function(require,module,exports){
module.exports=[
"area",
"base",
"basefont",
"bgsound",
"br",
"col",
"command",
"embed",
"frame",
"hr",
"image",
"img",
"input",
"isindex",
"keygen",
"link",
"menuitem",
"meta",
"nextid",
"param",
"source",
"track",
"wbr"
]
},{}],32:[function(require,module,exports){
'use strict';
var DOCUMENT_MODE = require('./html').DOCUMENT_MODE;
//Const
var VALID_DOCTYPE_NAME = 'html',
QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd',
QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
'+//silmaril//dtd html pro v0r11 19970101//en',
'-//advasoft ltd//dtd html 3.0 aswedit + extensions//en',
'-//as//dtd html 3.0 aswedit + extensions//en',
'-//ietf//dtd html 2.0 level 1//en',
'-//ietf//dtd html 2.0 level 2//en',
'-//ietf//dtd html 2.0 strict level 1//en',
'-//ietf//dtd html 2.0 strict level 2//en',
'-//ietf//dtd html 2.0 strict//en',
'-//ietf//dtd html 2.0//en',
'-//ietf//dtd html 2.1e//en',
'-//ietf//dtd html 3.0//en',
'-//ietf//dtd html 3.0//en//',
'-//ietf//dtd html 3.2 final//en',
'-//ietf//dtd html 3.2//en',
'-//ietf//dtd html 3//en',
'-//ietf//dtd html level 0//en',
'-//ietf//dtd html level 0//en//2.0',
'-//ietf//dtd html level 1//en',
'-//ietf//dtd html level 1//en//2.0',
'-//ietf//dtd html level 2//en',
'-//ietf//dtd html level 2//en//2.0',
'-//ietf//dtd html level 3//en',
'-//ietf//dtd html level 3//en//3.0',
'-//ietf//dtd html strict level 0//en',
'-//ietf//dtd html strict level 0//en//2.0',
'-//ietf//dtd html strict level 1//en',
'-//ietf//dtd html strict level 1//en//2.0',
'-//ietf//dtd html strict level 2//en',
'-//ietf//dtd html strict level 2//en//2.0',
'-//ietf//dtd html strict level 3//en',
'-//ietf//dtd html strict level 3//en//3.0',
'-//ietf//dtd html strict//en',
'-//ietf//dtd html strict//en//2.0',
'-//ietf//dtd html strict//en//3.0',
'-//ietf//dtd html//en',
'-//ietf//dtd html//en//2.0',
'-//ietf//dtd html//en//3.0',
'-//metrius//dtd metrius presentational//en',
'-//microsoft//dtd internet explorer 2.0 html strict//en',
'-//microsoft//dtd internet explorer 2.0 html//en',
'-//microsoft//dtd internet explorer 2.0 tables//en',
'-//microsoft//dtd internet explorer 3.0 html strict//en',
'-//microsoft//dtd internet explorer 3.0 html//en',
'-//microsoft//dtd internet explorer 3.0 tables//en',
'-//netscape comm. corp.//dtd html//en',
'-//netscape comm. corp.//dtd strict html//en',
'-//o\'reilly and associates//dtd html 2.0//en',
'-//o\'reilly and associates//dtd html extended 1.0//en',
'-//spyglass//dtd html 2.0 extended//en',
'-//sq//dtd html 2.0 hotmetal + extensions//en',
'-//sun microsystems corp.//dtd hotjava html//en',
'-//sun microsystems corp.//dtd hotjava strict html//en',
'-//w3c//dtd html 3 1995-03-24//en',
'-//w3c//dtd html 3.2 draft//en',
'-//w3c//dtd html 3.2 final//en',
'-//w3c//dtd html 3.2//en',
'-//w3c//dtd html 3.2s draft//en',
'-//w3c//dtd html 4.0 frameset//en',
'-//w3c//dtd html 4.0 transitional//en',
'-//w3c//dtd html experimental 19960712//en',
'-//w3c//dtd html experimental 970421//en',
'-//w3c//dtd w3 html//en',
'-//w3o//dtd w3 html 3.0//en',
'-//w3o//dtd w3 html 3.0//en//',
'-//webtechs//dtd mozilla html 2.0//en',
'-//webtechs//dtd mozilla html//en'
],
QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = QUIRKS_MODE_PUBLIC_ID_PREFIXES.concat([
'-//w3c//dtd html 4.01 frameset//',
'-//w3c//dtd html 4.01 transitional//'
]),
QUIRKS_MODE_PUBLIC_IDS = [
'-//w3o//dtd w3 html strict 3.0//en//',
'-/w3c/dtd html 4.0 transitional/en',
'html'
],
LIMITED_QUIRKS_PUBLIC_ID_PREFIXES = [
'-//W3C//DTD XHTML 1.0 Frameset//',
'-//W3C//DTD XHTML 1.0 Transitional//'
],
LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = LIMITED_QUIRKS_PUBLIC_ID_PREFIXES.concat([
'-//W3C//DTD HTML 4.01 Frameset//',
'-//W3C//DTD HTML 4.01 Transitional//'
]);
//Utils
function enquoteDoctypeId(id) {
var quote = id.indexOf('"') !== -1 ? '\'' : '"';
return quote + id + quote;
}
function hasPrefix(publicId, prefixes) {
for (var i = 0; i < prefixes.length; i++) {
if (publicId.indexOf(prefixes[i]) === 0)
return true;
}
return false;
}
//API
exports.getDocumentMode = function (name, publicId, systemId) {
if (name !== VALID_DOCTYPE_NAME)
return DOCUMENT_MODE.QUIRKS;
if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID)
return DOCUMENT_MODE.QUIRKS;
if (publicId !== null) {
publicId = publicId.toLowerCase();
if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1)
return DOCUMENT_MODE.QUIRKS;
var prefixes = systemId === null ? QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES : QUIRKS_MODE_PUBLIC_ID_PREFIXES;
if (hasPrefix(publicId, prefixes))
return DOCUMENT_MODE.QUIRKS;
prefixes = systemId === null ? LIMITED_QUIRKS_PUBLIC_ID_PREFIXES : LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES;
if (hasPrefix(publicId, prefixes))
return DOCUMENT_MODE.LIMITED_QUIRKS;
}
return DOCUMENT_MODE.NO_QUIRKS;
};
exports.serializeContent = function (name, publicId, systemId) {
var str = '!DOCTYPE ';
if (name)
str += name;
if (publicId !== null)
str += ' PUBLIC ' + enquoteDoctypeId(publicId);
else if (systemId !== null)
str += ' SYSTEM';
if (systemId !== null)
str += ' ' + enquoteDoctypeId(systemId);
return str;
};
},{"./html":34}],33:[function(require,module,exports){
'use strict';
var Tokenizer = require('../tokenizer'),
HTML = require('./html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES,
ATTRS = HTML.ATTRS;
//MIME types
var MIME_TYPES = {
TEXT_HTML: 'text/html',
APPLICATION_XML: 'application/xhtml+xml'
};
//Attributes
var DEFINITION_URL_ATTR = 'definitionurl',
ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL',
SVG_ATTRS_ADJUSTMENT_MAP = {
'attributename': 'attributeName',
'attributetype': 'attributeType',
'basefrequency': 'baseFrequency',
'baseprofile': 'baseProfile',
'calcmode': 'calcMode',
'clippathunits': 'clipPathUnits',
'diffuseconstant': 'diffuseConstant',
'edgemode': 'edgeMode',
'filterunits': 'filterUnits',
'glyphref': 'glyphRef',
'gradienttransform': 'gradientTransform',
'gradientunits': 'gradientUnits',
'kernelmatrix': 'kernelMatrix',
'kernelunitlength': 'kernelUnitLength',
'keypoints': 'keyPoints',
'keysplines': 'keySplines',
'keytimes': 'keyTimes',
'lengthadjust': 'lengthAdjust',
'limitingconeangle': 'limitingConeAngle',
'markerheight': 'markerHeight',
'markerunits': 'markerUnits',
'markerwidth': 'markerWidth',
'maskcontentunits': 'maskContentUnits',
'maskunits': 'maskUnits',
'numoctaves': 'numOctaves',
'pathlength': 'pathLength',
'patterncontentunits': 'patternContentUnits',
'patterntransform': 'patternTransform',
'patternunits': 'patternUnits',
'pointsatx': 'pointsAtX',
'pointsaty': 'pointsAtY',
'pointsatz': 'pointsAtZ',
'preservealpha': 'preserveAlpha',
'preserveaspectratio': 'preserveAspectRatio',
'primitiveunits': 'primitiveUnits',
'refx': 'refX',
'refy': 'refY',
'repeatcount': 'repeatCount',
'repeatdur': 'repeatDur',
'requiredextensions': 'requiredExtensions',
'requiredfeatures': 'requiredFeatures',
'specularconstant': 'specularConstant',
'specularexponent': 'specularExponent',
'spreadmethod': 'spreadMethod',
'startoffset': 'startOffset',
'stddeviation': 'stdDeviation',
'stitchtiles': 'stitchTiles',
'surfacescale': 'surfaceScale',
'systemlanguage': 'systemLanguage',
'tablevalues': 'tableValues',
'targetx': 'targetX',
'targety': 'targetY',
'textlength': 'textLength',
'viewbox': 'viewBox',
'viewtarget': 'viewTarget',
'xchannelselector': 'xChannelSelector',
'ychannelselector': 'yChannelSelector',
'zoomandpan': 'zoomAndPan'
},
XML_ATTRS_ADJUSTMENT_MAP = {
'xlink:actuate': {prefix: 'xlink', name: 'actuate', namespace: NS.XLINK},
'xlink:arcrole': {prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK},
'xlink:href': {prefix: 'xlink', name: 'href', namespace: NS.XLINK},
'xlink:role': {prefix: 'xlink', name: 'role', namespace: NS.XLINK},
'xlink:show': {prefix: 'xlink', name: 'show', namespace: NS.XLINK},
'xlink:title': {prefix: 'xlink', name: 'title', namespace: NS.XLINK},
'xlink:type': {prefix: 'xlink', name: 'type', namespace: NS.XLINK},
'xml:base': {prefix: 'xml', name: 'base', namespace: NS.XML},
'xml:lang': {prefix: 'xml', name: 'lang', namespace: NS.XML},
'xml:space': {prefix: 'xml', name: 'space', namespace: NS.XML},
'xmlns': {prefix: '', name: 'xmlns', namespace: NS.XMLNS},
'xmlns:xlink': {prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS}
};
//SVG tag names adjustment map
var SVG_TAG_NAMES_ADJUSTMENT_MAP = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = {
'altglyph': 'altGlyph',
'altglyphdef': 'altGlyphDef',
'altglyphitem': 'altGlyphItem',
'animatecolor': 'animateColor',
'animatemotion': 'animateMotion',
'animatetransform': 'animateTransform',
'clippath': 'clipPath',
'feblend': 'feBlend',
'fecolormatrix': 'feColorMatrix',
'fecomponenttransfer': 'feComponentTransfer',
'fecomposite': 'feComposite',
'feconvolvematrix': 'feConvolveMatrix',
'fediffuselighting': 'feDiffuseLighting',
'fedisplacementmap': 'feDisplacementMap',
'fedistantlight': 'feDistantLight',
'feflood': 'feFlood',
'fefunca': 'feFuncA',
'fefuncb': 'feFuncB',
'fefuncg': 'feFuncG',
'fefuncr': 'feFuncR',
'fegaussianblur': 'feGaussianBlur',
'feimage': 'feImage',
'femerge': 'feMerge',
'femergenode': 'feMergeNode',
'femorphology': 'feMorphology',
'feoffset': 'feOffset',
'fepointlight': 'fePointLight',
'fespecularlighting': 'feSpecularLighting',
'fespotlight': 'feSpotLight',
'fetile': 'feTile',
'feturbulence': 'feTurbulence',
'foreignobject': 'foreignObject',
'glyphref': 'glyphRef',
'lineargradient': 'linearGradient',
'radialgradient': 'radialGradient',
'textpath': 'textPath'
};
//Tags that causes exit from foreign content
var EXITS_FOREIGN_CONTENT = Object.create(null);
EXITS_FOREIGN_CONTENT[$.B] = true;
EXITS_FOREIGN_CONTENT[$.BIG] = true;
EXITS_FOREIGN_CONTENT[$.BLOCKQUOTE] = true;
EXITS_FOREIGN_CONTENT[$.BODY] = true;
EXITS_FOREIGN_CONTENT[$.BR] = true;
EXITS_FOREIGN_CONTENT[$.CENTER] = true;
EXITS_FOREIGN_CONTENT[$.CODE] = true;
EXITS_FOREIGN_CONTENT[$.DD] = true;
EXITS_FOREIGN_CONTENT[$.DIV] = true;
EXITS_FOREIGN_CONTENT[$.DL] = true;
EXITS_FOREIGN_CONTENT[$.DT] = true;
EXITS_FOREIGN_CONTENT[$.EM] = true;
EXITS_FOREIGN_CONTENT[$.EMBED] = true;
EXITS_FOREIGN_CONTENT[$.H1] = true;
EXITS_FOREIGN_CONTENT[$.H2] = true;
EXITS_FOREIGN_CONTENT[$.H3] = true;
EXITS_FOREIGN_CONTENT[$.H4] = true;
EXITS_FOREIGN_CONTENT[$.H5] = true;
EXITS_FOREIGN_CONTENT[$.H6] = true;
EXITS_FOREIGN_CONTENT[$.HEAD] = true;
EXITS_FOREIGN_CONTENT[$.HR] = true;
EXITS_FOREIGN_CONTENT[$.I] = true;
EXITS_FOREIGN_CONTENT[$.IMG] = true;
EXITS_FOREIGN_CONTENT[$.LI] = true;
EXITS_FOREIGN_CONTENT[$.LISTING] = true;
EXITS_FOREIGN_CONTENT[$.MENU] = true;
EXITS_FOREIGN_CONTENT[$.META] = true;
EXITS_FOREIGN_CONTENT[$.NOBR] = true;
EXITS_FOREIGN_CONTENT[$.OL] = true;
EXITS_FOREIGN_CONTENT[$.P] = true;
EXITS_FOREIGN_CONTENT[$.PRE] = true;
EXITS_FOREIGN_CONTENT[$.RUBY] = true;
EXITS_FOREIGN_CONTENT[$.S] = true;
EXITS_FOREIGN_CONTENT[$.SMALL] = true;
EXITS_FOREIGN_CONTENT[$.SPAN] = true;
EXITS_FOREIGN_CONTENT[$.STRONG] = true;
EXITS_FOREIGN_CONTENT[$.STRIKE] = true;
EXITS_FOREIGN_CONTENT[$.SUB] = true;
EXITS_FOREIGN_CONTENT[$.SUP] = true;
EXITS_FOREIGN_CONTENT[$.TABLE] = true;
EXITS_FOREIGN_CONTENT[$.TT] = true;
EXITS_FOREIGN_CONTENT[$.U] = true;
EXITS_FOREIGN_CONTENT[$.UL] = true;
EXITS_FOREIGN_CONTENT[$.VAR] = true;
//Check exit from foreign content
exports.causesExit = function (startTagToken) {
var tn = startTagToken.tagName;
var isFontWithAttrs = tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null);
return isFontWithAttrs ? true : EXITS_FOREIGN_CONTENT[tn];
};
//Token adjustments
exports.adjustTokenMathMLAttrs = function (token) {
for (var i = 0; i < token.attrs.length; i++) {
if (token.attrs[i].name === DEFINITION_URL_ATTR) {
token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR;
break;
}
}
};
exports.adjustTokenSVGAttrs = function (token) {
for (var i = 0; i < token.attrs.length; i++) {
var adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
if (adjustedAttrName)
token.attrs[i].name = adjustedAttrName;
}
};
exports.adjustTokenXMLAttrs = function (token) {
for (var i = 0; i < token.attrs.length; i++) {
var adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name];
if (adjustedAttrEntry) {
token.attrs[i].prefix = adjustedAttrEntry.prefix;
token.attrs[i].name = adjustedAttrEntry.name;
token.attrs[i].namespace = adjustedAttrEntry.namespace;
}
}
};
exports.adjustTokenSVGTagName = function (token) {
var adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName];
if (adjustedTagName)
token.tagName = adjustedTagName;
};
//Integration points
function isMathMLTextIntegrationPoint(tn, ns) {
return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT);
}
function isHtmlIntegrationPoint(tn, ns, attrs) {
if (ns === NS.MATHML && tn === $.ANNOTATION_XML) {
for (var i = 0; i < attrs.length; i++) {
if (attrs[i].name === ATTRS.ENCODING) {
var value = attrs[i].value.toLowerCase();
return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML;
}
}
}
return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE);
}
exports.isIntegrationPoint = function (tn, ns, attrs, foreignNS) {
if ((!foreignNS || foreignNS === NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs))
return true;
if ((!foreignNS || foreignNS === NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns))
return true;
return false;
};
},{"../tokenizer":42,"./html":34}],34:[function(require,module,exports){
'use strict';
var NS = exports.NAMESPACES = {
HTML: 'http://www.w3.org/1999/xhtml',
MATHML: 'http://www.w3.org/1998/Math/MathML',
SVG: 'http://www.w3.org/2000/svg',
XLINK: 'http://www.w3.org/1999/xlink',
XML: 'http://www.w3.org/XML/1998/namespace',
XMLNS: 'http://www.w3.org/2000/xmlns/'
};
exports.ATTRS = {
TYPE: 'type',
ACTION: 'action',
ENCODING: 'encoding',
PROMPT: 'prompt',
NAME: 'name',
COLOR: 'color',
FACE: 'face',
SIZE: 'size'
};
exports.DOCUMENT_MODE = {
NO_QUIRKS: 'no-quirks',
QUIRKS: 'quirks',
LIMITED_QUIRKS: 'limited-quirks'
};
var $ = exports.TAG_NAMES = {
A: 'a',
ADDRESS: 'address',
ANNOTATION_XML: 'annotation-xml',
APPLET: 'applet',
AREA: 'area',
ARTICLE: 'article',
ASIDE: 'aside',
B: 'b',
BASE: 'base',
BASEFONT: 'basefont',
BGSOUND: 'bgsound',
BIG: 'big',
BLOCKQUOTE: 'blockquote',
BODY: 'body',
BR: 'br',
BUTTON: 'button',
CAPTION: 'caption',
CENTER: 'center',
CODE: 'code',
COL: 'col',
COLGROUP: 'colgroup',
DD: 'dd',
DESC: 'desc',
DETAILS: 'details',
DIALOG: 'dialog',
DIR: 'dir',
DIV: 'div',
DL: 'dl',
DT: 'dt',
EM: 'em',
EMBED: 'embed',
FIELDSET: 'fieldset',
FIGCAPTION: 'figcaption',
FIGURE: 'figure',
FONT: 'font',
FOOTER: 'footer',
FOREIGN_OBJECT: 'foreignObject',
FORM: 'form',
FRAME: 'frame',
FRAMESET: 'frameset',
H1: 'h1',
H2: 'h2',
H3: 'h3',
H4: 'h4',
H5: 'h5',
H6: 'h6',
HEAD: 'head',
HEADER: 'header',
HGROUP: 'hgroup',
HR: 'hr',
HTML: 'html',
I: 'i',
IMG: 'img',
IMAGE: 'image',
INPUT: 'input',
IFRAME: 'iframe',
KEYGEN: 'keygen',
LABEL: 'label',
LI: 'li',
LINK: 'link',
LISTING: 'listing',
MAIN: 'main',
MALIGNMARK: 'malignmark',
MARQUEE: 'marquee',
MATH: 'math',
MENU: 'menu',
MENUITEM: 'menuitem',
META: 'meta',
MGLYPH: 'mglyph',
MI: 'mi',
MO: 'mo',
MN: 'mn',
MS: 'ms',
MTEXT: 'mtext',
NAV: 'nav',
NOBR: 'nobr',
NOFRAMES: 'noframes',
NOEMBED: 'noembed',
NOSCRIPT: 'noscript',
OBJECT: 'object',
OL: 'ol',
OPTGROUP: 'optgroup',
OPTION: 'option',
P: 'p',
PARAM: 'param',
PLAINTEXT: 'plaintext',
PRE: 'pre',
RB: 'rb',
RP: 'rp',
RT: 'rt',
RTC: 'rtc',
RUBY: 'ruby',
S: 's',
SCRIPT: 'script',
SECTION: 'section',
SELECT: 'select',
SOURCE: 'source',
SMALL: 'small',
SPAN: 'span',
STRIKE: 'strike',
STRONG: 'strong',
STYLE: 'style',
SUB: 'sub',
SUMMARY: 'summary',
SUP: 'sup',
TABLE: 'table',
TBODY: 'tbody',
TEMPLATE: 'template',
TEXTAREA: 'textarea',
TFOOT: 'tfoot',
TD: 'td',
TH: 'th',
THEAD: 'thead',
TITLE: 'title',
TR: 'tr',
TRACK: 'track',
TT: 'tt',
U: 'u',
UL: 'ul',
SVG: 'svg',
VAR: 'var',
WBR: 'wbr',
XMP: 'xmp'
};
var SPECIAL_ELEMENTS = exports.SPECIAL_ELEMENTS = Object.create(null);
SPECIAL_ELEMENTS[NS.HTML] = Object.create(null);
SPECIAL_ELEMENTS[NS.HTML][$.ADDRESS] = true;
SPECIAL_ELEMENTS[NS.HTML][$.APPLET] = true;
SPECIAL_ELEMENTS[NS.HTML][$.AREA] = true;
SPECIAL_ELEMENTS[NS.HTML][$.ARTICLE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.ASIDE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BASE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BASEFONT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BGSOUND] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BLOCKQUOTE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BODY] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BR] = true;
SPECIAL_ELEMENTS[NS.HTML][$.BUTTON] = true;
SPECIAL_ELEMENTS[NS.HTML][$.CAPTION] = true;
SPECIAL_ELEMENTS[NS.HTML][$.CENTER] = true;
SPECIAL_ELEMENTS[NS.HTML][$.COL] = true;
SPECIAL_ELEMENTS[NS.HTML][$.COLGROUP] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DD] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DETAILS] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DIR] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DIV] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DL] = true;
SPECIAL_ELEMENTS[NS.HTML][$.DT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.EMBED] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FIELDSET] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FIGCAPTION] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FIGURE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FOOTER] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FORM] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FRAME] = true;
SPECIAL_ELEMENTS[NS.HTML][$.FRAMESET] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H1] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H2] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H3] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H4] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H5] = true;
SPECIAL_ELEMENTS[NS.HTML][$.H6] = true;
SPECIAL_ELEMENTS[NS.HTML][$.HEAD] = true;
SPECIAL_ELEMENTS[NS.HTML][$.HEADER] = true;
SPECIAL_ELEMENTS[NS.HTML][$.HGROUP] = true;
SPECIAL_ELEMENTS[NS.HTML][$.HR] = true;
SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true;
SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true;
SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true;
SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LI] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true;
SPECIAL_ELEMENTS[NS.HTML][$.META] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NOFRAMES] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NOSCRIPT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.OBJECT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.OL] = true;
SPECIAL_ELEMENTS[NS.HTML][$.P] = true;
SPECIAL_ELEMENTS[NS.HTML][$.PARAM] = true;
SPECIAL_ELEMENTS[NS.HTML][$.PLAINTEXT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.PRE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.SCRIPT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.SECTION] = true;
SPECIAL_ELEMENTS[NS.HTML][$.SELECT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.SOURCE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.STYLE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.SUMMARY] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TABLE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TBODY] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TD] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TEMPLATE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TEXTAREA] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TFOOT] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TH] = true;
SPECIAL_ELEMENTS[NS.HTML][$.THEAD] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TITLE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TR] = true;
SPECIAL_ELEMENTS[NS.HTML][$.TRACK] = true;
SPECIAL_ELEMENTS[NS.HTML][$.UL] = true;
SPECIAL_ELEMENTS[NS.HTML][$.WBR] = true;
SPECIAL_ELEMENTS[NS.HTML][$.XMP] = true;
SPECIAL_ELEMENTS[NS.MATHML] = Object.create(null);
SPECIAL_ELEMENTS[NS.MATHML][$.MI] = true;
SPECIAL_ELEMENTS[NS.MATHML][$.MO] = true;
SPECIAL_ELEMENTS[NS.MATHML][$.MN] = true;
SPECIAL_ELEMENTS[NS.MATHML][$.MS] = true;
SPECIAL_ELEMENTS[NS.MATHML][$.MTEXT] = true;
SPECIAL_ELEMENTS[NS.MATHML][$.ANNOTATION_XML] = true;
SPECIAL_ELEMENTS[NS.SVG] = Object.create(null);
SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true;
SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true;
SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true;
},{}],35:[function(require,module,exports){
'use strict';
module.exports = function mergeOptions(defaults, options) {
options = options || Object.create(null);
return [defaults, options].reduce(function (merged, optObj) {
Object.keys(optObj).forEach(function (key) {
merged[key] = optObj[key];
});
return merged;
}, Object.create(null));
};
},{}],36:[function(require,module,exports){
'use strict';
exports.REPLACEMENT_CHARACTER = '\uFFFD';
exports.CODE_POINTS = {
EOF: -1,
NULL: 0x00,
TABULATION: 0x09,
CARRIAGE_RETURN: 0x0D,
LINE_FEED: 0x0A,
FORM_FEED: 0x0C,
SPACE: 0x20,
EXCLAMATION_MARK: 0x21,
QUOTATION_MARK: 0x22,
NUMBER_SIGN: 0x23,
AMPERSAND: 0x26,
APOSTROPHE: 0x27,
HYPHEN_MINUS: 0x2D,
SOLIDUS: 0x2F,
DIGIT_0: 0x30,
DIGIT_9: 0x39,
SEMICOLON: 0x3B,
LESS_THAN_SIGN: 0x3C,
EQUALS_SIGN: 0x3D,
GREATER_THAN_SIGN: 0x3E,
QUESTION_MARK: 0x3F,
LATIN_CAPITAL_A: 0x41,
LATIN_CAPITAL_F: 0x46,
LATIN_CAPITAL_X: 0x58,
LATIN_CAPITAL_Z: 0x5A,
GRAVE_ACCENT: 0x60,
LATIN_SMALL_A: 0x61,
LATIN_SMALL_F: 0x66,
LATIN_SMALL_X: 0x78,
LATIN_SMALL_Z: 0x7A,
REPLACEMENT_CHARACTER: 0xFFFD
};
exports.CODE_POINT_SEQUENCES = {
DASH_DASH_STRING: [0x2D, 0x2D], //--
DOCTYPE_STRING: [0x44, 0x4F, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE
CDATA_START_STRING: [0x5B, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5B], //[CDATA[
CDATA_END_STRING: [0x5D, 0x5D, 0x3E], //]]>
SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script
PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4C, 0x49, 0x43], //PUBLIC
SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM
};
},{}],37:[function(require,module,exports){
'use strict';
var OpenElementStack = require('../parser/open_element_stack'),
Tokenizer = require('../tokenizer'),
HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES;
exports.assign = function (parser) {
//NOTE: obtain Parser proto this way to avoid module circular references
var parserProto = Object.getPrototypeOf(parser),
treeAdapter = parser.treeAdapter,
attachableElementLocation = null,
lastFosterParentingLocation = null,
currentToken = null;
function setEndLocation(element, closingToken) {
var loc = element.__location;
if (!loc)
return;
if (!loc.startTag) {
loc.startTag = {
line: loc.line,
col: loc.col,
startOffset: loc.startOffset,
endOffset: loc.endOffset
};
if (loc.attrs)
loc.startTag.attrs = loc.attrs;
}
if (closingToken.location) {
var ctLocation = closingToken.location,
tn = treeAdapter.getTagName(element),
// NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing tag and
// for cases like <td> <p> </td> - 'p' closes without a closing tag
isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN &&
tn === closingToken.tagName;
if (isClosingEndTag) {
loc.endTag = {
line: ctLocation.line,
col: ctLocation.col,
startOffset: ctLocation.startOffset,
endOffset: ctLocation.endOffset
};
}
if (isClosingEndTag)
loc.endOffset = ctLocation.endOffset;
else
loc.endOffset = ctLocation.startOffset;
}
else if (closingToken.type === Tokenizer.EOF_TOKEN)
loc.endOffset = parser.tokenizer.preprocessor.sourcePos;
}
//NOTE: patch _bootstrap method
parser._bootstrap = function (document, fragmentContext) {
parserProto._bootstrap.call(this, document, fragmentContext);
attachableElementLocation = null;
lastFosterParentingLocation = null;
currentToken = null;
//OpenElementStack
parser.openElements.pop = function () {
setEndLocation(this.current, currentToken);
OpenElementStack.prototype.pop.call(this);
};
parser.openElements.popAllUpToHtmlElement = function () {
for (var i = this.stackTop; i > 0; i--)
setEndLocation(this.items[i], currentToken);
OpenElementStack.prototype.popAllUpToHtmlElement.call(this);
};
parser.openElements.remove = function (element) {
setEndLocation(element, currentToken);
OpenElementStack.prototype.remove.call(this, element);
};
};
parser._runParsingLoop = function (scriptHandler) {
parserProto._runParsingLoop.call(this, scriptHandler);
// NOTE: generate location info for elements
// that remains on open element stack
for (var i = parser.openElements.stackTop; i >= 0; i--)
setEndLocation(parser.openElements.items[i], currentToken);
};
//Token processing
parser._processTokenInForeignContent = function (token) {
currentToken = token;
parserProto._processTokenInForeignContent.call(this, token);
};
parser._processToken = function (token) {
currentToken = token;
parserProto._processToken.call(this, token);
//NOTE: <body> and <html> are never popped from the stack, so we need to updated
//their end location explicitly.
if (token.type === Tokenizer.END_TAG_TOKEN &&
(token.tagName === $.HTML ||
token.tagName === $.BODY && this.openElements.hasInScope($.BODY))) {
for (var i = this.openElements.stackTop; i >= 0; i--) {
var element = this.openElements.items[i];
if (this.treeAdapter.getTagName(element) === token.tagName) {
setEndLocation(element, token);
break;
}
}
}
};
//Doctype
parser._setDocumentType = function (token) {
parserProto._setDocumentType.call(this, token);
var documentChildren = this.treeAdapter.getChildNodes(this.document),
cnLength = documentChildren.length;
for (var i = 0; i < cnLength; i++) {
var node = documentChildren[i];
if (this.treeAdapter.isDocumentTypeNode(node)) {
node.__location = token.location;
break;
}
}
};
//Elements
parser._attachElementToTree = function (element) {
//NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
//So we will use token location stored in this methods for the element.
element.__location = attachableElementLocation || null;
attachableElementLocation = null;
parserProto._attachElementToTree.call(this, element);
};
parser._appendElement = function (token, namespaceURI) {
attachableElementLocation = token.location;
parserProto._appendElement.call(this, token, namespaceURI);
};
parser._insertElement = function (token, namespaceURI) {
attachableElementLocation = token.location;
parserProto._insertElement.call(this, token, namespaceURI);
};
parser._insertTemplate = function (token) {
attachableElementLocation = token.location;
parserProto._insertTemplate.call(this, token);
var tmplContent = this.treeAdapter.getTemplateContent(this.openElements.current);
tmplContent.__location = null;
};
parser._insertFakeRootElement = function () {
parserProto._insertFakeRootElement.call(this);
this.openElements.current.__location = null;
};
//Comments
parser._appendCommentNode = function (token, parent) {
parserProto._appendCommentNode.call(this, token, parent);
var children = this.treeAdapter.getChildNodes(parent),
commentNode = children[children.length - 1];
commentNode.__location = token.location;
};
//Text
parser._findFosterParentingLocation = function () {
//NOTE: store last foster parenting location, so we will be able to find inserted text
//in case of foster parenting
lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this);
return lastFosterParentingLocation;
};
parser._insertCharacters = function (token) {
parserProto._insertCharacters.call(this, token);
var hasFosterParent = this._shouldFosterParentOnInsertion(),
parent = hasFosterParent && lastFosterParentingLocation.parent ||
this.openElements.currentTmplContent ||
this.openElements.current,
siblings = this.treeAdapter.getChildNodes(parent),
textNodeIdx = hasFosterParent && lastFosterParentingLocation.beforeElement ?
siblings.indexOf(lastFosterParentingLocation.beforeElement) - 1 :
siblings.length - 1,
textNode = siblings[textNodeIdx];
//NOTE: if we have location assigned by another token, then just update end position
if (textNode.__location)
textNode.__location.endOffset = token.location.endOffset;
else
textNode.__location = token.location;
};
};
},{"../common/html":34,"../parser/open_element_stack":41,"../tokenizer":42}],38:[function(require,module,exports){
'use strict';
var UNICODE = require('../common/unicode');
//Aliases
var $ = UNICODE.CODE_POINTS;
exports.assign = function (tokenizer) {
//NOTE: obtain Tokenizer proto this way to avoid module circular references
var tokenizerProto = Object.getPrototypeOf(tokenizer),
tokenStartOffset = -1,
tokenCol = -1,
tokenLine = 1,
isEol = false,
lineStartPos = 0,
col = -1,
line = 1;
function attachLocationInfo(token) {
token.location = {
line: tokenLine,
col: tokenCol,
startOffset: tokenStartOffset,
endOffset: -1
};
}
//NOTE: patch consumption method to track line/col information
tokenizer._consume = function () {
var cp = tokenizerProto._consume.call(this);
//NOTE: LF should be in the last column of the line
if (isEol) {
isEol = false;
line++;
lineStartPos = this.preprocessor.sourcePos;
}
if (cp === $.LINE_FEED)
isEol = true;
col = this.preprocessor.sourcePos - lineStartPos + 1;
return cp;
};
tokenizer._unconsume = function () {
tokenizerProto._unconsume.call(this);
isEol = false;
col = this.preprocessor.sourcePos - lineStartPos + 1;
};
//NOTE: patch token creation methods and attach location objects
tokenizer._createStartTagToken = function () {
tokenizerProto._createStartTagToken.call(this);
attachLocationInfo(this.currentToken);
};
tokenizer._createEndTagToken = function () {
tokenizerProto._createEndTagToken.call(this);
attachLocationInfo(this.currentToken);
};
tokenizer._createCommentToken = function () {
tokenizerProto._createCommentToken.call(this);
attachLocationInfo(this.currentToken);
};
tokenizer._createDoctypeToken = function (initialName) {
tokenizerProto._createDoctypeToken.call(this, initialName);
attachLocationInfo(this.currentToken);
};
tokenizer._createCharacterToken = function (type, ch) {
tokenizerProto._createCharacterToken.call(this, type, ch);
attachLocationInfo(this.currentCharacterToken);
};
tokenizer._createAttr = function (attrNameFirstCh) {
tokenizerProto._createAttr.call(this, attrNameFirstCh);
this.currentAttrLocation = {
line: line,
col: col,
startOffset: this.preprocessor.sourcePos,
endOffset: -1
};
};
tokenizer._leaveAttrName = function (toState) {
tokenizerProto._leaveAttrName.call(this, toState);
this._attachCurrentAttrLocationInfo();
};
tokenizer._leaveAttrValue = function (toState) {
tokenizerProto._leaveAttrValue.call(this, toState);
this._attachCurrentAttrLocationInfo();
};
tokenizer._attachCurrentAttrLocationInfo = function () {
this.currentAttrLocation.endOffset = this.preprocessor.sourcePos;
if (!this.currentToken.location.attrs)
this.currentToken.location.attrs = Object.create(null);
this.currentToken.location.attrs[this.currentAttr.name] = this.currentAttrLocation;
};
//NOTE: patch token emission methods to determine end location
tokenizer._emitCurrentToken = function () {
//NOTE: if we have pending character token make it's end location equal to the
//current token's start location.
if (this.currentCharacterToken)
this.currentCharacterToken.location.endOffset = this.currentToken.location.startOffset;
this.currentToken.location.endOffset = this.preprocessor.sourcePos + 1;
tokenizerProto._emitCurrentToken.call(this);
};
tokenizer._emitCurrentCharacterToken = function () {
//NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(),
//then set it's location at the current preprocessor position.
//We don't need to increment preprocessor position, since character token
//emission is always forced by the start of the next character token here.
//So, we already have advanced position.
if (this.currentCharacterToken && this.currentCharacterToken.location.endOffset === -1)
this.currentCharacterToken.location.endOffset = this.preprocessor.sourcePos;
tokenizerProto._emitCurrentCharacterToken.call(this);
};
//NOTE: patch initial states for each mode to obtain token start position
Object.keys(tokenizerProto.MODE)
.map(function (modeName) {
return tokenizerProto.MODE[modeName];
})
.forEach(function (state) {
tokenizer[state] = function (cp) {
tokenStartOffset = this.preprocessor.sourcePos;
tokenLine = line;
tokenCol = col;
tokenizerProto[state].call(this, cp);
};
});
};
},{"../common/unicode":36}],39:[function(require,module,exports){
'use strict';
//Const
var NOAH_ARK_CAPACITY = 3;
//List of formatting elements
var FormattingElementList = module.exports = function (treeAdapter) {
this.length = 0;
this.entries = [];
this.treeAdapter = treeAdapter;
this.bookmark = null;
};
//Entry types
FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
//Noah Ark's condition
//OPTIMIZATION: at first we try to find possible candidates for exclusion using
//lightweight heuristics without thorough attributes check.
FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) {
var candidates = [];
if (this.length >= NOAH_ARK_CAPACITY) {
var neAttrsLength = this.treeAdapter.getAttrList(newElement).length,
neTagName = this.treeAdapter.getTagName(newElement),
neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.MARKER_ENTRY)
break;
var element = entry.element,
elementAttrs = this.treeAdapter.getAttrList(element),
isCandidate = this.treeAdapter.getTagName(element) === neTagName &&
this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
elementAttrs.length === neAttrsLength;
if (isCandidate)
candidates.push({idx: i, attrs: elementAttrs});
}
}
return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
};
FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) {
var candidates = this._getNoahArkConditionCandidates(newElement),
cLength = candidates.length;
if (cLength) {
var neAttrs = this.treeAdapter.getAttrList(newElement),
neAttrsLength = neAttrs.length,
neAttrsMap = Object.create(null);
//NOTE: build attrs map for the new element so we can perform fast lookups
for (var i = 0; i < neAttrsLength; i++) {
var neAttr = neAttrs[i];
neAttrsMap[neAttr.name] = neAttr.value;
}
for (i = 0; i < neAttrsLength; i++) {
for (var j = 0; j < cLength; j++) {
var cAttr = candidates[j].attrs[i];
if (neAttrsMap[cAttr.name] !== cAttr.value) {
candidates.splice(j, 1);
cLength--;
}
if (candidates.length < NOAH_ARK_CAPACITY)
return;
}
}
//NOTE: remove bottommost candidates until Noah's Ark condition will not be met
for (i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
this.entries.splice(candidates[i].idx, 1);
this.length--;
}
}
};
//Mutations
FormattingElementList.prototype.insertMarker = function () {
this.entries.push({type: FormattingElementList.MARKER_ENTRY});
this.length++;
};
FormattingElementList.prototype.pushElement = function (element, token) {
this._ensureNoahArkCondition(element);
this.entries.push({
type: FormattingElementList.ELEMENT_ENTRY,
element: element,
token: token
});
this.length++;
};
FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) {
var bookmarkIdx = this.length - 1;
for (; bookmarkIdx >= 0; bookmarkIdx--) {
if (this.entries[bookmarkIdx] === this.bookmark)
break;
}
this.entries.splice(bookmarkIdx + 1, 0, {
type: FormattingElementList.ELEMENT_ENTRY,
element: element,
token: token
});
this.length++;
};
FormattingElementList.prototype.removeEntry = function (entry) {
for (var i = this.length - 1; i >= 0; i--) {
if (this.entries[i] === entry) {
this.entries.splice(i, 1);
this.length--;
break;
}
}
};
FormattingElementList.prototype.clearToLastMarker = function () {
while (this.length) {
var entry = this.entries.pop();
this.length--;
if (entry.type === FormattingElementList.MARKER_ENTRY)
break;
}
};
//Search
FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) {
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.MARKER_ENTRY)
return null;
if (this.treeAdapter.getTagName(entry.element) === tagName)
return entry;
}
return null;
};
FormattingElementList.prototype.getElementEntry = function (element) {
for (var i = this.length - 1; i >= 0; i--) {
var entry = this.entries[i];
if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element === element)
return entry;
}
return null;
};
},{}],40:[function(require,module,exports){
'use strict';
var Tokenizer = require('../tokenizer'),
OpenElementStack = require('./open_element_stack'),
FormattingElementList = require('./formatting_element_list'),
locationInfoMixin = require('../location_info/parser_mixin'),
defaultTreeAdapter = require('../tree_adapters/default'),
doctype = require('../common/doctype'),
foreignContent = require('../common/foreign_content'),
mergeOptions = require('../common/merge_options'),
UNICODE = require('../common/unicode'),
HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES,
ATTRS = HTML.ATTRS;
var DEFAULT_OPTIONS = {
locationInfo: false,
treeAdapter: defaultTreeAdapter
};
//Misc constants
var HIDDEN_INPUT_TYPE = 'hidden';
//Adoption agency loops iteration count
var AA_OUTER_LOOP_ITER = 8,
AA_INNER_LOOP_ITER = 3;
//Insertion modes
var INITIAL_MODE = 'INITIAL_MODE',
BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',
BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',
IN_HEAD_MODE = 'IN_HEAD_MODE',
AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',
IN_BODY_MODE = 'IN_BODY_MODE',
TEXT_MODE = 'TEXT_MODE',
IN_TABLE_MODE = 'IN_TABLE_MODE',
IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',
IN_CAPTION_MODE = 'IN_CAPTION_MODE',
IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',
IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',
IN_ROW_MODE = 'IN_ROW_MODE',
IN_CELL_MODE = 'IN_CELL_MODE',
IN_SELECT_MODE = 'IN_SELECT_MODE',
IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',
IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',
AFTER_BODY_MODE = 'AFTER_BODY_MODE',
IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',
AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',
AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',
AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
//Insertion mode reset map
var INSERTION_MODE_RESET_MAP = Object.create(null);
INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;
INSERTION_MODE_RESET_MAP[$.TBODY] =
INSERTION_MODE_RESET_MAP[$.THEAD] =
INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;
INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;
INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;
INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;
INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;
INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE;
//Template insertion mode switch map
var TEMPLATE_INSERTION_MODE_SWITCH_MAP = Object.create(null);
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] =
TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE;
//Token handlers map for insertion modes
var _ = Object.create(null);
_[INITIAL_MODE] = Object.create(null);
_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] =
_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;
_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;
_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] =
_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] =
_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;
_[BEFORE_HTML_MODE] = Object.create(null);
_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] =
_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;
_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;
_[BEFORE_HEAD_MODE] = Object.create(null);
_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;
_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;
_[IN_HEAD_MODE] = Object.create(null);
_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;
_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;
_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;
_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;
_[AFTER_HEAD_MODE] = Object.create(null);
_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;
_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;
_[IN_BODY_MODE] = Object.create(null);
_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;
_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;
_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[TEXT_MODE] = Object.create(null);
_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] =
_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;
_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;
_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;
_[IN_TABLE_MODE] = Object.create(null);
_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;
_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;
_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TABLE_TEXT_MODE] = Object.create(null);
_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;
_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;
_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] =
_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;
_[IN_CAPTION_MODE] = Object.create(null);
_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;
_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;
_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_COLUMN_GROUP_MODE] = Object.create(null);
_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;
_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TABLE_BODY_MODE] = Object.create(null);
_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;
_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;
_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_ROW_MODE] = Object.create(null);
_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;
_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;
_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_CELL_MODE] = Object.create(null);
_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;
_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;
_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_SELECT_MODE] = Object.create(null);
_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;
_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;
_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_SELECT_IN_TABLE_MODE] = Object.create(null);
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;
_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
_[IN_TEMPLATE_MODE] = Object.create(null);
_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;
_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;
_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;
_[AFTER_BODY_MODE] = Object.create(null);
_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;
_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;
_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;
_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;
_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[IN_FRAMESET_MODE] = Object.create(null);
_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;
_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;
_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_FRAMESET_MODE] = Object.create(null);
_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;
_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;
_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_AFTER_BODY_MODE] = Object.create(null);
_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;
_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
_[AFTER_AFTER_FRAMESET_MODE] = Object.create(null);
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;
_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
//Parser
var Parser = module.exports = function (options) {
this.options = mergeOptions(DEFAULT_OPTIONS, options);
this.treeAdapter = this.options.treeAdapter;
this.pendingScript = null;
if (this.options.locationInfo)
locationInfoMixin.assign(this);
};
// API
Parser.prototype.parse = function (html) {
var document = this.treeAdapter.createDocument();
this._bootstrap(document, null);
this.tokenizer.write(html, true);
this._runParsingLoop(null);
return document;
};
Parser.prototype.parseFragment = function (html, fragmentContext) {
//NOTE: use <template> element as a fragment context if context element was not provided,
//so we will parse in "forgiving" manner
if (!fragmentContext)
fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []);
//NOTE: create fake element which will be used as 'document' for fragment parsing.
//This is important for jsdom there 'document' can't be recreated, therefore
//fragment parsing causes messing of the main `document`.
var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
this._bootstrap(documentMock, fragmentContext);
if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE)
this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
this._initTokenizerForFragmentParsing();
this._insertFakeRootElement();
this._resetInsertionMode();
this._findFormInFragmentContext();
this.tokenizer.write(html, true);
this._runParsingLoop(null);
var rootElement = this.treeAdapter.getFirstChild(documentMock),
fragment = this.treeAdapter.createDocumentFragment();
this._adoptNodes(rootElement, fragment);
return fragment;
};
//Bootstrap parser
Parser.prototype._bootstrap = function (document, fragmentContext) {
this.tokenizer = new Tokenizer(this.options);
this.stopped = false;
this.insertionMode = INITIAL_MODE;
this.originalInsertionMode = '';
this.document = document;
this.fragmentContext = fragmentContext;
this.headElement = null;
this.formElement = null;
this.openElements = new OpenElementStack(this.document, this.treeAdapter);
this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
this.tmplInsertionModeStack = [];
this.tmplInsertionModeStackTop = -1;
this.currentTmplInsertionMode = null;
this.pendingCharacterTokens = [];
this.hasNonWhitespacePendingCharacterToken = false;
this.framesetOk = true;
this.skipNextNewLine = false;
this.fosterParentingEnabled = false;
};
//Parsing loop
Parser.prototype._runParsingLoop = function (scriptHandler) {
while (!this.stopped) {
this._setupTokenizerCDATAMode();
var token = this.tokenizer.getNextToken();
if (token.type === Tokenizer.HIBERNATION_TOKEN)
break;
if (this.skipNextNewLine) {
this.skipNextNewLine = false;
if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
if (token.chars.length === 1)
continue;
token.chars = token.chars.substr(1);
}
}
this._processInputToken(token);
if (scriptHandler && this.pendingScript)
break;
}
};
Parser.prototype.runParsingLoopForCurrentChunk = function (writeCallback, scriptHandler) {
this._runParsingLoop(scriptHandler);
if (scriptHandler && this.pendingScript) {
var script = this.pendingScript;
this.pendingScript = null;
scriptHandler(script);
return;
}
if (writeCallback)
writeCallback();
};
//Text parsing
Parser.prototype._setupTokenizerCDATAMode = function () {
var current = this._getAdjustedCurrentElement();
this.tokenizer.allowCDATA = current && current !== this.document &&
this.treeAdapter.getNamespaceURI(current) !== NS.HTML && !this._isIntegrationPoint(current);
};
Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {
this._insertElement(currentToken, NS.HTML);
this.tokenizer.state = nextTokenizerState;
this.originalInsertionMode = this.insertionMode;
this.insertionMode = TEXT_MODE;
};
Parser.prototype.switchToPlaintextParsing = function () {
this.insertionMode = TEXT_MODE;
this.originalInsertionMode = IN_BODY_MODE;
this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
};
//Fragment parsing
Parser.prototype._getAdjustedCurrentElement = function () {
return this.openElements.stackTop === 0 && this.fragmentContext ?
this.fragmentContext :
this.openElements.current;
};
Parser.prototype._findFormInFragmentContext = function () {
var node = this.fragmentContext;
do {
if (this.treeAdapter.getTagName(node) === $.FORM) {
this.formElement = node;
break;
}
node = this.treeAdapter.getParentNode(node);
} while (node);
};
Parser.prototype._initTokenizerForFragmentParsing = function () {
if (this.treeAdapter.getNamespaceURI(this.fragmentContext) === NS.HTML) {
var tn = this.treeAdapter.getTagName(this.fragmentContext);
if (tn === $.TITLE || tn === $.TEXTAREA)
this.tokenizer.state = Tokenizer.MODE.RCDATA;
else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME ||
tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT)
this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
else if (tn === $.SCRIPT)
this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
else if (tn === $.PLAINTEXT)
this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
}
};
//Tree mutation
Parser.prototype._setDocumentType = function (token) {
this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);
};
Parser.prototype._attachElementToTree = function (element) {
if (this._shouldFosterParentOnInsertion())
this._fosterParentElement(element);
else {
var parent = this.openElements.currentTmplContent || this.openElements.current;
this.treeAdapter.appendChild(parent, element);
}
};
Parser.prototype._appendElement = function (token, namespaceURI) {
var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
this._attachElementToTree(element);
};
Parser.prototype._insertElement = function (token, namespaceURI) {
var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
this._attachElementToTree(element);
this.openElements.push(element);
};
Parser.prototype._insertFakeElement = function (tagName) {
var element = this.treeAdapter.createElement(tagName, NS.HTML, []);
this._attachElementToTree(element);
this.openElements.push(element);
};
Parser.prototype._insertTemplate = function (token) {
var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),
content = this.treeAdapter.createDocumentFragment();
this.treeAdapter.setTemplateContent(tmpl, content);
this._attachElementToTree(tmpl);
this.openElements.push(tmpl);
};
Parser.prototype._insertFakeRootElement = function () {
var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
this.treeAdapter.appendChild(this.openElements.current, element);
this.openElements.push(element);
};
Parser.prototype._appendCommentNode = function (token, parent) {
var commentNode = this.treeAdapter.createCommentNode(token.data);
this.treeAdapter.appendChild(parent, commentNode);
};
Parser.prototype._insertCharacters = function (token) {
if (this._shouldFosterParentOnInsertion())
this._fosterParentText(token.chars);
else {
var parent = this.openElements.currentTmplContent || this.openElements.current;
this.treeAdapter.insertText(parent, token.chars);
}
};
Parser.prototype._adoptNodes = function (donor, recipient) {
while (true) {
var child = this.treeAdapter.getFirstChild(donor);
if (!child)
break;
this.treeAdapter.detachNode(child);
this.treeAdapter.appendChild(recipient, child);
}
};
//Token processing
Parser.prototype._shouldProcessTokenInForeignContent = function (token) {
var current = this._getAdjustedCurrentElement();
if (!current || current === this.document)
return false;
var ns = this.treeAdapter.getNamespaceURI(current);
if (ns === NS.HTML)
return false;
if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML &&
token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG)
return false;
var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN ||
token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,
isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN &&
token.tagName !== $.MGLYPH &&
token.tagName !== $.MALIGNMARK;
if ((isMathMLTextStartTag || isCharacterToken) && this._isIntegrationPoint(current, NS.MATHML))
return false;
if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isIntegrationPoint(current, NS.HTML))
return false;
return token.type !== Tokenizer.EOF_TOKEN;
};
Parser.prototype._processToken = function (token) {
_[this.insertionMode][token.type](this, token);
};
Parser.prototype._processTokenInBodyMode = function (token) {
_[IN_BODY_MODE][token.type](this, token);
};
Parser.prototype._processTokenInForeignContent = function (token) {
if (token.type === Tokenizer.CHARACTER_TOKEN)
characterInForeignContent(this, token);
else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN)
nullCharacterInForeignContent(this, token);
else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN)
insertCharacters(this, token);
else if (token.type === Tokenizer.COMMENT_TOKEN)
appendComment(this, token);
else if (token.type === Tokenizer.START_TAG_TOKEN)
startTagInForeignContent(this, token);
else if (token.type === Tokenizer.END_TAG_TOKEN)
endTagInForeignContent(this, token);
};
Parser.prototype._processInputToken = function (token) {
if (this._shouldProcessTokenInForeignContent(token))
this._processTokenInForeignContent(token);
else
this._processToken(token);
};
//Integration points
Parser.prototype._isIntegrationPoint = function (element, foreignNS) {
var tn = this.treeAdapter.getTagName(element),
ns = this.treeAdapter.getNamespaceURI(element),
attrs = this.treeAdapter.getAttrList(element);
return foreignContent.isIntegrationPoint(tn, ns, attrs, foreignNS);
};
//Active formatting elements reconstruction
Parser.prototype._reconstructActiveFormattingElements = function () {
var listLength = this.activeFormattingElements.length;
if (listLength) {
var unopenIdx = listLength,
entry = null;
do {
unopenIdx--;
entry = this.activeFormattingElements.entries[unopenIdx];
if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {
unopenIdx++;
break;
}
} while (unopenIdx > 0);
for (var i = unopenIdx; i < listLength; i++) {
entry = this.activeFormattingElements.entries[i];
this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
entry.element = this.openElements.current;
}
}
};
//Close elements
Parser.prototype._closeTableCell = function () {
this.openElements.generateImpliedEndTags();
this.openElements.popUntilTableCellPopped();
this.activeFormattingElements.clearToLastMarker();
this.insertionMode = IN_ROW_MODE;
};
Parser.prototype._closePElement = function () {
this.openElements.generateImpliedEndTagsWithExclusion($.P);
this.openElements.popUntilTagNamePopped($.P);
};
//Insertion modes
Parser.prototype._resetInsertionMode = function () {
for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {
var element = this.openElements.items[i];
if (i === 0) {
last = true;
if (this.fragmentContext)
element = this.fragmentContext;
}
var tn = this.treeAdapter.getTagName(element),
newInsertionMode = INSERTION_MODE_RESET_MAP[tn];
if (newInsertionMode) {
this.insertionMode = newInsertionMode;
break;
}
else if (!last && (tn === $.TD || tn === $.TH)) {
this.insertionMode = IN_CELL_MODE;
break;
}
else if (!last && tn === $.HEAD) {
this.insertionMode = IN_HEAD_MODE;
break;
}
else if (tn === $.SELECT) {
this._resetInsertionModeForSelect(i);
break;
}
else if (tn === $.TEMPLATE) {
this.insertionMode = this.currentTmplInsertionMode;
break;
}
else if (tn === $.HTML) {
this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;
break;
}
else if (last) {
this.insertionMode = IN_BODY_MODE;
break;
}
}
};
Parser.prototype._resetInsertionModeForSelect = function (selectIdx) {
if (selectIdx > 0) {
for (var i = selectIdx - 1; i > 0; i--) {
var ancestor = this.openElements.items[i],
tn = this.treeAdapter.getTagName(ancestor);
if (tn === $.TEMPLATE)
break;
else if (tn === $.TABLE) {
this.insertionMode = IN_SELECT_IN_TABLE_MODE;
return;
}
}
}
this.insertionMode = IN_SELECT_MODE;
};
Parser.prototype._pushTmplInsertionMode = function (mode) {
this.tmplInsertionModeStack.push(mode);
this.tmplInsertionModeStackTop++;
this.currentTmplInsertionMode = mode;
};
Parser.prototype._popTmplInsertionMode = function () {
this.tmplInsertionModeStack.pop();
this.tmplInsertionModeStackTop--;
this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
};
//Foster parenting
Parser.prototype._isElementCausesFosterParenting = function (element) {
var tn = this.treeAdapter.getTagName(element);
return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR;
};
Parser.prototype._shouldFosterParentOnInsertion = function () {
return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
};
Parser.prototype._findFosterParentingLocation = function () {
var location = {
parent: null,
beforeElement: null
};
for (var i = this.openElements.stackTop; i >= 0; i--) {
var openElement = this.openElements.items[i],
tn = this.treeAdapter.getTagName(openElement),
ns = this.treeAdapter.getNamespaceURI(openElement);
if (tn === $.TEMPLATE && ns === NS.HTML) {
location.parent = this.treeAdapter.getTemplateContent(openElement);
break;
}
else if (tn === $.TABLE) {
location.parent = this.treeAdapter.getParentNode(openElement);
if (location.parent)
location.beforeElement = openElement;
else
location.parent = this.openElements.items[i - 1];
break;
}
}
if (!location.parent)
location.parent = this.openElements.items[0];
return location;
};
Parser.prototype._fosterParentElement = function (element) {
var location = this._findFosterParentingLocation();
if (location.beforeElement)
this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
else
this.treeAdapter.appendChild(location.parent, element);
};
Parser.prototype._fosterParentText = function (chars) {
var location = this._findFosterParentingLocation();
if (location.beforeElement)
this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
else
this.treeAdapter.insertText(location.parent, chars);
};
//Special elements
Parser.prototype._isSpecialElement = function (element) {
var tn = this.treeAdapter.getTagName(element),
ns = this.treeAdapter.getNamespaceURI(element);
return HTML.SPECIAL_ELEMENTS[ns][tn];
};
//Adoption agency algorithm
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)
//------------------------------------------------------------------
//Steps 5-8 of the algorithm
function aaObtainFormattingElementEntry(p, token) {
var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);
if (formattingElementEntry) {
if (!p.openElements.contains(formattingElementEntry.element)) {
p.activeFormattingElements.removeEntry(formattingElementEntry);
formattingElementEntry = null;
}
else if (!p.openElements.hasInScope(token.tagName))
formattingElementEntry = null;
}
else
genericEndTagInBody(p, token);
return formattingElementEntry;
}
//Steps 9 and 10 of the algorithm
function aaObtainFurthestBlock(p, formattingElementEntry) {
var furthestBlock = null;
for (var i = p.openElements.stackTop; i >= 0; i--) {
var element = p.openElements.items[i];
if (element === formattingElementEntry.element)
break;
if (p._isSpecialElement(element))
furthestBlock = element;
}
if (!furthestBlock) {
p.openElements.popUntilElementPopped(formattingElementEntry.element);
p.activeFormattingElements.removeEntry(formattingElementEntry);
}
return furthestBlock;
}
//Step 13 of the algorithm
function aaInnerLoop(p, furthestBlock, formattingElement) {
var lastElement = furthestBlock,
nextElement = p.openElements.getCommonAncestor(furthestBlock);
for (var i = 0, element = nextElement; element !== formattingElement; i++, element = nextElement) {
//NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
nextElement = p.openElements.getCommonAncestor(element);
var elementEntry = p.activeFormattingElements.getElementEntry(element),
counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER,
shouldRemoveFromOpenElements = !elementEntry || counterOverflow;
if (shouldRemoveFromOpenElements) {
if (counterOverflow)
p.activeFormattingElements.removeEntry(elementEntry);
p.openElements.remove(element);
}
else {
element = aaRecreateElementFromEntry(p, elementEntry);
if (lastElement === furthestBlock)
p.activeFormattingElements.bookmark = elementEntry;
p.treeAdapter.detachNode(lastElement);
p.treeAdapter.appendChild(element, lastElement);
lastElement = element;
}
}
return lastElement;
}
//Step 13.7 of the algorithm
function aaRecreateElementFromEntry(p, elementEntry) {
var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),
newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);
p.openElements.replace(elementEntry.element, newElement);
elementEntry.element = newElement;
return newElement;
}
//Step 14 of the algorithm
function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {
if (p._isElementCausesFosterParenting(commonAncestor))
p._fosterParentElement(lastElement);
else {
var tn = p.treeAdapter.getTagName(commonAncestor),
ns = p.treeAdapter.getNamespaceURI(commonAncestor);
if (tn === $.TEMPLATE && ns === NS.HTML)
commonAncestor = p.treeAdapter.getTemplateContent(commonAncestor);
p.treeAdapter.appendChild(commonAncestor, lastElement);
}
}
//Steps 15-19 of the algorithm
function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),
token = formattingElementEntry.token,
newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);
p._adoptNodes(furthestBlock, newElement);
p.treeAdapter.appendChild(furthestBlock, newElement);
p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);
p.activeFormattingElements.removeEntry(formattingElementEntry);
p.openElements.remove(formattingElementEntry.element);
p.openElements.insertAfter(furthestBlock, newElement);
}
//Algorithm entry point
function callAdoptionAgency(p, token) {
var formattingElementEntry;
for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {
formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
if (!formattingElementEntry)
break;
var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
if (!furthestBlock)
break;
p.activeFormattingElements.bookmark = formattingElementEntry;
var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),
commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
p.treeAdapter.detachNode(lastElement);
aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
}
}
//Generic token handlers
//------------------------------------------------------------------
function ignoreToken() {
//NOTE: do nothing =)
}
function appendComment(p, token) {
p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current);
}
function appendCommentToRootHtmlElement(p, token) {
p._appendCommentNode(token, p.openElements.items[0]);
}
function appendCommentToDocument(p, token) {
p._appendCommentNode(token, p.document);
}
function insertCharacters(p, token) {
p._insertCharacters(token);
}
function stopParsing(p) {
p.stopped = true;
}
//12.2.5.4.1 The "initial" insertion mode
//------------------------------------------------------------------
function doctypeInInitialMode(p, token) {
p._setDocumentType(token);
var mode = token.forceQuirks ?
HTML.DOCUMENT_MODE.QUIRKS :
doctype.getDocumentMode(token.name, token.publicId, token.systemId);
p.treeAdapter.setDocumentMode(p.document, mode);
p.insertionMode = BEFORE_HTML_MODE;
}
function tokenInInitialMode(p, token) {
p.treeAdapter.setDocumentMode(p.document, HTML.DOCUMENT_MODE.QUIRKS);
p.insertionMode = BEFORE_HTML_MODE;
p._processToken(token);
}
//12.2.5.4.2 The "before html" insertion mode
//------------------------------------------------------------------
function startTagBeforeHtml(p, token) {
if (token.tagName === $.HTML) {
p._insertElement(token, NS.HTML);
p.insertionMode = BEFORE_HEAD_MODE;
}
else
tokenBeforeHtml(p, token);
}
function endTagBeforeHtml(p, token) {
var tn = token.tagName;
if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR)
tokenBeforeHtml(p, token);
}
function tokenBeforeHtml(p, token) {
p._insertFakeRootElement();
p.insertionMode = BEFORE_HEAD_MODE;
p._processToken(token);
}
//12.2.5.4.3 The "before head" insertion mode
//------------------------------------------------------------------
function startTagBeforeHead(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.HEAD) {
p._insertElement(token, NS.HTML);
p.headElement = p.openElements.current;
p.insertionMode = IN_HEAD_MODE;
}
else
tokenBeforeHead(p, token);
}
function endTagBeforeHead(p, token) {
var tn = token.tagName;
if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR)
tokenBeforeHead(p, token);
}
function tokenBeforeHead(p, token) {
p._insertFakeElement($.HEAD);
p.headElement = p.openElements.current;
p.insertionMode = IN_HEAD_MODE;
p._processToken(token);
}
//12.2.5.4.4 The "in head" insertion mode
//------------------------------------------------------------------
function startTagInHead(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META)
p._appendElement(token, NS.HTML);
else if (tn === $.TITLE)
p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
//NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse
//<noscript> as a rawtext.
else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE)
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
else if (tn === $.SCRIPT)
p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA);
else if (tn === $.TEMPLATE) {
p._insertTemplate(token, NS.HTML);
p.activeFormattingElements.insertMarker();
p.framesetOk = false;
p.insertionMode = IN_TEMPLATE_MODE;
p._pushTmplInsertionMode(IN_TEMPLATE_MODE);
}
else if (tn !== $.HEAD)
tokenInHead(p, token);
}
function endTagInHead(p, token) {
var tn = token.tagName;
if (tn === $.HEAD) {
p.openElements.pop();
p.insertionMode = AFTER_HEAD_MODE;
}
else if (tn === $.BODY || tn === $.BR || tn === $.HTML)
tokenInHead(p, token);
else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped($.TEMPLATE);
p.activeFormattingElements.clearToLastMarker();
p._popTmplInsertionMode();
p._resetInsertionMode();
}
}
function tokenInHead(p, token) {
p.openElements.pop();
p.insertionMode = AFTER_HEAD_MODE;
p._processToken(token);
}
//12.2.5.4.6 The "after head" insertion mode
//------------------------------------------------------------------
function startTagAfterHead(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.BODY) {
p._insertElement(token, NS.HTML);
p.framesetOk = false;
p.insertionMode = IN_BODY_MODE;
}
else if (tn === $.FRAMESET) {
p._insertElement(token, NS.HTML);
p.insertionMode = IN_FRAMESET_MODE;
}
else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
p.openElements.push(p.headElement);
startTagInHead(p, token);
p.openElements.remove(p.headElement);
}
else if (tn !== $.HEAD)
tokenAfterHead(p, token);
}
function endTagAfterHead(p, token) {
var tn = token.tagName;
if (tn === $.BODY || tn === $.HTML || tn === $.BR)
tokenAfterHead(p, token);
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
}
function tokenAfterHead(p, token) {
p._insertFakeElement($.BODY);
p.insertionMode = IN_BODY_MODE;
p._processToken(token);
}
//12.2.5.4.7 The "in body" insertion mode
//------------------------------------------------------------------
function whitespaceCharacterInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertCharacters(token);
}
function characterInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertCharacters(token);
p.framesetOk = false;
}
function htmlStartTagInBody(p, token) {
if (p.openElements.tmplCount === 0)
p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs);
}
function bodyStartTagInBody(p, token) {
var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
if (bodyElement && p.openElements.tmplCount === 0) {
p.framesetOk = false;
p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
}
}
function framesetStartTagInBody(p, token) {
var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
if (p.framesetOk && bodyElement) {
p.treeAdapter.detachNode(bodyElement);
p.openElements.popAllUpToHtmlElement();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_FRAMESET_MODE;
}
}
function addressStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
}
function numberedHeaderStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
var tn = p.openElements.currentTagName;
if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
p.openElements.pop();
p._insertElement(token, NS.HTML);
}
function preStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
//NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
//on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.)
p.skipNextNewLine = true;
p.framesetOk = false;
}
function formStartTagInBody(p, token) {
var inTemplate = p.openElements.tmplCount > 0;
if (!p.formElement || inTemplate) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
if (!inTemplate)
p.formElement = p.openElements.current;
}
}
function listItemStartTagInBody(p, token) {
p.framesetOk = false;
var tn = token.tagName;
for (var i = p.openElements.stackTop; i >= 0; i--) {
var element = p.openElements.items[i],
elementTn = p.treeAdapter.getTagName(element),
closeTn = null;
if (tn === $.LI && elementTn === $.LI)
closeTn = $.LI;
else if ((tn === $.DD || tn === $.DT) && (elementTn === $.DD || elementTn === $.DT))
closeTn = elementTn;
if (closeTn) {
p.openElements.generateImpliedEndTagsWithExclusion(closeTn);
p.openElements.popUntilTagNamePopped(closeTn);
break;
}
if (elementTn !== $.ADDRESS && elementTn !== $.DIV && elementTn !== $.P && p._isSpecialElement(element))
break;
}
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
}
function plaintextStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
}
function buttonStartTagInBody(p, token) {
if (p.openElements.hasInScope($.BUTTON)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped($.BUTTON);
}
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.framesetOk = false;
}
function aStartTagInBody(p, token) {
var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
if (activeElementEntry) {
callAdoptionAgency(p, token);
p.openElements.remove(activeElementEntry.element);
p.activeFormattingElements.removeEntry(activeElementEntry);
}
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function bStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function nobrStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
if (p.openElements.hasInScope($.NOBR)) {
callAdoptionAgency(p, token);
p._reconstructActiveFormattingElements();
}
p._insertElement(token, NS.HTML);
p.activeFormattingElements.pushElement(p.openElements.current, token);
}
function appletStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.activeFormattingElements.insertMarker();
p.framesetOk = false;
}
function tableStartTagInBody(p, token) {
if (p.treeAdapter.getDocumentMode(p.document) !== HTML.DOCUMENT_MODE.QUIRKS && p.openElements.hasInButtonScope($.P))
p._closePElement();
p._insertElement(token, NS.HTML);
p.framesetOk = false;
p.insertionMode = IN_TABLE_MODE;
}
function areaStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._appendElement(token, NS.HTML);
p.framesetOk = false;
}
function inputStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._appendElement(token, NS.HTML);
var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE)
p.framesetOk = false;
}
function paramStartTagInBody(p, token) {
p._appendElement(token, NS.HTML);
}
function hrStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
if (p.openElements.currentTagName === $.MENUITEM)
p.openElements.pop();
p._appendElement(token, NS.HTML);
p.framesetOk = false;
}
function imageStartTagInBody(p, token) {
token.tagName = $.IMG;
areaStartTagInBody(p, token);
}
function textareaStartTagInBody(p, token) {
p._insertElement(token, NS.HTML);
//NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
//on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.)
p.skipNextNewLine = true;
p.tokenizer.state = Tokenizer.MODE.RCDATA;
p.originalInsertionMode = p.insertionMode;
p.framesetOk = false;
p.insertionMode = TEXT_MODE;
}
function xmpStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
p._reconstructActiveFormattingElements();
p.framesetOk = false;
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
function iframeStartTagInBody(p, token) {
p.framesetOk = false;
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
//<noembed> as a rawtext.
function noembedStartTagInBody(p, token) {
p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
}
function selectStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
p.framesetOk = false;
if (p.insertionMode === IN_TABLE_MODE ||
p.insertionMode === IN_CAPTION_MODE ||
p.insertionMode === IN_TABLE_BODY_MODE ||
p.insertionMode === IN_ROW_MODE ||
p.insertionMode === IN_CELL_MODE)
p.insertionMode = IN_SELECT_IN_TABLE_MODE;
else
p.insertionMode = IN_SELECT_MODE;
}
function optgroupStartTagInBody(p, token) {
if (p.openElements.currentTagName === $.OPTION)
p.openElements.pop();
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
}
function rbStartTagInBody(p, token) {
if (p.openElements.hasInScope($.RUBY))
p.openElements.generateImpliedEndTags();
p._insertElement(token, NS.HTML);
}
function rtStartTagInBody(p, token) {
if (p.openElements.hasInScope($.RUBY))
p.openElements.generateImpliedEndTagsWithExclusion($.RTC);
p._insertElement(token, NS.HTML);
}
function menuitemStartTagInBody(p, token) {
if (p.openElements.currentTagName === $.MENUITEM)
p.openElements.pop();
// TODO needs clarification, see https://github.com/whatwg/html/pull/907/files#r73505877
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
}
function menuStartTagInBody(p, token) {
if (p.openElements.hasInButtonScope($.P))
p._closePElement();
if (p.openElements.currentTagName === $.MENUITEM)
p.openElements.pop();
p._insertElement(token, NS.HTML);
}
function mathStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
foreignContent.adjustTokenMathMLAttrs(token);
foreignContent.adjustTokenXMLAttrs(token);
if (token.selfClosing)
p._appendElement(token, NS.MATHML);
else
p._insertElement(token, NS.MATHML);
}
function svgStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
foreignContent.adjustTokenSVGAttrs(token);
foreignContent.adjustTokenXMLAttrs(token);
if (token.selfClosing)
p._appendElement(token, NS.SVG);
else
p._insertElement(token, NS.SVG);
}
function genericStartTagInBody(p, token) {
p._reconstructActiveFormattingElements();
p._insertElement(token, NS.HTML);
}
//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
//It's faster than using dictionary.
function startTagInBody(p, token) {
var tn = token.tagName;
switch (tn.length) {
case 1:
if (tn === $.I || tn === $.S || tn === $.B || tn === $.U)
bStartTagInBody(p, token);
else if (tn === $.P)
addressStartTagInBody(p, token);
else if (tn === $.A)
aStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
case 2:
if (tn === $.DL || tn === $.OL || tn === $.UL)
addressStartTagInBody(p, token);
else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
numberedHeaderStartTagInBody(p, token);
else if (tn === $.LI || tn === $.DD || tn === $.DT)
listItemStartTagInBody(p, token);
else if (tn === $.EM || tn === $.TT)
bStartTagInBody(p, token);
else if (tn === $.BR)
areaStartTagInBody(p, token);
else if (tn === $.HR)
hrStartTagInBody(p, token);
else if (tn === $.RB)
rbStartTagInBody(p, token);
else if (tn === $.RT || tn === $.RP)
rtStartTagInBody(p, token);
else if (tn !== $.TH && tn !== $.TD && tn !== $.TR)
genericStartTagInBody(p, token);
break;
case 3:
if (tn === $.DIV || tn === $.DIR || tn === $.NAV)
addressStartTagInBody(p, token);
else if (tn === $.PRE)
preStartTagInBody(p, token);
else if (tn === $.BIG)
bStartTagInBody(p, token);
else if (tn === $.IMG || tn === $.WBR)
areaStartTagInBody(p, token);
else if (tn === $.XMP)
xmpStartTagInBody(p, token);
else if (tn === $.SVG)
svgStartTagInBody(p, token);
else if (tn === $.RTC)
rbStartTagInBody(p, token);
else if (tn !== $.COL)
genericStartTagInBody(p, token);
break;
case 4:
if (tn === $.HTML)
htmlStartTagInBody(p, token);
else if (tn === $.BASE || tn === $.LINK || tn === $.META)
startTagInHead(p, token);
else if (tn === $.BODY)
bodyStartTagInBody(p, token);
else if (tn === $.MAIN)
addressStartTagInBody(p, token);
else if (tn === $.FORM)
formStartTagInBody(p, token);
else if (tn === $.CODE || tn === $.FONT)
bStartTagInBody(p, token);
else if (tn === $.NOBR)
nobrStartTagInBody(p, token);
else if (tn === $.AREA)
areaStartTagInBody(p, token);
else if (tn === $.MATH)
mathStartTagInBody(p, token);
else if (tn === $.MENU)
menuStartTagInBody(p, token);
else if (tn !== $.HEAD)
genericStartTagInBody(p, token);
break;
case 5:
if (tn === $.STYLE || tn === $.TITLE)
startTagInHead(p, token);
else if (tn === $.ASIDE)
addressStartTagInBody(p, token);
else if (tn === $.SMALL)
bStartTagInBody(p, token);
else if (tn === $.TABLE)
tableStartTagInBody(p, token);
else if (tn === $.EMBED)
areaStartTagInBody(p, token);
else if (tn === $.INPUT)
inputStartTagInBody(p, token);
else if (tn === $.PARAM || tn === $.TRACK)
paramStartTagInBody(p, token);
else if (tn === $.IMAGE)
imageStartTagInBody(p, token);
else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD)
genericStartTagInBody(p, token);
break;
case 6:
if (tn === $.SCRIPT)
startTagInHead(p, token);
else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
addressStartTagInBody(p, token);
else if (tn === $.BUTTON)
buttonStartTagInBody(p, token);
else if (tn === $.STRIKE || tn === $.STRONG)
bStartTagInBody(p, token);
else if (tn === $.APPLET || tn === $.OBJECT)
appletStartTagInBody(p, token);
else if (tn === $.KEYGEN)
areaStartTagInBody(p, token);
else if (tn === $.SOURCE)
paramStartTagInBody(p, token);
else if (tn === $.IFRAME)
iframeStartTagInBody(p, token);
else if (tn === $.SELECT)
selectStartTagInBody(p, token);
else if (tn === $.OPTION)
optgroupStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
case 7:
if (tn === $.BGSOUND)
startTagInHead(p, token);
else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY)
addressStartTagInBody(p, token);
else if (tn === $.LISTING)
preStartTagInBody(p, token);
else if (tn === $.MARQUEE)
appletStartTagInBody(p, token);
else if (tn === $.NOEMBED)
noembedStartTagInBody(p, token);
else if (tn !== $.CAPTION)
genericStartTagInBody(p, token);
break;
case 8:
if (tn === $.BASEFONT)
startTagInHead(p, token);
else if (tn === $.MENUITEM)
menuitemStartTagInBody(p, token);
else if (tn === $.FRAMESET)
framesetStartTagInBody(p, token);
else if (tn === $.FIELDSET)
addressStartTagInBody(p, token);
else if (tn === $.TEXTAREA)
textareaStartTagInBody(p, token);
else if (tn === $.TEMPLATE)
startTagInHead(p, token);
else if (tn === $.NOSCRIPT)
noembedStartTagInBody(p, token);
else if (tn === $.OPTGROUP)
optgroupStartTagInBody(p, token);
else if (tn !== $.COLGROUP)
genericStartTagInBody(p, token);
break;
case 9:
if (tn === $.PLAINTEXT)
plaintextStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
case 10:
if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
addressStartTagInBody(p, token);
else
genericStartTagInBody(p, token);
break;
default:
genericStartTagInBody(p, token);
}
}
function bodyEndTagInBody(p) {
if (p.openElements.hasInScope($.BODY))
p.insertionMode = AFTER_BODY_MODE;
}
function htmlEndTagInBody(p, token) {
if (p.openElements.hasInScope($.BODY)) {
p.insertionMode = AFTER_BODY_MODE;
p._processToken(token);
}
}
function addressEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
}
}
function formEndTagInBody(p) {
var inTemplate = p.openElements.tmplCount > 0,
formElement = p.formElement;
if (!inTemplate)
p.formElement = null;
if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
p.openElements.generateImpliedEndTags();
if (inTemplate)
p.openElements.popUntilTagNamePopped($.FORM);
else
p.openElements.remove(formElement);
}
}
function pEndTagInBody(p) {
if (!p.openElements.hasInButtonScope($.P))
p._insertFakeElement($.P);
p._closePElement();
}
function liEndTagInBody(p) {
if (p.openElements.hasInListItemScope($.LI)) {
p.openElements.generateImpliedEndTagsWithExclusion($.LI);
p.openElements.popUntilTagNamePopped($.LI);
}
}
function ddEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTagsWithExclusion(tn);
p.openElements.popUntilTagNamePopped(tn);
}
}
function numberedHeaderEndTagInBody(p) {
if (p.openElements.hasNumberedHeaderInScope()) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilNumberedHeaderPopped();
}
}
function appletEndTagInBody(p, token) {
var tn = token.tagName;
if (p.openElements.hasInScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
p.activeFormattingElements.clearToLastMarker();
}
}
function brEndTagInBody(p) {
p._reconstructActiveFormattingElements();
p._insertFakeElement($.BR);
p.openElements.pop();
p.framesetOk = false;
}
function genericEndTagInBody(p, token) {
var tn = token.tagName;
for (var i = p.openElements.stackTop; i > 0; i--) {
var element = p.openElements.items[i];
if (p.treeAdapter.getTagName(element) === tn) {
p.openElements.generateImpliedEndTagsWithExclusion(tn);
p.openElements.popUntilElementPopped(element);
break;
}
if (p._isSpecialElement(element))
break;
}
}
//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
//It's faster than using dictionary.
function endTagInBody(p, token) {
var tn = token.tagName;
switch (tn.length) {
case 1:
if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn === $.U)
callAdoptionAgency(p, token);
else if (tn === $.P)
pEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
case 2:
if (tn === $.DL || tn === $.UL || tn === $.OL)
addressEndTagInBody(p, token);
else if (tn === $.LI)
liEndTagInBody(p, token);
else if (tn === $.DD || tn === $.DT)
ddEndTagInBody(p, token);
else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
numberedHeaderEndTagInBody(p, token);
else if (tn === $.BR)
brEndTagInBody(p, token);
else if (tn === $.EM || tn === $.TT)
callAdoptionAgency(p, token);
else
genericEndTagInBody(p, token);
break;
case 3:
if (tn === $.BIG)
callAdoptionAgency(p, token);
else if (tn === $.DIR || tn === $.DIV || tn === $.NAV)
addressEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
case 4:
if (tn === $.BODY)
bodyEndTagInBody(p, token);
else if (tn === $.HTML)
htmlEndTagInBody(p, token);
else if (tn === $.FORM)
formEndTagInBody(p, token);
else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR)
callAdoptionAgency(p, token);
else if (tn === $.MAIN || tn === $.MENU)
addressEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
case 5:
if (tn === $.ASIDE)
addressEndTagInBody(p, token);
else if (tn === $.SMALL)
callAdoptionAgency(p, token);
else
genericEndTagInBody(p, token);
break;
case 6:
if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
addressEndTagInBody(p, token);
else if (tn === $.APPLET || tn === $.OBJECT)
appletEndTagInBody(p, token);
else if (tn === $.STRIKE || tn === $.STRONG)
callAdoptionAgency(p, token);
else
genericEndTagInBody(p, token);
break;
case 7:
if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY)
addressEndTagInBody(p, token);
else if (tn === $.MARQUEE)
appletEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
case 8:
if (tn === $.FIELDSET)
addressEndTagInBody(p, token);
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
else
genericEndTagInBody(p, token);
break;
case 10:
if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
addressEndTagInBody(p, token);
else
genericEndTagInBody(p, token);
break;
default :
genericEndTagInBody(p, token);
}
}
function eofInBody(p, token) {
if (p.tmplInsertionModeStackTop > -1)
eofInTemplate(p, token);
else
p.stopped = true;
}
//12.2.5.4.8 The "text" insertion mode
//------------------------------------------------------------------
function endTagInText(p, token) {
if (token.tagName === $.SCRIPT)
p.pendingScript = p.openElements.current;
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
}
function eofInText(p, token) {
p.openElements.pop();
p.insertionMode = p.originalInsertionMode;
p._processToken(token);
}
//12.2.5.4.9 The "in table" insertion mode
//------------------------------------------------------------------
function characterInTable(p, token) {
var curTn = p.openElements.currentTagName;
if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
p.pendingCharacterTokens = [];
p.hasNonWhitespacePendingCharacterToken = false;
p.originalInsertionMode = p.insertionMode;
p.insertionMode = IN_TABLE_TEXT_MODE;
p._processToken(token);
}
else
tokenInTable(p, token);
}
function captionStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p.activeFormattingElements.insertMarker();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_CAPTION_MODE;
}
function colgroupStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_COLUMN_GROUP_MODE;
}
function colStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertFakeElement($.COLGROUP);
p.insertionMode = IN_COLUMN_GROUP_MODE;
p._processToken(token);
}
function tbodyStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_TABLE_BODY_MODE;
}
function tdStartTagInTable(p, token) {
p.openElements.clearBackToTableContext();
p._insertFakeElement($.TBODY);
p.insertionMode = IN_TABLE_BODY_MODE;
p._processToken(token);
}
function tableStartTagInTable(p, token) {
if (p.openElements.hasInTableScope($.TABLE)) {
p.openElements.popUntilTagNamePopped($.TABLE);
p._resetInsertionMode();
p._processToken(token);
}
}
function inputStartTagInTable(p, token) {
var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE)
p._appendElement(token, NS.HTML);
else
tokenInTable(p, token);
}
function formStartTagInTable(p, token) {
if (!p.formElement && p.openElements.tmplCount === 0) {
p._insertElement(token, NS.HTML);
p.formElement = p.openElements.current;
p.openElements.pop();
}
}
function startTagInTable(p, token) {
var tn = token.tagName;
switch (tn.length) {
case 2:
if (tn === $.TD || tn === $.TH || tn === $.TR)
tdStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 3:
if (tn === $.COL)
colStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 4:
if (tn === $.FORM)
formStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 5:
if (tn === $.TABLE)
tableStartTagInTable(p, token);
else if (tn === $.STYLE)
startTagInHead(p, token);
else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD)
tbodyStartTagInTable(p, token);
else if (tn === $.INPUT)
inputStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 6:
if (tn === $.SCRIPT)
startTagInHead(p, token);
else
tokenInTable(p, token);
break;
case 7:
if (tn === $.CAPTION)
captionStartTagInTable(p, token);
else
tokenInTable(p, token);
break;
case 8:
if (tn === $.COLGROUP)
colgroupStartTagInTable(p, token);
else if (tn === $.TEMPLATE)
startTagInHead(p, token);
else
tokenInTable(p, token);
break;
default:
tokenInTable(p, token);
}
}
function endTagInTable(p, token) {
var tn = token.tagName;
if (tn === $.TABLE) {
if (p.openElements.hasInTableScope($.TABLE)) {
p.openElements.popUntilTagNamePopped($.TABLE);
p._resetInsertionMode();
}
}
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML &&
tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR)
tokenInTable(p, token);
}
function tokenInTable(p, token) {
var savedFosterParentingState = p.fosterParentingEnabled;
p.fosterParentingEnabled = true;
p._processTokenInBodyMode(token);
p.fosterParentingEnabled = savedFosterParentingState;
}
//12.2.5.4.10 The "in table text" insertion mode
//------------------------------------------------------------------
function whitespaceCharacterInTableText(p, token) {
p.pendingCharacterTokens.push(token);
}
function characterInTableText(p, token) {
p.pendingCharacterTokens.push(token);
p.hasNonWhitespacePendingCharacterToken = true;
}
function tokenInTableText(p, token) {
var i = 0;
if (p.hasNonWhitespacePendingCharacterToken) {
for (; i < p.pendingCharacterTokens.length; i++)
tokenInTable(p, p.pendingCharacterTokens[i]);
}
else {
for (; i < p.pendingCharacterTokens.length; i++)
p._insertCharacters(p.pendingCharacterTokens[i]);
}
p.insertionMode = p.originalInsertionMode;
p._processToken(token);
}
//12.2.5.4.11 The "in caption" insertion mode
//------------------------------------------------------------------
function startTagInCaption(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
if (p.openElements.hasInTableScope($.CAPTION)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped($.CAPTION);
p.activeFormattingElements.clearToLastMarker();
p.insertionMode = IN_TABLE_MODE;
p._processToken(token);
}
}
else
startTagInBody(p, token);
}
function endTagInCaption(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.TABLE) {
if (p.openElements.hasInTableScope($.CAPTION)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped($.CAPTION);
p.activeFormattingElements.clearToLastMarker();
p.insertionMode = IN_TABLE_MODE;
if (tn === $.TABLE)
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY &&
tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR)
endTagInBody(p, token);
}
//12.2.5.4.12 The "in column group" insertion mode
//------------------------------------------------------------------
function startTagInColumnGroup(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.COL)
p._appendElement(token, NS.HTML);
else if (tn === $.TEMPLATE)
startTagInHead(p, token);
else
tokenInColumnGroup(p, token);
}
function endTagInColumnGroup(p, token) {
var tn = token.tagName;
if (tn === $.COLGROUP) {
if (p.openElements.currentTagName === $.COLGROUP) {
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
}
}
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
else if (tn !== $.COL)
tokenInColumnGroup(p, token);
}
function tokenInColumnGroup(p, token) {
if (p.openElements.currentTagName === $.COLGROUP) {
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
p._processToken(token);
}
}
//12.2.5.4.13 The "in table body" insertion mode
//------------------------------------------------------------------
function startTagInTableBody(p, token) {
var tn = token.tagName;
if (tn === $.TR) {
p.openElements.clearBackToTableBodyContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_ROW_MODE;
}
else if (tn === $.TH || tn === $.TD) {
p.openElements.clearBackToTableBodyContext();
p._insertFakeElement($.TR);
p.insertionMode = IN_ROW_MODE;
p._processToken(token);
}
else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP ||
tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
if (p.openElements.hasTableBodyContextInTableScope()) {
p.openElements.clearBackToTableBodyContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
p._processToken(token);
}
}
else
startTagInTable(p, token);
}
function endTagInTableBody(p, token) {
var tn = token.tagName;
if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
if (p.openElements.hasInTableScope(tn)) {
p.openElements.clearBackToTableBodyContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
}
}
else if (tn === $.TABLE) {
if (p.openElements.hasTableBodyContextInTableScope()) {
p.openElements.clearBackToTableBodyContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_MODE;
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR)
endTagInTable(p, token);
}
//12.2.5.4.14 The "in row" insertion mode
//------------------------------------------------------------------
function startTagInRow(p, token) {
var tn = token.tagName;
if (tn === $.TH || tn === $.TD) {
p.openElements.clearBackToTableRowContext();
p._insertElement(token, NS.HTML);
p.insertionMode = IN_CELL_MODE;
p.activeFormattingElements.insertMarker();
}
else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
if (p.openElements.hasInTableScope($.TR)) {
p.openElements.clearBackToTableRowContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_BODY_MODE;
p._processToken(token);
}
}
else
startTagInTable(p, token);
}
function endTagInRow(p, token) {
var tn = token.tagName;
if (tn === $.TR) {
if (p.openElements.hasInTableScope($.TR)) {
p.openElements.clearBackToTableRowContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_BODY_MODE;
}
}
else if (tn === $.TABLE) {
if (p.openElements.hasInTableScope($.TR)) {
p.openElements.clearBackToTableRowContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_BODY_MODE;
p._processToken(token);
}
}
else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
if (p.openElements.hasInTableScope(tn) || p.openElements.hasInTableScope($.TR)) {
p.openElements.clearBackToTableRowContext();
p.openElements.pop();
p.insertionMode = IN_TABLE_BODY_MODE;
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
tn !== $.HTML && tn !== $.TD && tn !== $.TH)
endTagInTable(p, token);
}
//12.2.5.4.15 The "in cell" insertion mode
//------------------------------------------------------------------
function startTagInCell(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) {
p._closeTableCell();
p._processToken(token);
}
}
else
startTagInBody(p, token);
}
function endTagInCell(p, token) {
var tn = token.tagName;
if (tn === $.TD || tn === $.TH) {
if (p.openElements.hasInTableScope(tn)) {
p.openElements.generateImpliedEndTags();
p.openElements.popUntilTagNamePopped(tn);
p.activeFormattingElements.clearToLastMarker();
p.insertionMode = IN_ROW_MODE;
}
}
else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
if (p.openElements.hasInTableScope(tn)) {
p._closeTableCell();
p._processToken(token);
}
}
else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML)
endTagInBody(p, token);
}
//12.2.5.4.16 The "in select" insertion mode
//------------------------------------------------------------------
function startTagInSelect(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.OPTION) {
if (p.openElements.currentTagName === $.OPTION)
p.openElements.pop();
p._insertElement(token, NS.HTML);
}
else if (tn === $.OPTGROUP) {
if (p.openElements.currentTagName === $.OPTION)
p.openElements.pop();
if (p.openElements.currentTagName === $.OPTGROUP)
p.openElements.pop();
p._insertElement(token, NS.HTML);
}
else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA || tn === $.SELECT) {
if (p.openElements.hasInSelectScope($.SELECT)) {
p.openElements.popUntilTagNamePopped($.SELECT);
p._resetInsertionMode();
if (tn !== $.SELECT)
p._processToken(token);
}
}
else if (tn === $.SCRIPT || tn === $.TEMPLATE)
startTagInHead(p, token);
}
function endTagInSelect(p, token) {
var tn = token.tagName;
if (tn === $.OPTGROUP) {
var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1],
prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP)
p.openElements.pop();
if (p.openElements.currentTagName === $.OPTGROUP)
p.openElements.pop();
}
else if (tn === $.OPTION) {
if (p.openElements.currentTagName === $.OPTION)
p.openElements.pop();
}
else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
p.openElements.popUntilTagNamePopped($.SELECT);
p._resetInsertionMode();
}
else if (tn === $.TEMPLATE)
endTagInHead(p, token);
}
//12.2.5.4.17 The "in select in table" insertion mode
//------------------------------------------------------------------
function startTagInSelectInTable(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
p.openElements.popUntilTagNamePopped($.SELECT);
p._resetInsertionMode();
p._processToken(token);
}
else
startTagInSelect(p, token);
}
function endTagInSelectInTable(p, token) {
var tn = token.tagName;
if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
if (p.openElements.hasInTableScope(tn)) {
p.openElements.popUntilTagNamePopped($.SELECT);
p._resetInsertionMode();
p._processToken(token);
}
}
else
endTagInSelect(p, token);
}
//12.2.5.4.18 The "in template" insertion mode
//------------------------------------------------------------------
function startTagInTemplate(p, token) {
var tn = token.tagName;
if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE)
startTagInHead(p, token);
else {
var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
p._popTmplInsertionMode();
p._pushTmplInsertionMode(newInsertionMode);
p.insertionMode = newInsertionMode;
p._processToken(token);
}
}
function endTagInTemplate(p, token) {
if (token.tagName === $.TEMPLATE)
endTagInHead(p, token);
}
function eofInTemplate(p, token) {
if (p.openElements.tmplCount > 0) {
p.openElements.popUntilTagNamePopped($.TEMPLATE);
p.activeFormattingElements.clearToLastMarker();
p._popTmplInsertionMode();
p._resetInsertionMode();
p._processToken(token);
}
else
p.stopped = true;
}
//12.2.5.4.19 The "after body" insertion mode
//------------------------------------------------------------------
function startTagAfterBody(p, token) {
if (token.tagName === $.HTML)
startTagInBody(p, token);
else
tokenAfterBody(p, token);
}
function endTagAfterBody(p, token) {
if (token.tagName === $.HTML) {
if (!p.fragmentContext)
p.insertionMode = AFTER_AFTER_BODY_MODE;
}
else
tokenAfterBody(p, token);
}
function tokenAfterBody(p, token) {
p.insertionMode = IN_BODY_MODE;
p._processToken(token);
}
//12.2.5.4.20 The "in frameset" insertion mode
//------------------------------------------------------------------
function startTagInFrameset(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.FRAMESET)
p._insertElement(token, NS.HTML);
else if (tn === $.FRAME)
p._appendElement(token, NS.HTML);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
function endTagInFrameset(p, token) {
if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
p.openElements.pop();
if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET)
p.insertionMode = AFTER_FRAMESET_MODE;
}
}
//12.2.5.4.21 The "after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterFrameset(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
function endTagAfterFrameset(p, token) {
if (token.tagName === $.HTML)
p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
}
//12.2.5.4.22 The "after after body" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterBody(p, token) {
if (token.tagName === $.HTML)
startTagInBody(p, token);
else
tokenAfterAfterBody(p, token);
}
function tokenAfterAfterBody(p, token) {
p.insertionMode = IN_BODY_MODE;
p._processToken(token);
}
//12.2.5.4.23 The "after after frameset" insertion mode
//------------------------------------------------------------------
function startTagAfterAfterFrameset(p, token) {
var tn = token.tagName;
if (tn === $.HTML)
startTagInBody(p, token);
else if (tn === $.NOFRAMES)
startTagInHead(p, token);
}
//12.2.5.5 The rules for parsing tokens in foreign content
//------------------------------------------------------------------
function nullCharacterInForeignContent(p, token) {
token.chars = UNICODE.REPLACEMENT_CHARACTER;
p._insertCharacters(token);
}
function characterInForeignContent(p, token) {
p._insertCharacters(token);
p.framesetOk = false;
}
function startTagInForeignContent(p, token) {
if (foreignContent.causesExit(token) && !p.fragmentContext) {
while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML && !p._isIntegrationPoint(p.openElements.current))
p.openElements.pop();
p._processToken(token);
}
else {
var current = p._getAdjustedCurrentElement(),
currentNs = p.treeAdapter.getNamespaceURI(current);
if (currentNs === NS.MATHML)
foreignContent.adjustTokenMathMLAttrs(token);
else if (currentNs === NS.SVG) {
foreignContent.adjustTokenSVGTagName(token);
foreignContent.adjustTokenSVGAttrs(token);
}
foreignContent.adjustTokenXMLAttrs(token);
if (token.selfClosing)
p._appendElement(token, currentNs);
else
p._insertElement(token, currentNs);
}
}
function endTagInForeignContent(p, token) {
for (var i = p.openElements.stackTop; i > 0; i--) {
var element = p.openElements.items[i];
if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
p._processToken(token);
break;
}
if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
p.openElements.popUntilElementPopped(element);
break;
}
}
}
},{"../common/doctype":32,"../common/foreign_content":33,"../common/html":34,"../common/merge_options":35,"../common/unicode":36,"../location_info/parser_mixin":37,"../tokenizer":42,"../tree_adapters/default":45,"./formatting_element_list":39,"./open_element_stack":41}],41:[function(require,module,exports){
'use strict';
var HTML = require('../common/html');
//Aliases
var $ = HTML.TAG_NAMES,
NS = HTML.NAMESPACES;
//Element utils
//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
//It's faster than using dictionary.
function isImpliedEndTagRequired(tn) {
switch (tn.length) {
case 1:
return tn === $.P;
case 2:
return tn === $.RB || tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
case 3:
return tn === $.RTC;
case 6:
return tn === $.OPTION;
case 8:
return tn === $.OPTGROUP || tn === $.MENUITEM;
}
return false;
}
function isScopingElement(tn, ns) {
switch (tn.length) {
case 2:
if (tn === $.TD || tn === $.TH)
return ns === NS.HTML;
else if (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS)
return ns === NS.MATHML;
break;
case 4:
if (tn === $.HTML)
return ns === NS.HTML;
else if (tn === $.DESC)
return ns === NS.SVG;
break;
case 5:
if (tn === $.TABLE)
return ns === NS.HTML;
else if (tn === $.MTEXT)
return ns === NS.MATHML;
else if (tn === $.TITLE)
return ns === NS.SVG;
break;
case 6:
return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML;
case 7:
return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML;
case 8:
return tn === $.TEMPLATE && ns === NS.HTML;
case 13:
return tn === $.FOREIGN_OBJECT && ns === NS.SVG;
case 14:
return tn === $.ANNOTATION_XML && ns === NS.MATHML;
}
return false;
}
//Stack of open elements
var OpenElementStack = module.exports = function (document, treeAdapter) {
this.stackTop = -1;
this.items = [];
this.current = document;
this.currentTagName = null;
this.currentTmplContent = null;
this.tmplCount = 0;
this.treeAdapter = treeAdapter;
};
//Index of element
OpenElementStack.prototype._indexOf = function (element) {
var idx = -1;
for (var i = this.stackTop; i >= 0; i--) {
if (this.items[i] === element) {
idx = i;
break;
}
}
return idx;
};
//Update current element
OpenElementStack.prototype._isInTemplate = function () {
return this.currentTagName === $.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
};
OpenElementStack.prototype._updateCurrentElement = function () {
this.current = this.items[this.stackTop];
this.currentTagName = this.current && this.treeAdapter.getTagName(this.current);
this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : null;
};
//Mutations
OpenElementStack.prototype.push = function (element) {
this.items[++this.stackTop] = element;
this._updateCurrentElement();
if (this._isInTemplate())
this.tmplCount++;
};
OpenElementStack.prototype.pop = function () {
this.stackTop--;
if (this.tmplCount > 0 && this._isInTemplate())
this.tmplCount--;
this._updateCurrentElement();
};
OpenElementStack.prototype.replace = function (oldElement, newElement) {
var idx = this._indexOf(oldElement);
this.items[idx] = newElement;
if (idx === this.stackTop)
this._updateCurrentElement();
};
OpenElementStack.prototype.insertAfter = function (referenceElement, newElement) {
var insertionIdx = this._indexOf(referenceElement) + 1;
this.items.splice(insertionIdx, 0, newElement);
if (insertionIdx === ++this.stackTop)
this._updateCurrentElement();
};
OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) {
while (this.stackTop > -1) {
var tn = this.currentTagName,
ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
if (tn === tagName && ns === NS.HTML)
break;
}
};
OpenElementStack.prototype.popUntilElementPopped = function (element) {
while (this.stackTop > -1) {
var poppedElement = this.current;
this.pop();
if (poppedElement === element)
break;
}
};
OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () {
while (this.stackTop > -1) {
var tn = this.currentTagName,
ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6 && ns === NS.HTML)
break;
}
};
OpenElementStack.prototype.popUntilTableCellPopped = function () {
while (this.stackTop > -1) {
var tn = this.currentTagName,
ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
if (tn === $.TD || tn === $.TH && ns === NS.HTML)
break;
}
};
OpenElementStack.prototype.popAllUpToHtmlElement = function () {
//NOTE: here we assume that root <html> element is always first in the open element stack, so
//we perform this fast stack clean up.
this.stackTop = 0;
this._updateCurrentElement();
};
OpenElementStack.prototype.clearBackToTableContext = function () {
while (this.currentTagName !== $.TABLE &&
this.currentTagName !== $.TEMPLATE &&
this.currentTagName !== $.HTML ||
this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
};
OpenElementStack.prototype.clearBackToTableBodyContext = function () {
while (this.currentTagName !== $.TBODY &&
this.currentTagName !== $.TFOOT &&
this.currentTagName !== $.THEAD &&
this.currentTagName !== $.TEMPLATE &&
this.currentTagName !== $.HTML ||
this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
};
OpenElementStack.prototype.clearBackToTableRowContext = function () {
while (this.currentTagName !== $.TR &&
this.currentTagName !== $.TEMPLATE &&
this.currentTagName !== $.HTML ||
this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
};
OpenElementStack.prototype.remove = function (element) {
for (var i = this.stackTop; i >= 0; i--) {
if (this.items[i] === element) {
this.items.splice(i, 1);
this.stackTop--;
this._updateCurrentElement();
break;
}
}
};
//Search
OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () {
//Properly nested <body> element (should be second element in stack).
var element = this.items[1];
return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null;
};
OpenElementStack.prototype.contains = function (element) {
return this._indexOf(element) > -1;
};
OpenElementStack.prototype.getCommonAncestor = function (element) {
var elementIdx = this._indexOf(element);
return --elementIdx >= 0 ? this.items[elementIdx] : null;
};
OpenElementStack.prototype.isRootHtmlElementCurrent = function () {
return this.stackTop === 0 && this.currentTagName === $.HTML;
};
//Element in scope
OpenElementStack.prototype.hasInScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (tn === tagName && ns === NS.HTML)
return true;
if (isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasNumberedHeaderInScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if ((tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) && ns === NS.HTML)
return true;
if (isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasInListItemScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (tn === tagName && ns === NS.HTML)
return true;
if ((tn === $.UL || tn === $.OL) && ns === NS.HTML || isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasInButtonScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (tn === tagName && ns === NS.HTML)
return true;
if (tn === $.BUTTON && ns === NS.HTML || isScopingElement(tn, ns))
return false;
}
return true;
};
OpenElementStack.prototype.hasInTableScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (ns !== NS.HTML)
continue;
if (tn === tagName)
return true;
if (tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML)
return false;
}
return true;
};
OpenElementStack.prototype.hasTableBodyContextInTableScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (ns !== NS.HTML)
continue;
if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT)
return true;
if (tn === $.TABLE || tn === $.HTML)
return false;
}
return true;
};
OpenElementStack.prototype.hasInSelectScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
var tn = this.treeAdapter.getTagName(this.items[i]),
ns = this.treeAdapter.getNamespaceURI(this.items[i]);
if (ns !== NS.HTML)
continue;
if (tn === tagName)
return true;
if (tn !== $.OPTION && tn !== $.OPTGROUP)
return false;
}
return true;
};
//Implied end tags
OpenElementStack.prototype.generateImpliedEndTags = function () {
while (isImpliedEndTagRequired(this.currentTagName))
this.pop();
};
OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclusionTagName) {
while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName)
this.pop();
};
},{"../common/html":34}],42:[function(require,module,exports){
'use strict';
var Preprocessor = require('./preprocessor'),
locationInfoMixin = require('../location_info/tokenizer_mixin'),
UNICODE = require('../common/unicode'),
neTree = require('./named_entity_data');
//Aliases
var $ = UNICODE.CODE_POINTS,
$$ = UNICODE.CODE_POINT_SEQUENCES;
//Replacement code points for numeric entities
var NUMERIC_ENTITY_REPLACEMENTS = {
0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E,
0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039,
0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019,
0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122,
0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178
};
// Named entity tree flags
var HAS_DATA_FLAG = 1 << 0;
var DATA_DUPLET_FLAG = 1 << 1;
var HAS_BRANCHES_FLAG = 1 << 2;
var MAX_BRANCH_MARKER_VALUE = HAS_DATA_FLAG | DATA_DUPLET_FLAG | HAS_BRANCHES_FLAG;
//States
var DATA_STATE = 'DATA_STATE',
CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE',
RCDATA_STATE = 'RCDATA_STATE',
CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE',
RAWTEXT_STATE = 'RAWTEXT_STATE',
SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE',
PLAINTEXT_STATE = 'PLAINTEXT_STATE',
TAG_OPEN_STATE = 'TAG_OPEN_STATE',
END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE',
TAG_NAME_STATE = 'TAG_NAME_STATE',
RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE',
RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE',
RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE',
RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE',
RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE',
RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE',
SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE',
SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE',
SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE',
SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE',
SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE',
SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE',
SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE',
SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE',
SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE',
SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE',
SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE',
SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE',
BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE',
ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE',
AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE',
BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE',
ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE',
ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE',
ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE',
CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE',
AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE',
SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE',
BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE',
BOGUS_COMMENT_STATE_CONTINUATION = 'BOGUS_COMMENT_STATE_CONTINUATION',
MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE',
COMMENT_START_STATE = 'COMMENT_START_STATE',
COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE',
COMMENT_STATE = 'COMMENT_STATE',
COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE',
COMMENT_END_STATE = 'COMMENT_END_STATE',
COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
DOCTYPE_STATE = 'DOCTYPE_STATE',
DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE',
CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
//Utils
//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
//this functions if they will be situated in another module due to context switch.
//Always perform inlining check before modifying this functions ('node --trace-inlining').
function isWhitespace(cp) {
return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED;
}
function isAsciiDigit(cp) {
return cp >= $.DIGIT_0 && cp <= $.DIGIT_9;
}
function isAsciiUpper(cp) {
return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
}
function isAsciiLower(cp) {
return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
}
function isAsciiLetter(cp) {
return isAsciiLower(cp) || isAsciiUpper(cp);
}
function isAsciiAlphaNumeric(cp) {
return isAsciiLetter(cp) || isAsciiDigit(cp);
}
function isDigit(cp, isHex) {
return isAsciiDigit(cp) || isHex && (cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F ||
cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F);
}
function isReservedCodePoint(cp) {
return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
}
function toAsciiLowerCodePoint(cp) {
return cp + 0x0020;
}
//NOTE: String.fromCharCode() function can handle only characters from BMP subset.
//So, we need to workaround this manually.
//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values)
function toChar(cp) {
if (cp <= 0xFFFF)
return String.fromCharCode(cp);
cp -= 0x10000;
return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF);
}
function toAsciiLowerChar(cp) {
return String.fromCharCode(toAsciiLowerCodePoint(cp));
}
function findNamedEntityTreeBranch(nodeIx, cp) {
var branchCount = neTree[++nodeIx],
lo = ++nodeIx,
hi = lo + branchCount - 1;
while (lo <= hi) {
var mid = lo + hi >>> 1,
midCp = neTree[mid];
if (midCp < cp)
lo = mid + 1;
else if (midCp > cp)
hi = mid - 1;
else
return neTree[mid + branchCount];
}
return -1;
}
//Tokenizer
var Tokenizer = module.exports = function (options) {
this.preprocessor = new Preprocessor();
this.tokenQueue = [];
this.allowCDATA = false;
this.state = DATA_STATE;
this.returnState = '';
this.tempBuff = [];
this.additionalAllowedCp = void 0;
this.lastStartTagName = '';
this.consumedAfterSnapshot = -1;
this.active = false;
this.currentCharacterToken = null;
this.currentToken = null;
this.currentAttr = null;
if (options && options.locationInfo)
locationInfoMixin.assign(this);
};
//Token types
Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN';
Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN';
Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN';
Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN';
Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN';
Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN';
Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
Tokenizer.EOF_TOKEN = 'EOF_TOKEN';
Tokenizer.HIBERNATION_TOKEN = 'HIBERNATION_TOKEN';
//Tokenizer initial states for different modes
Tokenizer.MODE = Tokenizer.prototype.MODE = {
DATA: DATA_STATE,
RCDATA: RCDATA_STATE,
RAWTEXT: RAWTEXT_STATE,
SCRIPT_DATA: SCRIPT_DATA_STATE,
PLAINTEXT: PLAINTEXT_STATE
};
//Static
Tokenizer.getTokenAttr = function (token, attrName) {
for (var i = token.attrs.length - 1; i >= 0; i--) {
if (token.attrs[i].name === attrName)
return token.attrs[i].value;
}
return null;
};
//API
Tokenizer.prototype.getNextToken = function () {
while (!this.tokenQueue.length && this.active) {
this._hibernationSnapshot();
var cp = this._consume();
if (!this._ensureHibernation())
this[this.state](cp);
}
return this.tokenQueue.shift();
};
Tokenizer.prototype.write = function (chunk, isLastChunk) {
this.active = true;
this.preprocessor.write(chunk, isLastChunk);
};
Tokenizer.prototype.insertHtmlAtCurrentPos = function (chunk) {
this.active = true;
this.preprocessor.insertHtmlAtCurrentPos(chunk);
};
//Hibernation
Tokenizer.prototype._hibernationSnapshot = function () {
this.consumedAfterSnapshot = 0;
};
Tokenizer.prototype._ensureHibernation = function () {
if (this.preprocessor.endOfChunkHit) {
for (; this.consumedAfterSnapshot > 0; this.consumedAfterSnapshot--)
this.preprocessor.retreat();
this.active = false;
this.tokenQueue.push({type: Tokenizer.HIBERNATION_TOKEN});
return true;
}
return false;
};
//Consumption
Tokenizer.prototype._consume = function () {
this.consumedAfterSnapshot++;
return this.preprocessor.advance();
};
Tokenizer.prototype._unconsume = function () {
this.consumedAfterSnapshot--;
this.preprocessor.retreat();
};
Tokenizer.prototype._unconsumeSeveral = function (count) {
while (count--)
this._unconsume();
};
Tokenizer.prototype._reconsumeInState = function (state) {
this.state = state;
this._unconsume();
};
Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) {
var consumedCount = 0,
isMatch = true,
patternLength = pattern.length,
patternPos = 0,
cp = startCp,
patternCp = void 0;
for (; patternPos < patternLength; patternPos++) {
if (patternPos > 0) {
cp = this._consume();
consumedCount++;
}
if (cp === $.EOF) {
isMatch = false;
break;
}
patternCp = pattern[patternPos];
if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
isMatch = false;
break;
}
}
if (!isMatch)
this._unconsumeSeveral(consumedCount);
return isMatch;
};
//Lookahead
Tokenizer.prototype._lookahead = function () {
var cp = this._consume();
this._unconsume();
return cp;
};
//Temp buffer
Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
if (this.tempBuff.length !== $$.SCRIPT_STRING.length)
return false;
for (var i = 0; i < this.tempBuff.length; i++) {
if (this.tempBuff[i] !== $$.SCRIPT_STRING[i])
return false;
}
return true;
};
//Token creation
Tokenizer.prototype._createStartTagToken = function () {
this.currentToken = {
type: Tokenizer.START_TAG_TOKEN,
tagName: '',
selfClosing: false,
attrs: []
};
};
Tokenizer.prototype._createEndTagToken = function () {
this.currentToken = {
type: Tokenizer.END_TAG_TOKEN,
tagName: '',
attrs: []
};
};
Tokenizer.prototype._createCommentToken = function () {
this.currentToken = {
type: Tokenizer.COMMENT_TOKEN,
data: ''
};
};
Tokenizer.prototype._createDoctypeToken = function (initialName) {
this.currentToken = {
type: Tokenizer.DOCTYPE_TOKEN,
name: initialName,
forceQuirks: false,
publicId: null,
systemId: null
};
};
Tokenizer.prototype._createCharacterToken = function (type, ch) {
this.currentCharacterToken = {
type: type,
chars: ch
};
};
//Tag attributes
Tokenizer.prototype._createAttr = function (attrNameFirstCh) {
this.currentAttr = {
name: attrNameFirstCh,
value: ''
};
};
Tokenizer.prototype._isDuplicateAttr = function () {
return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null;
};
Tokenizer.prototype._leaveAttrName = function (toState) {
this.state = toState;
if (!this._isDuplicateAttr())
this.currentToken.attrs.push(this.currentAttr);
};
Tokenizer.prototype._leaveAttrValue = function (toState) {
this.state = toState;
};
//Appropriate end tag token
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token)
Tokenizer.prototype._isAppropriateEndTagToken = function () {
return this.lastStartTagName === this.currentToken.tagName;
};
//Token emission
Tokenizer.prototype._emitCurrentToken = function () {
this._emitCurrentCharacterToken();
//NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
if (this.currentToken.type === Tokenizer.START_TAG_TOKEN)
this.lastStartTagName = this.currentToken.tagName;
this.tokenQueue.push(this.currentToken);
this.currentToken = null;
};
Tokenizer.prototype._emitCurrentCharacterToken = function () {
if (this.currentCharacterToken) {
this.tokenQueue.push(this.currentCharacterToken);
this.currentCharacterToken = null;
}
};
Tokenizer.prototype._emitEOFToken = function () {
this._emitCurrentCharacterToken();
this.tokenQueue.push({type: Tokenizer.EOF_TOKEN});
};
//Characters emission
//OPTIMIZATION: specification uses only one type of character tokens (one token per character).
//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.
//If we have a sequence of characters that belong to the same group, parser can process it
//as a single solid character token.
//So, there are 3 types of character tokens in parse5:
//1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
//2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f')
//3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) {
if (this.currentCharacterToken && this.currentCharacterToken.type !== type)
this._emitCurrentCharacterToken();
if (this.currentCharacterToken)
this.currentCharacterToken.chars += ch;
else
this._createCharacterToken(type, ch);
};
Tokenizer.prototype._emitCodePoint = function (cp) {
var type = Tokenizer.CHARACTER_TOKEN;
if (isWhitespace(cp))
type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
else if (cp === $.NULL)
type = Tokenizer.NULL_CHARACTER_TOKEN;
this._appendCharToCurrentCharacterToken(type, toChar(cp));
};
Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) {
for (var i = 0; i < codePoints.length; i++)
this._emitCodePoint(codePoints[i]);
};
//NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.
//So we can avoid additional checks here.
Tokenizer.prototype._emitChar = function (ch) {
this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
};
//Character reference tokenization
Tokenizer.prototype._consumeNumericEntity = function (isHex) {
var digits = '',
nextCp = void 0;
do {
digits += toChar(this._consume());
nextCp = this._lookahead();
} while (nextCp !== $.EOF && isDigit(nextCp, isHex));
if (this._lookahead() === $.SEMICOLON)
this._consume();
var referencedCp = parseInt(digits, isHex ? 16 : 10),
replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp];
if (replacement)
return replacement;
if (isReservedCodePoint(referencedCp))
return $.REPLACEMENT_CHARACTER;
return referencedCp;
};
// NOTE: for the details on this algorithm see
// https://github.com/inikulin/parse5/tree/master/scripts/generate_named_entity_data/README.md
Tokenizer.prototype._consumeNamedEntity = function (inAttr) {
var referencedCodePoints = null,
referenceSize = 0,
cp = null,
consumedCount = 0,
semicolonTerminated = false;
for (var i = 0; i > -1;) {
var current = neTree[i],
inNode = current < MAX_BRANCH_MARKER_VALUE,
nodeWithData = inNode && current & HAS_DATA_FLAG;
if (nodeWithData) {
referencedCodePoints = current & DATA_DUPLET_FLAG ? [neTree[++i], neTree[++i]] : [neTree[++i]];
referenceSize = consumedCount;
if (cp === $.SEMICOLON) {
semicolonTerminated = true;
break;
}
}
cp = this._consume();
consumedCount++;
if (cp === $.EOF)
break;
if (inNode)
i = current & HAS_BRANCHES_FLAG ? findNamedEntityTreeBranch(i, cp) : -1;
else
i = cp === current ? ++i : -1;
}
if (referencedCodePoints) {
if (!semicolonTerminated) {
//NOTE: unconsume excess (e.g. 'it' in '&notit')
this._unconsumeSeveral(consumedCount - referenceSize);
//NOTE: If the character reference is being consumed as part of an attribute and the next character
//is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical
//reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be
//unconsumed, and nothing is returned.
//However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a
//parse error, because some legacy user agents will misinterpret the markup in those cases.
//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references)
if (inAttr) {
var nextCp = this._lookahead();
if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) {
this._unconsumeSeveral(referenceSize);
return null;
}
}
}
return referencedCodePoints;
}
this._unconsumeSeveral(consumedCount);
return null;
};
Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) {
if (isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN ||
startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) {
//NOTE: not a character reference. No characters are consumed, and nothing is returned.
this._unconsume();
return null;
}
if (startCp === $.NUMBER_SIGN) {
//NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal
var isHex = false,
nextCp = this._lookahead();
if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) {
this._consume();
isHex = true;
}
nextCp = this._lookahead();
//NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it
if (nextCp !== $.EOF && isDigit(nextCp, isHex))
return [this._consumeNumericEntity(isHex)];
//NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign
//and the 'x'-character if appropriate.
this._unconsumeSeveral(isHex ? 2 : 1);
return null;
}
this._unconsume();
return this._consumeNamedEntity(inAttr);
};
//State machine
var _ = Tokenizer.prototype;
//12.2.4.1 Data state
//------------------------------------------------------------------
_[DATA_STATE] = function dataState(cp) {
this.preprocessor.dropParsedChunk();
if (cp === $.AMPERSAND)
this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
else if (cp === $.LESS_THAN_SIGN)
this.state = TAG_OPEN_STATE;
else if (cp === $.NULL)
this._emitCodePoint(cp);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.2 Character reference in data state
//------------------------------------------------------------------
_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) {
this.additionalAllowedCp = void 0;
var referencedCodePoints = this._consumeCharacterReference(cp, false);
if (!this._ensureHibernation()) {
if (referencedCodePoints)
this._emitSeveralCodePoints(referencedCodePoints);
else
this._emitChar('&');
this.state = DATA_STATE;
}
};
//12.2.4.3 RCDATA state
//------------------------------------------------------------------
_[RCDATA_STATE] = function rcdataState(cp) {
this.preprocessor.dropParsedChunk();
if (cp === $.AMPERSAND)
this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
else if (cp === $.LESS_THAN_SIGN)
this.state = RCDATA_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.4 Character reference in RCDATA state
//------------------------------------------------------------------
_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) {
this.additionalAllowedCp = void 0;
var referencedCodePoints = this._consumeCharacterReference(cp, false);
if (!this._ensureHibernation()) {
if (referencedCodePoints)
this._emitSeveralCodePoints(referencedCodePoints);
else
this._emitChar('&');
this.state = RCDATA_STATE;
}
};
//12.2.4.5 RAWTEXT state
//------------------------------------------------------------------
_[RAWTEXT_STATE] = function rawtextState(cp) {
this.preprocessor.dropParsedChunk();
if (cp === $.LESS_THAN_SIGN)
this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.6 Script data state
//------------------------------------------------------------------
_[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
this.preprocessor.dropParsedChunk();
if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.7 PLAINTEXT state
//------------------------------------------------------------------
_[PLAINTEXT_STATE] = function plaintextState(cp) {
this.preprocessor.dropParsedChunk();
if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._emitEOFToken();
else
this._emitCodePoint(cp);
};
//12.2.4.8 Tag open state
//------------------------------------------------------------------
_[TAG_OPEN_STATE] = function tagOpenState(cp) {
if (cp === $.EXCLAMATION_MARK)
this.state = MARKUP_DECLARATION_OPEN_STATE;
else if (cp === $.SOLIDUS)
this.state = END_TAG_OPEN_STATE;
else if (isAsciiLetter(cp)) {
this._createStartTagToken();
this._reconsumeInState(TAG_NAME_STATE);
}
else if (cp === $.QUESTION_MARK)
this._reconsumeInState(BOGUS_COMMENT_STATE);
else {
this._emitChar('<');
this._reconsumeInState(DATA_STATE);
}
};
//12.2.4.9 End tag open state
//------------------------------------------------------------------
_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
this._reconsumeInState(TAG_NAME_STATE);
}
else if (cp === $.GREATER_THAN_SIGN)
this.state = DATA_STATE;
else if (cp === $.EOF) {
this._reconsumeInState(DATA_STATE);
this._emitChar('<');
this._emitChar('/');
}
else
this._reconsumeInState(BOGUS_COMMENT_STATE);
};
//12.2.4.10 Tag name state
//------------------------------------------------------------------
_[TAG_NAME_STATE] = function tagNameState(cp) {
if (isWhitespace(cp))
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
else if (cp === $.SOLIDUS)
this.state = SELF_CLOSING_START_TAG_STATE;
else if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
}
else if (isAsciiUpper(cp))
this.currentToken.tagName += toAsciiLowerChar(cp);
else if (cp === $.NULL)
this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER;
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this.currentToken.tagName += toChar(cp);
};
//12.2.4.11 RCDATA less-than sign state
//------------------------------------------------------------------
_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = RCDATA_END_TAG_OPEN_STATE;
}
else {
this._emitChar('<');
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.12 RCDATA end tag open state
//------------------------------------------------------------------
_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
this._reconsumeInState(RCDATA_END_TAG_NAME_STATE);
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.13 RCDATA end tag name state
//------------------------------------------------------------------
_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) {
if (isAsciiUpper(cp)) {
this.currentToken.tagName += toAsciiLowerChar(cp);
this.tempBuff.push(cp);
}
else if (isAsciiLower(cp)) {
this.currentToken.tagName += toChar(cp);
this.tempBuff.push(cp);
}
else {
if (this._isAppropriateEndTagToken()) {
if (isWhitespace(cp)) {
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
return;
}
if (cp === $.SOLIDUS) {
this.state = SELF_CLOSING_START_TAG_STATE;
return;
}
if (cp === $.GREATER_THAN_SIGN) {
this.state = DATA_STATE;
this._emitCurrentToken();
return;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(RCDATA_STATE);
}
};
//12.2.4.14 RAWTEXT less-than sign state
//------------------------------------------------------------------
_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = RAWTEXT_END_TAG_OPEN_STATE;
}
else {
this._emitChar('<');
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.15 RAWTEXT end tag open state
//------------------------------------------------------------------
_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE);
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.16 RAWTEXT end tag name state
//------------------------------------------------------------------
_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) {
if (isAsciiUpper(cp)) {
this.currentToken.tagName += toAsciiLowerChar(cp);
this.tempBuff.push(cp);
}
else if (isAsciiLower(cp)) {
this.currentToken.tagName += toChar(cp);
this.tempBuff.push(cp);
}
else {
if (this._isAppropriateEndTagToken()) {
if (isWhitespace(cp)) {
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
return;
}
if (cp === $.SOLIDUS) {
this.state = SELF_CLOSING_START_TAG_STATE;
return;
}
if (cp === $.GREATER_THAN_SIGN) {
this._emitCurrentToken();
this.state = DATA_STATE;
return;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(RAWTEXT_STATE);
}
};
//12.2.4.17 Script data less-than sign state
//------------------------------------------------------------------
_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;
}
else if (cp === $.EXCLAMATION_MARK) {
this.state = SCRIPT_DATA_ESCAPE_START_STATE;
this._emitChar('<');
this._emitChar('!');
}
else {
this._emitChar('<');
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.18 Script data end tag open state
//------------------------------------------------------------------
_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
this._reconsumeInState(SCRIPT_DATA_END_TAG_NAME_STATE);
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.19 Script data end tag name state
//------------------------------------------------------------------
_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) {
if (isAsciiUpper(cp)) {
this.currentToken.tagName += toAsciiLowerChar(cp);
this.tempBuff.push(cp);
}
else if (isAsciiLower(cp)) {
this.currentToken.tagName += toChar(cp);
this.tempBuff.push(cp);
}
else {
if (this._isAppropriateEndTagToken()) {
if (isWhitespace(cp)) {
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
return;
}
else if (cp === $.SOLIDUS) {
this.state = SELF_CLOSING_START_TAG_STATE;
return;
}
else if (cp === $.GREATER_THAN_SIGN) {
this._emitCurrentToken();
this.state = DATA_STATE;
return;
}
}
this._emitChar('<');
this._emitChar('/');
this._emitSeveralCodePoints(this.tempBuff);
this._reconsumeInState(SCRIPT_DATA_STATE);
}
};
//12.2.4.20 Script data escape start state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;
this._emitChar('-');
}
else
this._reconsumeInState(SCRIPT_DATA_STATE);
};
//12.2.4.21 Script data escape start dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
this._emitChar('-');
}
else
this._reconsumeInState(SCRIPT_DATA_STATE);
};
//12.2.4.22 Script data escaped state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL)
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else
this._emitCodePoint(cp);
};
//12.2.4.23 Script data escaped dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) {
if (cp === $.HYPHEN_MINUS) {
this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
this._emitChar('-');
}
else if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.24 Script data escaped dash dash state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) {
if (cp === $.HYPHEN_MINUS)
this._emitChar('-');
else if (cp === $.LESS_THAN_SIGN)
this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
else if (cp === $.GREATER_THAN_SIGN) {
this.state = SCRIPT_DATA_STATE;
this._emitChar('>');
}
else if (cp === $.NULL) {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
}
else if (cp === $.EOF)
this._reconsumeInState(DATA_STATE);
else {
this.state = SCRIPT_DATA_ESCAPED_STATE;
this._emitCodePoint(cp);
}
};
//12.2.4.25 Script data escaped less-than sign state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) {
if (cp === $.SOLIDUS) {
this.tempBuff = [];
this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
}
else if (isAsciiLetter(cp)) {
this.tempBuff = [];
this._emitChar('<');
this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE);
}
else {
this._emitChar('<');
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
}
};
//12.2.4.26 Script data escaped end tag open state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
if (isAsciiLetter(cp)) {
this._createEndTagToken();
this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE);
}
else {
this._emitChar('<');
this._emitChar('/');
this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
}
};
//12.2.4.27 Script data escaped end tag name state
//------------------------------------------------------------------
_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) {
if (isAsciiUpper(cp)) {
this.currentToken.tagName += toAsciiLowerChar(cp);
this.tempBuff.push(cp);
}
else if (isAsciiLower(cp)) {
this.currentToken.tagName += toChar(cp);
this.tempBuff.push(cp);
}
else {
if (this._isAppropriateEndTagToken()) {
if (isWhitespace(cp)) {
this.state = BEFORE_ATTRIBUTE_NAME_STATE;
return;
}
if (cp === $.SOLIDUS) {
this.state = SELF_CLOSING_START_TAG_STATE;
return;
}
if (cp === $.GREATER_THAN_SIGN) {
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment