Skip to content

Instantly share code, notes, and snippets.

@birkir
Created November 16, 2017 18:49
Show Gist options
  • Save birkir/d78ac6067c85c27e56a8fc4d60604f0f to your computer and use it in GitHub Desktop.
Save birkir/d78ac6067c85c27e56a8fc4d60604f0f to your computer and use it in GitHub Desktop.
requirebin sketch
const css2rn = require('css-to-react-native');
const input = document.getElementById('code');
const result = document.getElementById('result');
const strrf = str => str.trim().replace(/^"/, "'").replace(/",?$/, "'");
const btn = document.querySelector('#go');
btn.addEventListener('click', () => {
const rules = input.value.replace(/\/\*(.|\n)*?\*\//, '').split(';').map(item => item.split(':').map(x => String(x).trim())).filter(x => x && x[0] !== '');
const output = JSON.stringify(css2rn.default(rules), null, 2);
const ok = output.replace(/ \"(.*)\":(.*)\n/g, (n, a, b) => { return ` ${a}: ${strrf(b)},\n`; }).replace(/,,/g, ',');
result.value = ok.substr(1, ok.length - 2).trim().replace(/\n\s+/g, '\n');
});
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){
// 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; };
},{}],2:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SYMBOL_MATCH = 'SYMBOL_MATCH';
module.exports = function () {
function TokenStream(nodes, parent) {
_classCallCheck(this, TokenStream);
this.nodes = nodes;
this.parent = parent;
this.lastFunction = null;
this.lastValue = null;
}
_createClass(TokenStream, [{
key: 'hasTokens',
value: function hasTokens() {
return this.nodes.length > 0;
}
}, {
key: 'lookahead',
value: function lookahead() {
return new TokenStream(this.nodes.slice(1), this.parent);
}
}, {
key: SYMBOL_MATCH,
value: function value() {
var node = this.node;
if (!node) return null;
for (var i = 0; i < arguments.length; i += 1) {
var tokenDescriptor = arguments.length <= i ? undefined : arguments[i];
var value = tokenDescriptor(node);
if (value !== null) {
this.nodes = this.nodes.slice(1);
this.lastFunction = null;
this.lastValue = value;
return value;
}
}
return null;
}
}, {
key: 'matches',
value: function matches() {
return this[SYMBOL_MATCH].apply(this, arguments) !== null;
}
}, {
key: 'expect',
value: function expect() {
var value = this[SYMBOL_MATCH].apply(this, arguments);
if (value !== null) return value;
return this.throw();
}
}, {
key: 'matchFunction',
value: function matchFunction() {
var node = this.node;
if (node.type !== 'function') return null;
var value = new TokenStream(node.nodes, node);
this.nodes = this.nodes.slice(1);
this.lastFunction = value;
this.lastValue = null;
return value;
}
}, {
key: 'expectFunction',
value: function expectFunction() {
var value = this.matchFunction();
if (value !== null) return value;
return this.throw();
}
}, {
key: 'expectEmpty',
value: function expectEmpty() {
if (this.hasTokens()) this.throw();
}
}, {
key: 'throw',
value: function _throw() {
throw new Error('Unexpected token type: ' + this.node.type);
}
}, {
key: 'node',
get: function get() {
return this.nodes[0];
}
}]);
return TokenStream;
}();
},{}],3:[function(require,module,exports){
'use strict';
var _require = require('postcss-value-parser'),
stringify = _require.stringify;
var cssColorKeywords = require('css-color-keywords');
var matchString = function matchString(node) {
if (node.type !== 'string') return null;
return node.value.replace(/\\([0-9a-f]{1,6})(?:\s|$)/gi, function (match, charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}).replace(/\\/g, '');
};
var hexColorRe = /^(#(?:[0-9a-f]{3,4}){1,2})$/i;
var cssFunctionNameRe = /^(rgba?|hsla?|hwb|lab|lch|gray|color)$/;
var matchColor = function matchColor(node) {
if (node.type === 'word' && (hexColorRe.test(node.value) || node.value in cssColorKeywords)) {
return node.value;
} else if (node.type === 'function' && cssFunctionNameRe.test(node.value)) {
return stringify(node);
}
return null;
};
var noneRe = /^(none)$/i;
var autoRe = /^(auto)$/i;
var identRe = /(^-?[_a-z][_a-z0-9-]*$)/i;
// Note if these are wrong, you'll need to change index.js too
var numberRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)$/;
// Note lengthRe is sneaky: you can omit units for 0
var lengthRe = /^(0$|(?:[+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)(?=px$))/;
var angleRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?(?:deg|rad))$/;
var percentRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?%)$/;
var noopToken = function noopToken(predicate) {
return function (node) {
return predicate(node) ? '<token>' : null;
};
};
var valueForTypeToken = function valueForTypeToken(type) {
return function (node) {
return node.type === type ? node.value : null;
};
};
var regExpToken = function regExpToken(regExp) {
var transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : String;
return function (node) {
if (node.type !== 'word') return null;
var match = node.value.match(regExp);
if (match === null) return null;
var value = transform(match[1]);
return value;
};
};
module.exports.regExpToken = regExpToken;
module.exports.tokens = {
SPACE: noopToken(function (node) {
return node.type === 'space';
}),
SLASH: noopToken(function (node) {
return node.type === 'div' && node.value === '/';
}),
COMMA: noopToken(function (node) {
return node.type === 'div' && node.value === ',';
}),
WORD: valueForTypeToken('word'),
NONE: regExpToken(noneRe),
AUTO: regExpToken(autoRe),
NUMBER: regExpToken(numberRe, Number),
LENGTH: regExpToken(lengthRe, Number),
ANGLE: regExpToken(angleRe),
PERCENT: regExpToken(percentRe),
IDENT: regExpToken(identRe),
STRING: matchString,
COLOR: matchColor
};
},{"css-color-keywords":11,"postcss-value-parser":14}],4:[function(require,module,exports){
'use strict';
var _require = require('../tokenTypes'),
tokens = _require.tokens;
var NONE = tokens.NONE,
AUTO = tokens.AUTO,
NUMBER = tokens.NUMBER,
LENGTH = tokens.LENGTH,
SPACE = tokens.SPACE;
var defaultFlexGrow = 1;
var defaultFlexShrink = 1;
var defaultFlexBasis = 0;
module.exports = function (tokenStream) {
var flexGrow = void 0;
var flexShrink = void 0;
var flexBasis = void 0;
if (tokenStream.matches(NONE)) {
tokenStream.expectEmpty();
return { $merge: { flexGrow: 0, flexShrink: 0 } };
} else if (tokenStream.matches(AUTO)) {
tokenStream.expectEmpty();
return { $merge: { flexGrow: 1, flexShrink: 1 } };
}
var partsParsed = 0;
while (partsParsed < 2 && tokenStream.hasTokens()) {
if (partsParsed !== 0) tokenStream.expect(SPACE);
if (flexGrow === undefined && tokenStream.matches(NUMBER)) {
flexGrow = tokenStream.lastValue;
if (tokenStream.lookahead().matches(NUMBER)) {
tokenStream.expect(SPACE);
flexShrink = tokenStream.expect(NUMBER);
}
} else if (flexBasis === undefined && tokenStream.matches(LENGTH)) {
flexBasis = tokenStream.lastValue;
} else {
tokenStream.throw();
}
partsParsed += 1;
}
tokenStream.expectEmpty();
if (flexGrow === undefined) flexGrow = defaultFlexGrow;
if (flexShrink === undefined) flexShrink = defaultFlexShrink;
if (flexBasis === undefined) flexBasis = defaultFlexBasis;
return { $merge: { flexGrow: flexGrow, flexShrink: flexShrink, flexBasis: flexBasis } };
};
},{"../tokenTypes":3}],5:[function(require,module,exports){
'use strict';
var parseFontFamily = require('./fontFamily');
var _require = require('../tokenTypes'),
regExpToken = _require.regExpToken,
tokens = _require.tokens;
var SPACE = tokens.SPACE,
LENGTH = tokens.LENGTH,
NUMBER = tokens.NUMBER,
SLASH = tokens.SLASH;
var NORMAL = regExpToken(/^(normal)$/);
var STYLE = regExpToken(/^(italic)$/);
var WEIGHT = regExpToken(/^([1-9]00|bold)$/);
var VARIANT = regExpToken(/^(small-caps)$/);
var defaultFontStyle = 'normal';
var defaultFontWeight = 'normal';
var defaultFontVariant = [];
module.exports = function (tokenStream) {
var fontStyle = void 0;
var fontWeight = void 0;
var fontVariant = void 0;
// let fontSize;
var lineHeight = void 0;
// let fontFamily;
var numStyleWeightVariantMatched = 0;
while (numStyleWeightVariantMatched < 3 && tokenStream.hasTokens()) {
if (tokenStream.matches(NORMAL)) {
/* pass */
} else if (fontStyle === undefined && tokenStream.matches(STYLE)) {
fontStyle = tokenStream.lastValue;
} else if (fontWeight === undefined && tokenStream.matches(WEIGHT)) {
fontWeight = tokenStream.lastValue;
} else if (fontVariant === undefined && tokenStream.matches(VARIANT)) {
fontVariant = [tokenStream.lastValue];
} else {
break;
}
tokenStream.expect(SPACE);
numStyleWeightVariantMatched += 1;
}
var fontSize = tokenStream.expect(LENGTH);
if (tokenStream.matches(SLASH)) {
if (tokenStream.matches(NUMBER)) {
lineHeight = fontSize * tokenStream.lastValue;
} else {
lineHeight = tokenStream.expect(LENGTH);
}
}
tokenStream.expect(SPACE);
var fontFamily = parseFontFamily(tokenStream);
if (fontStyle === undefined) fontStyle = defaultFontStyle;
if (fontWeight === undefined) fontWeight = defaultFontWeight;
if (fontVariant === undefined) fontVariant = defaultFontVariant;
var out = { fontStyle: fontStyle, fontWeight: fontWeight, fontVariant: fontVariant, fontSize: fontSize, fontFamily: fontFamily };
if (lineHeight !== undefined) out.lineHeight = lineHeight;
return { $merge: out };
};
},{"../tokenTypes":3,"./fontFamily":6}],6:[function(require,module,exports){
'use strict';
var _require = require('../tokenTypes'),
tokens = _require.tokens;
var SPACE = tokens.SPACE,
IDENT = tokens.IDENT,
STRING = tokens.STRING;
module.exports = function (tokenStream) {
var fontFamily = void 0;
if (tokenStream.matches(STRING)) {
fontFamily = tokenStream.lastValue;
} else {
fontFamily = tokenStream.expect(IDENT);
while (tokenStream.hasTokens()) {
tokenStream.expect(SPACE);
var nextIdent = tokenStream.expect(IDENT);
fontFamily += ' ' + nextIdent;
}
}
tokenStream.expectEmpty();
return fontFamily;
};
},{"../tokenTypes":3}],7:[function(require,module,exports){
'use strict';
var _require = require('../tokenTypes'),
regExpToken = _require.regExpToken,
tokens = _require.tokens;
var flex = require('./flex');
var font = require('./font');
var fontFamily = require('./fontFamily');
var transform = require('./transform');
var _require2 = require('./util'),
directionFactory = _require2.directionFactory,
anyOrderFactory = _require2.anyOrderFactory,
shadowOffsetFactory = _require2.shadowOffsetFactory;
var IDENT = tokens.IDENT,
WORD = tokens.WORD,
COLOR = tokens.COLOR;
var background = function background(tokenStream) {
return { $merge: { backgroundColor: tokenStream.expect(COLOR) } };
};
var border = anyOrderFactory({
borderWidth: {
token: tokens.LENGTH,
default: 1
},
borderColor: {
token: COLOR,
default: 'black'
},
borderStyle: {
token: regExpToken(/^(solid|dashed|dotted)$/),
default: 'solid'
}
});
var borderColor = directionFactory({
types: [WORD],
prefix: 'border',
suffix: 'Color'
});
var borderRadius = directionFactory({
directions: ['TopRight', 'BottomRight', 'BottomLeft', 'TopLeft'],
prefix: 'border',
suffix: 'Radius'
});
var borderWidth = directionFactory({ prefix: 'border', suffix: 'Width' });
var margin = directionFactory({ prefix: 'margin' });
var padding = directionFactory({ prefix: 'padding' });
var flexFlow = anyOrderFactory({
flexWrap: {
token: regExpToken(/(nowrap|wrap|wrap-reverse)/),
default: 'nowrap'
},
flexDirection: {
token: regExpToken(/(row|row-reverse|column|column-reverse)/),
default: 'row'
}
});
var fontVariant = function fontVariant(tokenStream) {
return [tokenStream.expect(IDENT)];
};
var fontWeight = function fontWeight(tokenStream) {
return tokenStream.expect(WORD);
}; // Also match numbers as strings
var shadowOffset = shadowOffsetFactory();
var textShadowOffset = shadowOffsetFactory();
module.exports = {
background: background,
border: border,
borderColor: borderColor,
borderRadius: borderRadius,
borderWidth: borderWidth,
flex: flex,
flexFlow: flexFlow,
font: font,
fontFamily: fontFamily,
fontVariant: fontVariant,
fontWeight: fontWeight,
margin: margin,
padding: padding,
shadowOffset: shadowOffset,
textShadowOffset: textShadowOffset,
transform: transform
};
},{"../tokenTypes":3,"./flex":4,"./font":5,"./fontFamily":6,"./transform":8,"./util":9}],8:[function(require,module,exports){
'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _require = require('../tokenTypes'),
tokens = _require.tokens;
var SPACE = tokens.SPACE,
COMMA = tokens.COMMA,
LENGTH = tokens.LENGTH,
NUMBER = tokens.NUMBER,
ANGLE = tokens.ANGLE;
var oneOfType = function oneOfType(tokenType) {
return function (functionStream) {
var value = functionStream.expect(tokenType);
functionStream.expectEmpty();
return value;
};
};
var singleNumber = oneOfType(NUMBER);
var singleLength = oneOfType(LENGTH);
var singleAngle = oneOfType(ANGLE);
var xyTransformFactory = function xyTransformFactory(tokenType) {
return function (key, valueIfOmitted) {
return function (functionStream) {
var x = functionStream.expect(tokenType);
var y = void 0;
if (functionStream.hasTokens()) {
functionStream.expect(COMMA);
y = functionStream.expect(tokenType);
} else if (valueIfOmitted !== undefined) {
y = valueIfOmitted;
} else {
// Assumption, if x === y, then we can omit XY
// I.e. scale(5) => [{ scale: 5 }] rather than [{ scaleX: 5 }, { scaleY: 5 }]
return x;
}
functionStream.expectEmpty();
return [_defineProperty({}, key + 'Y', y), _defineProperty({}, key + 'X', x)];
};
};
};
var xyNumber = xyTransformFactory(NUMBER);
var xyLength = xyTransformFactory(LENGTH);
var xyAngle = xyTransformFactory(ANGLE);
var partTransforms = {
perspective: singleNumber,
scale: xyNumber('scale'),
scaleX: singleNumber,
scaleY: singleNumber,
translate: xyLength('translate', 0),
translateX: singleLength,
translateY: singleLength,
rotate: singleAngle,
rotateX: singleAngle,
rotateY: singleAngle,
rotateZ: singleAngle,
skewX: singleAngle,
skewY: singleAngle,
skew: xyAngle('skew', '0deg')
};
module.exports = function (tokenStream) {
var transforms = [];
var didParseFirst = false;
while (tokenStream.hasTokens()) {
if (didParseFirst) tokenStream.expect(SPACE);
var functionStream = tokenStream.expectFunction();
var transformName = functionStream.parent.value;
var transformedValues = partTransforms[transformName](functionStream);
if (!Array.isArray(transformedValues)) {
transformedValues = [_defineProperty({}, transformName, transformedValues)];
}
transforms = transformedValues.concat(transforms);
didParseFirst = true;
}
return transforms;
};
},{"../tokenTypes":3}],9:[function(require,module,exports){
'use strict';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var _require = require('../tokenTypes'),
tokens = _require.tokens;
var LENGTH = tokens.LENGTH,
PERCENT = tokens.PERCENT,
SPACE = tokens.SPACE;
module.exports.directionFactory = function (_ref) {
var _ref$types = _ref.types,
types = _ref$types === undefined ? [LENGTH, PERCENT] : _ref$types,
_ref$directions = _ref.directions,
directions = _ref$directions === undefined ? ['Top', 'Right', 'Bottom', 'Left'] : _ref$directions,
_ref$prefix = _ref.prefix,
prefix = _ref$prefix === undefined ? '' : _ref$prefix,
_ref$suffix = _ref.suffix,
suffix = _ref$suffix === undefined ? '' : _ref$suffix;
return function (tokenStream) {
var _output;
var values = [];
// borderWidth doesn't currently allow a percent value, but may do in the future
values.push(tokenStream.expect.apply(tokenStream, _toConsumableArray(types)));
while (values.length < 4 && tokenStream.hasTokens()) {
tokenStream.expect(SPACE);
values.push(tokenStream.expect.apply(tokenStream, _toConsumableArray(types)));
}
tokenStream.expectEmpty();
var top = values[0],
_values$ = values[1],
right = _values$ === undefined ? top : _values$,
_values$2 = values[2],
bottom = _values$2 === undefined ? top : _values$2,
_values$3 = values[3],
left = _values$3 === undefined ? right : _values$3;
var keyFor = function keyFor(n) {
return '' + prefix + directions[n] + suffix;
};
var output = (_output = {}, _defineProperty(_output, keyFor(0), top), _defineProperty(_output, keyFor(1), right), _defineProperty(_output, keyFor(2), bottom), _defineProperty(_output, keyFor(3), left), _output);
return { $merge: output };
};
};
module.exports.anyOrderFactory = function (properties) {
var delim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SPACE;
return function (tokenStream) {
var propertyNames = Object.keys(properties);
var values = propertyNames.reduce(function (accum, propertyName) {
accum[propertyName] === undefined; // eslint-disable-line
return accum;
}, {});
var numParsed = 0;
while (numParsed < propertyNames.length && tokenStream.hasTokens()) {
if (numParsed) tokenStream.expect(delim);
var matchedPropertyName = propertyNames.find(function (propertyName) {
return values[propertyName] === undefined && tokenStream.matches(properties[propertyName].token);
});
if (!matchedPropertyName) {
tokenStream.throw();
} else {
values[matchedPropertyName] = tokenStream.lastValue;
}
numParsed += 1;
}
tokenStream.expectEmpty();
propertyNames.forEach(function (propertyName) {
if (values[propertyName] === undefined) values[propertyName] = properties[propertyName].default;
});
return { $merge: values };
};
};
module.exports.shadowOffsetFactory = function () {
return function (tokenStream) {
var width = tokenStream.expect(LENGTH);
var height = tokenStream.matches(SPACE) ? tokenStream.expect(LENGTH) : width;
tokenStream.expectEmpty();
return { width: width, height: height };
};
};
},{"../tokenTypes":3}],10:[function(require,module,exports){
module.exports={
"black": "#000000",
"silver": "#c0c0c0",
"gray": "#808080",
"white": "#ffffff",
"maroon": "#800000",
"red": "#ff0000",
"purple": "#800080",
"fuchsia": "#ff00ff",
"green": "#008000",
"lime": "#00ff00",
"olive": "#808000",
"yellow": "#ffff00",
"navy": "#000080",
"blue": "#0000ff",
"teal": "#008080",
"aqua": "#00ffff",
"orange": "#ffa500",
"aliceblue": "#f0f8ff",
"antiquewhite": "#faebd7",
"aquamarine": "#7fffd4",
"azure": "#f0ffff",
"beige": "#f5f5dc",
"bisque": "#ffe4c4",
"blanchedalmond": "#ffebcd",
"blueviolet": "#8a2be2",
"brown": "#a52a2a",
"burlywood": "#deb887",
"cadetblue": "#5f9ea0",
"chartreuse": "#7fff00",
"chocolate": "#d2691e",
"coral": "#ff7f50",
"cornflowerblue": "#6495ed",
"cornsilk": "#fff8dc",
"crimson": "#dc143c",
"darkblue": "#00008b",
"darkcyan": "#008b8b",
"darkgoldenrod": "#b8860b",
"darkgray": "#a9a9a9",
"darkgreen": "#006400",
"darkgrey": "#a9a9a9",
"darkkhaki": "#bdb76b",
"darkmagenta": "#8b008b",
"darkolivegreen": "#556b2f",
"darkorange": "#ff8c00",
"darkorchid": "#9932cc",
"darkred": "#8b0000",
"darksalmon": "#e9967a",
"darkseagreen": "#8fbc8f",
"darkslateblue": "#483d8b",
"darkslategray": "#2f4f4f",
"darkslategrey": "#2f4f4f",
"darkturquoise": "#00ced1",
"darkviolet": "#9400d3",
"deeppink": "#ff1493",
"deepskyblue": "#00bfff",
"dimgray": "#696969",
"dimgrey": "#696969",
"dodgerblue": "#1e90ff",
"firebrick": "#b22222",
"floralwhite": "#fffaf0",
"forestgreen": "#228b22",
"gainsboro": "#dcdcdc",
"ghostwhite": "#f8f8ff",
"gold": "#ffd700",
"goldenrod": "#daa520",
"greenyellow": "#adff2f",
"grey": "#808080",
"honeydew": "#f0fff0",
"hotpink": "#ff69b4",
"indianred": "#cd5c5c",
"indigo": "#4b0082",
"ivory": "#fffff0",
"khaki": "#f0e68c",
"lavender": "#e6e6fa",
"lavenderblush": "#fff0f5",
"lawngreen": "#7cfc00",
"lemonchiffon": "#fffacd",
"lightblue": "#add8e6",
"lightcoral": "#f08080",
"lightcyan": "#e0ffff",
"lightgoldenrodyellow": "#fafad2",
"lightgray": "#d3d3d3",
"lightgreen": "#90ee90",
"lightgrey": "#d3d3d3",
"lightpink": "#ffb6c1",
"lightsalmon": "#ffa07a",
"lightseagreen": "#20b2aa",
"lightskyblue": "#87cefa",
"lightslategray": "#778899",
"lightslategrey": "#778899",
"lightsteelblue": "#b0c4de",
"lightyellow": "#ffffe0",
"limegreen": "#32cd32",
"linen": "#faf0e6",
"mediumaquamarine": "#66cdaa",
"mediumblue": "#0000cd",
"mediumorchid": "#ba55d3",
"mediumpurple": "#9370db",
"mediumseagreen": "#3cb371",
"mediumslateblue": "#7b68ee",
"mediumspringgreen": "#00fa9a",
"mediumturquoise": "#48d1cc",
"mediumvioletred": "#c71585",
"midnightblue": "#191970",
"mintcream": "#f5fffa",
"mistyrose": "#ffe4e1",
"moccasin": "#ffe4b5",
"navajowhite": "#ffdead",
"oldlace": "#fdf5e6",
"olivedrab": "#6b8e23",
"orangered": "#ff4500",
"orchid": "#da70d6",
"palegoldenrod": "#eee8aa",
"palegreen": "#98fb98",
"paleturquoise": "#afeeee",
"palevioletred": "#db7093",
"papayawhip": "#ffefd5",
"peachpuff": "#ffdab9",
"peru": "#cd853f",
"pink": "#ffc0cb",
"plum": "#dda0dd",
"powderblue": "#b0e0e6",
"rosybrown": "#bc8f8f",
"royalblue": "#4169e1",
"saddlebrown": "#8b4513",
"salmon": "#fa8072",
"sandybrown": "#f4a460",
"seagreen": "#2e8b57",
"seashell": "#fff5ee",
"sienna": "#a0522d",
"skyblue": "#87ceeb",
"slateblue": "#6a5acd",
"slategray": "#708090",
"slategrey": "#708090",
"snow": "#fffafa",
"springgreen": "#00ff7f",
"steelblue": "#4682b4",
"tan": "#d2b48c",
"thistle": "#d8bfd8",
"tomato": "#ff6347",
"turquoise": "#40e0d0",
"violet": "#ee82ee",
"wheat": "#f5deb3",
"whitesmoke": "#f5f5f5",
"yellowgreen": "#9acd32",
"rebeccapurple": "#663399"
}
},{}],11:[function(require,module,exports){
'use strict'
module.exports = require('./colors.json')
},{"./colors.json":10}],12:[function(require,module,exports){
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @typechecks
*/
var _hyphenPattern = /-(.)/g;
/**
* Camelcases a hyphenated string, for example:
*
* > camelize('background-color')
* < "backgroundColor"
*
* @param {string} string
* @return {string}
*/
function camelize(string) {
return string.replace(_hyphenPattern, function (_, character) {
return character.toUpperCase();
});
}
module.exports = camelize;
},{}],13:[function(require,module,exports){
/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @typechecks
*/
'use strict';
var camelize = require('./camelize');
var msPattern = /^-ms-/;
/**
* Camelcases a hyphenated CSS property name, for example:
*
* > camelizeStyleName('background-color')
* < "backgroundColor"
* > camelizeStyleName('-moz-transition')
* < "MozTransition"
* > camelizeStyleName('-ms-transition')
* < "msTransition"
*
* As Andi Smith suggests
* (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
* is converted to lowercase `ms`.
*
* @param {string} string
* @return {string}
*/
function camelizeStyleName(string) {
return camelize(string.replace(msPattern, 'ms-'));
}
module.exports = camelizeStyleName;
},{"./camelize":12}],14:[function(require,module,exports){
var parse = require('./parse');
var walk = require('./walk');
var stringify = require('./stringify');
function ValueParser(value) {
if (this instanceof ValueParser) {
this.nodes = parse(value);
return this;
}
return new ValueParser(value);
}
ValueParser.prototype.toString = function () {
return Array.isArray(this.nodes) ? stringify(this.nodes) : '';
};
ValueParser.prototype.walk = function (cb, bubble) {
walk(this.nodes, cb, bubble);
return this;
};
ValueParser.unit = require('./unit');
ValueParser.walk = walk;
ValueParser.stringify = stringify;
module.exports = ValueParser;
},{"./parse":15,"./stringify":16,"./unit":17,"./walk":18}],15:[function(require,module,exports){
var openParentheses = '('.charCodeAt(0);
var closeParentheses = ')'.charCodeAt(0);
var singleQuote = '\''.charCodeAt(0);
var doubleQuote = '"'.charCodeAt(0);
var backslash = '\\'.charCodeAt(0);
var slash = '/'.charCodeAt(0);
var comma = ','.charCodeAt(0);
var colon = ':'.charCodeAt(0);
var star = '*'.charCodeAt(0);
module.exports = function (input) {
var tokens = [];
var value = input;
var next, quote, prev, token, escape, escapePos, whitespacePos;
var pos = 0;
var code = value.charCodeAt(pos);
var max = value.length;
var stack = [{ nodes: tokens }];
var balanced = 0;
var parent;
var name = '';
var before = '';
var after = '';
while (pos < max) {
// Whitespaces
if (code <= 32) {
next = pos;
do {
next += 1;
code = value.charCodeAt(next);
} while (code <= 32);
token = value.slice(pos, next);
prev = tokens[tokens.length - 1];
if (code === closeParentheses && balanced) {
after = token;
} else if (prev && prev.type === 'div') {
prev.after = token;
} else if (code === comma || code === colon || code === slash && value.charCodeAt(next + 1) !== star) {
before = token;
} else {
tokens.push({
type: 'space',
sourceIndex: pos,
value: token
});
}
pos = next;
// Quotes
} else if (code === singleQuote || code === doubleQuote) {
next = pos;
quote = code === singleQuote ? '\'' : '"';
token = {
type: 'string',
sourceIndex: pos,
quote: quote
};
do {
escape = false;
next = value.indexOf(quote, next + 1);
if (~next) {
escapePos = next;
while (value.charCodeAt(escapePos - 1) === backslash) {
escapePos -= 1;
escape = !escape;
}
} else {
value += quote;
next = value.length - 1;
token.unclosed = true;
}
} while (escape);
token.value = value.slice(pos + 1, next);
tokens.push(token);
pos = next + 1;
code = value.charCodeAt(pos);
// Comments
} else if (code === slash && value.charCodeAt(pos + 1) === star) {
token = {
type: 'comment',
sourceIndex: pos
};
next = value.indexOf('*/', pos);
if (next === -1) {
token.unclosed = true;
next = value.length;
}
token.value = value.slice(pos + 2, next);
tokens.push(token);
pos = next + 2;
code = value.charCodeAt(pos);
// Dividers
} else if (code === slash || code === comma || code === colon) {
token = value[pos];
tokens.push({
type: 'div',
sourceIndex: pos - before.length,
value: token,
before: before,
after: ''
});
before = '';
pos += 1;
code = value.charCodeAt(pos);
// Open parentheses
} else if (openParentheses === code) {
// Whitespaces after open parentheses
next = pos;
do {
next += 1;
code = value.charCodeAt(next);
} while (code <= 32);
token = {
type: 'function',
sourceIndex: pos - name.length,
value: name,
before: value.slice(pos + 1, next)
};
pos = next;
if (name === 'url' && code !== singleQuote && code !== doubleQuote) {
next -= 1;
do {
escape = false;
next = value.indexOf(')', next + 1);
if (~next) {
escapePos = next;
while (value.charCodeAt(escapePos - 1) === backslash) {
escapePos -= 1;
escape = !escape;
}
} else {
value += ')';
next = value.length - 1;
token.unclosed = true;
}
} while (escape);
// Whitespaces before closed
whitespacePos = next;
do {
whitespacePos -= 1;
code = value.charCodeAt(whitespacePos);
} while (code <= 32);
if (pos !== whitespacePos + 1) {
token.nodes = [{
type: 'word',
sourceIndex: pos,
value: value.slice(pos, whitespacePos + 1)
}];
} else {
token.nodes = [];
}
if (token.unclosed && whitespacePos + 1 !== next) {
token.after = '';
token.nodes.push({
type: 'space',
sourceIndex: whitespacePos + 1,
value: value.slice(whitespacePos + 1, next)
});
} else {
token.after = value.slice(whitespacePos + 1, next);
}
pos = next + 1;
code = value.charCodeAt(pos);
tokens.push(token);
} else {
balanced += 1;
token.after = '';
tokens.push(token);
stack.push(token);
tokens = token.nodes = [];
parent = token;
}
name = '';
// Close parentheses
} else if (closeParentheses === code && balanced) {
pos += 1;
code = value.charCodeAt(pos);
parent.after = after;
after = '';
balanced -= 1;
stack.pop();
parent = stack[balanced];
tokens = parent.nodes;
// Words
} else {
next = pos;
do {
if (code === backslash) {
next += 1;
}
next += 1;
code = value.charCodeAt(next);
} while (next < max && !(
code <= 32 ||
code === singleQuote ||
code === doubleQuote ||
code === comma ||
code === colon ||
code === slash ||
code === openParentheses ||
code === closeParentheses && balanced
));
token = value.slice(pos, next);
if (openParentheses === code) {
name = token;
} else {
tokens.push({
type: 'word',
sourceIndex: pos,
value: token
});
}
pos = next;
}
}
for (pos = stack.length - 1; pos; pos -= 1) {
stack[pos].unclosed = true;
}
return stack[0].nodes;
};
},{}],16:[function(require,module,exports){
function stringifyNode(node, custom) {
var type = node.type;
var value = node.value;
var buf;
var customResult;
if (custom && (customResult = custom(node)) !== undefined) {
return customResult;
} else if (type === 'word' || type === 'space') {
return value;
} else if (type === 'string') {
buf = node.quote || '';
return buf + value + (node.unclosed ? '' : buf);
} else if (type === 'comment') {
return '/*' + value + (node.unclosed ? '' : '*/');
} else if (type === 'div') {
return (node.before || '') + value + (node.after || '');
} else if (Array.isArray(node.nodes)) {
buf = stringify(node.nodes);
if (type !== 'function') {
return buf;
}
return value + '(' + (node.before || '') + buf + (node.after || '') + (node.unclosed ? '' : ')');
}
return value;
}
function stringify(nodes, custom) {
var result, i;
if (Array.isArray(nodes)) {
result = '';
for (i = nodes.length - 1; ~i; i -= 1) {
result = stringifyNode(nodes[i], custom) + result;
}
return result;
}
return stringifyNode(nodes, custom);
}
module.exports = stringify;
},{}],17:[function(require,module,exports){
var minus = '-'.charCodeAt(0);
var plus = '+'.charCodeAt(0);
var dot = '.'.charCodeAt(0);
module.exports = function (value) {
var pos = 0;
var length = value.length;
var dotted = false;
var containsNumber = false;
var code;
var number = '';
while (pos < length) {
code = value.charCodeAt(pos);
if (code >= 48 && code <= 57) {
number += value[pos];
containsNumber = true;
} else if (code === dot) {
if (dotted) {
break;
}
dotted = true;
number += value[pos];
} else if (code === plus || code === minus) {
if (pos !== 0) {
break;
}
number += value[pos];
} else {
break;
}
pos += 1;
}
return containsNumber ? {
number: number,
unit: value.slice(pos)
} : false;
};
},{}],18:[function(require,module,exports){
module.exports = function walk(nodes, cb, bubble) {
var i, max, node, result;
for (i = 0, max = nodes.length; i < max; i += 1) {
node = nodes[i];
if (!bubble) {
result = cb(node, i, nodes);
}
if (result !== false && node.type === 'function' && Array.isArray(node.nodes)) {
walk(node.nodes, cb, bubble);
}
if (bubble) {
cb(node, i, nodes);
}
}
};
},{}],"css-to-react-native":[function(require,module,exports){
(function (process){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/* eslint-disable no-param-reassign */
var parse = require('postcss-value-parser');
var camelizeStyleName = require('fbjs/lib/camelizeStyleName');
var transforms = require('./transforms');
var TokenStream = require('./TokenStream');
// Note if this is wrong, you'll need to change tokenTypes.js too
var numberOrLengthRe = /^([+-]?(?:\d*\.)?\d+(?:[Ee][+-]?\d+)?)(?:px)?$/i;
var boolRe = /^true|false$/i;
// Undocumented export
var transformRawValue = exports.transformRawValue = function transformRawValue(input) {
var value = input.trim();
var numberMatch = value.match(numberOrLengthRe);
if (numberMatch !== null) return Number(numberMatch[1]);
var boolMatch = input.match(boolRe);
if (boolMatch !== null) return boolMatch[0].toLowerCase() === 'true';
return value;
};
var baseTransformShorthandValue = function baseTransformShorthandValue(propName, inputValue) {
var ast = parse(inputValue.trim());
var tokenStream = new TokenStream(ast.nodes);
return transforms[propName](tokenStream);
};
var transformShorthandValue = process.env.NODE_ENV === 'production' ? baseTransformShorthandValue : function (propName, inputValue) {
try {
return baseTransformShorthandValue(propName, inputValue);
} catch (e) {
throw new Error('Failed to parse declaration "' + propName + ': ' + inputValue + '"');
}
};
var getStylesForProperty = exports.getStylesForProperty = function getStylesForProperty(propName, inputValue, allowShorthand) {
var isRawValue = allowShorthand === false || !(propName in transforms);
var propValue = isRawValue ? transformRawValue(inputValue) : transformShorthandValue(propName, inputValue.trim());
return propValue && propValue.$merge ? propValue.$merge : _defineProperty({}, propName, propValue);
};
var getPropertyName = exports.getPropertyName = camelizeStyleName;
exports.default = function (rules) {
var shorthandBlacklist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
return rules.reduce(function (accum, rule) {
var propertyName = getPropertyName(rule[0]);
var value = rule[1];
var allowShorthand = shorthandBlacklist.indexOf(propertyName) === -1;
return Object.assign(accum, getStylesForProperty(propertyName, value, allowShorthand));
}, {});
};
}).call(this,require('_process'))
},{"./TokenStream":2,"./transforms":7,"_process":1,"fbjs/lib/camelizeStyleName":13,"postcss-value-parser":14}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsImRpc3QvVG9rZW5TdHJlYW0uanMiLCJkaXN0L3Rva2VuVHlwZXMuanMiLCJkaXN0L3RyYW5zZm9ybXMvZmxleC5qcyIsImRpc3QvdHJhbnNmb3Jtcy9mb250LmpzIiwiZGlzdC90cmFuc2Zvcm1zL2ZvbnRGYW1pbHkuanMiLCJkaXN0L3RyYW5zZm9ybXMvaW5kZXguanMiLCJkaXN0L3RyYW5zZm9ybXMvdHJhbnNmb3JtLmpzIiwiZGlzdC90cmFuc2Zvcm1zL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY3NzLWNvbG9yLWtleXdvcmRzL2NvbG9ycy5qc29uIiwibm9kZV9tb2R1bGVzL2Nzcy1jb2xvci1rZXl3b3Jkcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9wb3N0Y3NzLXZhbHVlLXBhcnNlci9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3BhcnNlLmpzIiwibm9kZV9tb2R1bGVzL3Bvc3Rjc3MtdmFsdWUtcGFyc2VyL2xpYi9zdHJpbmdpZnkuanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3VuaXQuanMiLCJub2RlX21vZHVsZXMvcG9zdGNzcy12YWx1ZS1wYXJzZXIvbGliL3dhbGsuanMiLCJkaXN0L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFNZTUJPTF9NQVRDSCA9ICdTWU1CT0xfTUFUQ0gnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG9rZW5TdHJlYW0obm9kZXMsIHBhcmVudCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2tlblN0cmVhbSk7XG5cbiAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5sYXN0RnVuY3Rpb24gPSBudWxsO1xuICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUb2tlblN0cmVhbSwgW3tcbiAgICBrZXk6ICdoYXNUb2tlbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNUb2tlbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2Rlcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2xvb2thaGVhZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvb2thaGVhZCgpIHtcbiAgICAgIHJldHVybiBuZXcgVG9rZW5TdHJlYW0odGhpcy5ub2Rlcy5zbGljZSgxKSwgdGhpcy5wYXJlbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogU1lNQk9MX01BVENILFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdG9rZW5EZXNjcmlwdG9yID0gYXJndW1lbnRzLmxlbmd0aCA8PSBpID8gdW5kZWZpbmVkIDogYXJndW1lbnRzW2ldO1xuICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbkRlc2NyaXB0b3Iobm9kZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IHRoaXMubm9kZXMuc2xpY2UoMSk7XG4gICAgICAgICAgdGhpcy5sYXN0RnVuY3Rpb24gPSBudWxsO1xuICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21hdGNoZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXNbU1lNQk9MX01BVENIXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICE9PSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2V4cGVjdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGVjdCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXNbU1lNQk9MX01BVENIXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSByZXR1cm4gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcy50aHJvdygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21hdGNoRnVuY3Rpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaEZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICBpZiAobm9kZS50eXBlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciB2YWx1ZSA9IG5ldyBUb2tlblN0cmVhbShub2RlLm5vZGVzLCBub2RlKTtcbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLm5vZGVzLnNsaWNlKDEpO1xuICAgICAgdGhpcy5sYXN0RnVuY3Rpb24gPSB2YWx1ZTtcbiAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdleHBlY3RGdW5jdGlvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4cGVjdEZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5tYXRjaEZ1bmN0aW9uKCk7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHJldHVybiB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzLnRocm93KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZXhwZWN0RW1wdHknLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHBlY3RFbXB0eSgpIHtcbiAgICAgIGlmICh0aGlzLmhhc1Rva2VucygpKSB0aGlzLnRocm93KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndGhyb3cnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdGhyb3coKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdG9rZW4gdHlwZTogJyArIHRoaXMubm9kZS50eXBlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdub2RlJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUb2tlblN0cmVhbTtcbn0oKTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJ3Bvc3Rjc3MtdmFsdWUtcGFyc2VyJyksXG4gICAgc3RyaW5naWZ5ID0gX3JlcXVpcmUuc3RyaW5naWZ5O1xuXG52YXIgY3NzQ29sb3JLZXl3b3JkcyA9IHJlcXVpcmUoJ2Nzcy1jb2xvci1rZXl3b3JkcycpO1xuXG52YXIgbWF0Y2hTdHJpbmcgPSBmdW5jdGlvbiBtYXRjaFN0cmluZyhub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIG5vZGUudmFsdWUucmVwbGFjZSgvXFxcXChbMC05YS1mXXsxLDZ9KSg/Olxcc3wkKS9naSwgZnVuY3Rpb24gKG1hdGNoLCBjaGFyQ29kZSkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xuICB9KS5yZXBsYWNlKC9cXFxcL2csICcnKTtcbn07XG5cbnZhciBoZXhDb2xvclJlID0gL14oIyg/OlswLTlhLWZdezMsNH0pezEsMn0pJC9pO1xudmFyIGNzc0Z1bmN0aW9uTmFtZVJlID0gL14ocmdiYT98aHNsYT98aHdifGxhYnxsY2h8Z3JheXxjb2xvcikkLztcblxudmFyIG1hdGNoQ29sb3IgPSBmdW5jdGlvbiBtYXRjaENvbG9yKG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3dvcmQnICYmIChoZXhDb2xvclJlLnRlc3Qobm9kZS52YWx1ZSkgfHwgbm9kZS52YWx1ZSBpbiBjc3NDb2xvcktleXdvcmRzKSkge1xuICAgIHJldHVybiBub2RlLnZhbHVlO1xuICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiBjc3NGdW5jdGlvbk5hbWVSZS50ZXN0KG5vZGUudmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShub2RlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBub25lUmUgPSAvXihub25lKSQvaTtcbnZhciBhdXRvUmUgPSAvXihhdXRvKSQvaTtcbnZhciBpZGVudFJlID0gLyheLT9bX2Etel1bX2EtejAtOS1dKiQpL2k7XG4vLyBOb3RlIGlmIHRoZXNlIGFyZSB3cm9uZywgeW91J2xsIG5lZWQgdG8gY2hhbmdlIGluZGV4LmpzIHRvb1xudmFyIG51bWJlclJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KSQvO1xuLy8gTm90ZSBsZW5ndGhSZSBpcyBzbmVha3k6IHlvdSBjYW4gb21pdCB1bml0cyBmb3IgMFxudmFyIGxlbmd0aFJlID0gL14oMCR8KD86WystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KSg/PXB4JCkpLztcbnZhciBhbmdsZVJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/KD86ZGVnfHJhZCkpJC87XG52YXIgcGVyY2VudFJlID0gL14oWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W0VlXVsrLV0/XFxkKyk/JSkkLztcblxudmFyIG5vb3BUb2tlbiA9IGZ1bmN0aW9uIG5vb3BUb2tlbihwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIHByZWRpY2F0ZShub2RlKSA/ICc8dG9rZW4+JyA6IG51bGw7XG4gIH07XG59O1xuXG52YXIgdmFsdWVGb3JUeXBlVG9rZW4gPSBmdW5jdGlvbiB2YWx1ZUZvclR5cGVUb2tlbih0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09IHR5cGUgPyBub2RlLnZhbHVlIDogbnVsbDtcbiAgfTtcbn07XG5cbnZhciByZWdFeHBUb2tlbiA9IGZ1bmN0aW9uIHJlZ0V4cFRva2VuKHJlZ0V4cCkge1xuICB2YXIgdHJhbnNmb3JtID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBTdHJpbmc7XG4gIHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT09ICd3b3JkJykgcmV0dXJuIG51bGw7XG5cbiAgICB2YXIgbWF0Y2ggPSBub2RlLnZhbHVlLm1hdGNoKHJlZ0V4cCk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciB2YWx1ZSA9IHRyYW5zZm9ybShtYXRjaFsxXSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5yZWdFeHBUb2tlbiA9IHJlZ0V4cFRva2VuO1xuXG5tb2R1bGUuZXhwb3J0cy50b2tlbnMgPSB7XG4gIFNQQUNFOiBub29wVG9rZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSAnc3BhY2UnO1xuICB9KSxcbiAgU0xBU0g6IG5vb3BUb2tlbihmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLnR5cGUgPT09ICdkaXYnICYmIG5vZGUudmFsdWUgPT09ICcvJztcbiAgfSksXG4gIENPTU1BOiBub29wVG9rZW4oZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09PSAnZGl2JyAmJiBub2RlLnZhbHVlID09PSAnLCc7XG4gIH0pLFxuICBXT1JEOiB2YWx1ZUZvclR5cGVUb2tlbignd29yZCcpLFxuICBOT05FOiByZWdFeHBUb2tlbihub25lUmUpLFxuICBBVVRPOiByZWdFeHBUb2tlbihhdXRvUmUpLFxuICBOVU1CRVI6IHJlZ0V4cFRva2VuKG51bWJlclJlLCBOdW1iZXIpLFxuICBMRU5HVEg6IHJlZ0V4cFRva2VuKGxlbmd0aFJlLCBOdW1iZXIpLFxuICBBTkdMRTogcmVnRXhwVG9rZW4oYW5nbGVSZSksXG4gIFBFUkNFTlQ6IHJlZ0V4cFRva2VuKHBlcmNlbnRSZSksXG4gIElERU5UOiByZWdFeHBUb2tlbihpZGVudFJlKSxcbiAgU1RSSU5HOiBtYXRjaFN0cmluZyxcbiAgQ09MT1I6IG1hdGNoQ29sb3Jcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi90b2tlblR5cGVzJyksXG4gICAgdG9rZW5zID0gX3JlcXVpcmUudG9rZW5zO1xuXG52YXIgTk9ORSA9IHRva2Vucy5OT05FLFxuICAgIEFVVE8gPSB0b2tlbnMuQVVUTyxcbiAgICBOVU1CRVIgPSB0b2tlbnMuTlVNQkVSLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgU1BBQ0UgPSB0b2tlbnMuU1BBQ0U7XG5cblxudmFyIGRlZmF1bHRGbGV4R3JvdyA9IDE7XG52YXIgZGVmYXVsdEZsZXhTaHJpbmsgPSAxO1xudmFyIGRlZmF1bHRGbGV4QmFzaXMgPSAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0b2tlblN0cmVhbSkge1xuICB2YXIgZmxleEdyb3cgPSB2b2lkIDA7XG4gIHZhciBmbGV4U2hyaW5rID0gdm9pZCAwO1xuICB2YXIgZmxleEJhc2lzID0gdm9pZCAwO1xuXG4gIGlmICh0b2tlblN0cmVhbS5tYXRjaGVzKE5PTkUpKSB7XG4gICAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcbiAgICByZXR1cm4geyAkbWVyZ2U6IHsgZmxleEdyb3c6IDAsIGZsZXhTaHJpbms6IDAgfSB9O1xuICB9IGVsc2UgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoQVVUTykpIHtcbiAgICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuICAgIHJldHVybiB7ICRtZXJnZTogeyBmbGV4R3JvdzogMSwgZmxleFNocmluazogMSB9IH07XG4gIH1cblxuICB2YXIgcGFydHNQYXJzZWQgPSAwO1xuICB3aGlsZSAocGFydHNQYXJzZWQgPCAyICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKHBhcnRzUGFyc2VkICE9PSAwKSB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuXG4gICAgaWYgKGZsZXhHcm93ID09PSB1bmRlZmluZWQgJiYgdG9rZW5TdHJlYW0ubWF0Y2hlcyhOVU1CRVIpKSB7XG4gICAgICBmbGV4R3JvdyA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcblxuICAgICAgaWYgKHRva2VuU3RyZWFtLmxvb2thaGVhZCgpLm1hdGNoZXMoTlVNQkVSKSkge1xuICAgICAgICB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuICAgICAgICBmbGV4U2hyaW5rID0gdG9rZW5TdHJlYW0uZXhwZWN0KE5VTUJFUik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmbGV4QmFzaXMgPT09IHVuZGVmaW5lZCAmJiB0b2tlblN0cmVhbS5tYXRjaGVzKExFTkdUSCkpIHtcbiAgICAgIGZsZXhCYXNpcyA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW5TdHJlYW0udGhyb3coKTtcbiAgICB9XG5cbiAgICBwYXJ0c1BhcnNlZCArPSAxO1xuICB9XG5cbiAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcblxuICBpZiAoZmxleEdyb3cgPT09IHVuZGVmaW5lZCkgZmxleEdyb3cgPSBkZWZhdWx0RmxleEdyb3c7XG4gIGlmIChmbGV4U2hyaW5rID09PSB1bmRlZmluZWQpIGZsZXhTaHJpbmsgPSBkZWZhdWx0RmxleFNocmluaztcbiAgaWYgKGZsZXhCYXNpcyA9PT0gdW5kZWZpbmVkKSBmbGV4QmFzaXMgPSBkZWZhdWx0RmxleEJhc2lzO1xuXG4gIHJldHVybiB7ICRtZXJnZTogeyBmbGV4R3JvdzogZmxleEdyb3csIGZsZXhTaHJpbms6IGZsZXhTaHJpbmssIGZsZXhCYXNpczogZmxleEJhc2lzIH0gfTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcGFyc2VGb250RmFtaWx5ID0gcmVxdWlyZSgnLi9mb250RmFtaWx5Jyk7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL3Rva2VuVHlwZXMnKSxcbiAgICByZWdFeHBUb2tlbiA9IF9yZXF1aXJlLnJlZ0V4cFRva2VuLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgTlVNQkVSID0gdG9rZW5zLk5VTUJFUixcbiAgICBTTEFTSCA9IHRva2Vucy5TTEFTSDtcblxudmFyIE5PUk1BTCA9IHJlZ0V4cFRva2VuKC9eKG5vcm1hbCkkLyk7XG52YXIgU1RZTEUgPSByZWdFeHBUb2tlbigvXihpdGFsaWMpJC8pO1xudmFyIFdFSUdIVCA9IHJlZ0V4cFRva2VuKC9eKFsxLTldMDB8Ym9sZCkkLyk7XG52YXIgVkFSSUFOVCA9IHJlZ0V4cFRva2VuKC9eKHNtYWxsLWNhcHMpJC8pO1xuXG52YXIgZGVmYXVsdEZvbnRTdHlsZSA9ICdub3JtYWwnO1xudmFyIGRlZmF1bHRGb250V2VpZ2h0ID0gJ25vcm1hbCc7XG52YXIgZGVmYXVsdEZvbnRWYXJpYW50ID0gW107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gIHZhciBmb250U3R5bGUgPSB2b2lkIDA7XG4gIHZhciBmb250V2VpZ2h0ID0gdm9pZCAwO1xuICB2YXIgZm9udFZhcmlhbnQgPSB2b2lkIDA7XG4gIC8vIGxldCBmb250U2l6ZTtcbiAgdmFyIGxpbmVIZWlnaHQgPSB2b2lkIDA7XG4gIC8vIGxldCBmb250RmFtaWx5O1xuXG4gIHZhciBudW1TdHlsZVdlaWdodFZhcmlhbnRNYXRjaGVkID0gMDtcbiAgd2hpbGUgKG51bVN0eWxlV2VpZ2h0VmFyaWFudE1hdGNoZWQgPCAzICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoTk9STUFMKSkge1xuICAgICAgLyogcGFzcyAqL1xuICAgIH0gZWxzZSBpZiAoZm9udFN0eWxlID09PSB1bmRlZmluZWQgJiYgdG9rZW5TdHJlYW0ubWF0Y2hlcyhTVFlMRSkpIHtcbiAgICAgIGZvbnRTdHlsZSA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZvbnRXZWlnaHQgPT09IHVuZGVmaW5lZCAmJiB0b2tlblN0cmVhbS5tYXRjaGVzKFdFSUdIVCkpIHtcbiAgICAgIGZvbnRXZWlnaHQgPSB0b2tlblN0cmVhbS5sYXN0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChmb250VmFyaWFudCA9PT0gdW5kZWZpbmVkICYmIHRva2VuU3RyZWFtLm1hdGNoZXMoVkFSSUFOVCkpIHtcbiAgICAgIGZvbnRWYXJpYW50ID0gW3Rva2VuU3RyZWFtLmxhc3RWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRva2VuU3RyZWFtLmV4cGVjdChTUEFDRSk7XG4gICAgbnVtU3R5bGVXZWlnaHRWYXJpYW50TWF0Y2hlZCArPSAxO1xuICB9XG5cbiAgdmFyIGZvbnRTaXplID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG5cbiAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoU0xBU0gpKSB7XG4gICAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoTlVNQkVSKSkge1xuICAgICAgbGluZUhlaWdodCA9IGZvbnRTaXplICogdG9rZW5TdHJlYW0ubGFzdFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSGVpZ2h0ID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgdG9rZW5TdHJlYW0uZXhwZWN0KFNQQUNFKTtcblxuICB2YXIgZm9udEZhbWlseSA9IHBhcnNlRm9udEZhbWlseSh0b2tlblN0cmVhbSk7XG5cbiAgaWYgKGZvbnRTdHlsZSA9PT0gdW5kZWZpbmVkKSBmb250U3R5bGUgPSBkZWZhdWx0Rm9udFN0eWxlO1xuICBpZiAoZm9udFdlaWdodCA9PT0gdW5kZWZpbmVkKSBmb250V2VpZ2h0ID0gZGVmYXVsdEZvbnRXZWlnaHQ7XG4gIGlmIChmb250VmFyaWFudCA9PT0gdW5kZWZpbmVkKSBmb250VmFyaWFudCA9IGRlZmF1bHRGb250VmFyaWFudDtcblxuICB2YXIgb3V0ID0geyBmb250U3R5bGU6IGZvbnRTdHlsZSwgZm9udFdlaWdodDogZm9udFdlaWdodCwgZm9udFZhcmlhbnQ6IGZvbnRWYXJpYW50LCBmb250U2l6ZTogZm9udFNpemUsIGZvbnRGYW1pbHk6IGZvbnRGYW1pbHkgfTtcbiAgaWYgKGxpbmVIZWlnaHQgIT09IHVuZGVmaW5lZCkgb3V0LmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0O1xuXG4gIHJldHVybiB7ICRtZXJnZTogb3V0IH07XG59OyIsIid1c2Ugc3RyaWN0JztcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vdG9rZW5UeXBlcycpLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIElERU5UID0gdG9rZW5zLklERU5ULFxuICAgIFNUUklORyA9IHRva2Vucy5TVFJJTkc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodG9rZW5TdHJlYW0pIHtcbiAgdmFyIGZvbnRGYW1pbHkgPSB2b2lkIDA7XG5cbiAgaWYgKHRva2VuU3RyZWFtLm1hdGNoZXMoU1RSSU5HKSkge1xuICAgIGZvbnRGYW1pbHkgPSB0b2tlblN0cmVhbS5sYXN0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgZm9udEZhbWlseSA9IHRva2VuU3RyZWFtLmV4cGVjdChJREVOVCk7XG4gICAgd2hpbGUgKHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgICB0b2tlblN0cmVhbS5leHBlY3QoU1BBQ0UpO1xuICAgICAgdmFyIG5leHRJZGVudCA9IHRva2VuU3RyZWFtLmV4cGVjdChJREVOVCk7XG4gICAgICBmb250RmFtaWx5ICs9ICcgJyArIG5leHRJZGVudDtcbiAgICB9XG4gIH1cblxuICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuXG4gIHJldHVybiBmb250RmFtaWx5O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4uL3Rva2VuVHlwZXMnKSxcbiAgICByZWdFeHBUb2tlbiA9IF9yZXF1aXJlLnJlZ0V4cFRva2VuLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIGZsZXggPSByZXF1aXJlKCcuL2ZsZXgnKTtcbnZhciBmb250ID0gcmVxdWlyZSgnLi9mb250Jyk7XG52YXIgZm9udEZhbWlseSA9IHJlcXVpcmUoJy4vZm9udEZhbWlseScpO1xudmFyIHRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtJyk7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL3V0aWwnKSxcbiAgICBkaXJlY3Rpb25GYWN0b3J5ID0gX3JlcXVpcmUyLmRpcmVjdGlvbkZhY3RvcnksXG4gICAgYW55T3JkZXJGYWN0b3J5ID0gX3JlcXVpcmUyLmFueU9yZGVyRmFjdG9yeSxcbiAgICBzaGFkb3dPZmZzZXRGYWN0b3J5ID0gX3JlcXVpcmUyLnNoYWRvd09mZnNldEZhY3Rvcnk7XG5cbnZhciBJREVOVCA9IHRva2Vucy5JREVOVCxcbiAgICBXT1JEID0gdG9rZW5zLldPUkQsXG4gICAgQ09MT1IgPSB0b2tlbnMuQ09MT1I7XG5cblxudmFyIGJhY2tncm91bmQgPSBmdW5jdGlvbiBiYWNrZ3JvdW5kKHRva2VuU3RyZWFtKSB7XG4gIHJldHVybiB7ICRtZXJnZTogeyBiYWNrZ3JvdW5kQ29sb3I6IHRva2VuU3RyZWFtLmV4cGVjdChDT0xPUikgfSB9O1xufTtcbnZhciBib3JkZXIgPSBhbnlPcmRlckZhY3Rvcnkoe1xuICBib3JkZXJXaWR0aDoge1xuICAgIHRva2VuOiB0b2tlbnMuTEVOR1RILFxuICAgIGRlZmF1bHQ6IDFcbiAgfSxcbiAgYm9yZGVyQ29sb3I6IHtcbiAgICB0b2tlbjogQ09MT1IsXG4gICAgZGVmYXVsdDogJ2JsYWNrJ1xuICB9LFxuICBib3JkZXJTdHlsZToge1xuICAgIHRva2VuOiByZWdFeHBUb2tlbigvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvKSxcbiAgICBkZWZhdWx0OiAnc29saWQnXG4gIH1cbn0pO1xudmFyIGJvcmRlckNvbG9yID0gZGlyZWN0aW9uRmFjdG9yeSh7XG4gIHR5cGVzOiBbV09SRF0sXG4gIHByZWZpeDogJ2JvcmRlcicsXG4gIHN1ZmZpeDogJ0NvbG9yJ1xufSk7XG52YXIgYm9yZGVyUmFkaXVzID0gZGlyZWN0aW9uRmFjdG9yeSh7XG4gIGRpcmVjdGlvbnM6IFsnVG9wUmlnaHQnLCAnQm90dG9tUmlnaHQnLCAnQm90dG9tTGVmdCcsICdUb3BMZWZ0J10sXG4gIHByZWZpeDogJ2JvcmRlcicsXG4gIHN1ZmZpeDogJ1JhZGl1cydcbn0pO1xudmFyIGJvcmRlcldpZHRoID0gZGlyZWN0aW9uRmFjdG9yeSh7IHByZWZpeDogJ2JvcmRlcicsIHN1ZmZpeDogJ1dpZHRoJyB9KTtcbnZhciBtYXJnaW4gPSBkaXJlY3Rpb25GYWN0b3J5KHsgcHJlZml4OiAnbWFyZ2luJyB9KTtcbnZhciBwYWRkaW5nID0gZGlyZWN0aW9uRmFjdG9yeSh7IHByZWZpeDogJ3BhZGRpbmcnIH0pO1xudmFyIGZsZXhGbG93ID0gYW55T3JkZXJGYWN0b3J5KHtcbiAgZmxleFdyYXA6IHtcbiAgICB0b2tlbjogcmVnRXhwVG9rZW4oLyhub3dyYXB8d3JhcHx3cmFwLXJldmVyc2UpLyksXG4gICAgZGVmYXVsdDogJ25vd3JhcCdcbiAgfSxcbiAgZmxleERpcmVjdGlvbjoge1xuICAgIHRva2VuOiByZWdFeHBUb2tlbigvKHJvd3xyb3ctcmV2ZXJzZXxjb2x1bW58Y29sdW1uLXJldmVyc2UpLyksXG4gICAgZGVmYXVsdDogJ3JvdydcbiAgfVxufSk7XG52YXIgZm9udFZhcmlhbnQgPSBmdW5jdGlvbiBmb250VmFyaWFudCh0b2tlblN0cmVhbSkge1xuICByZXR1cm4gW3Rva2VuU3RyZWFtLmV4cGVjdChJREVOVCldO1xufTtcbnZhciBmb250V2VpZ2h0ID0gZnVuY3Rpb24gZm9udFdlaWdodCh0b2tlblN0cmVhbSkge1xuICByZXR1cm4gdG9rZW5TdHJlYW0uZXhwZWN0KFdPUkQpO1xufTsgLy8gQWxzbyBtYXRjaCBudW1iZXJzIGFzIHN0cmluZ3NcbnZhciBzaGFkb3dPZmZzZXQgPSBzaGFkb3dPZmZzZXRGYWN0b3J5KCk7XG52YXIgdGV4dFNoYWRvd09mZnNldCA9IHNoYWRvd09mZnNldEZhY3RvcnkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGJhY2tncm91bmQ6IGJhY2tncm91bmQsXG4gIGJvcmRlcjogYm9yZGVyLFxuICBib3JkZXJDb2xvcjogYm9yZGVyQ29sb3IsXG4gIGJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzLFxuICBib3JkZXJXaWR0aDogYm9yZGVyV2lkdGgsXG4gIGZsZXg6IGZsZXgsXG4gIGZsZXhGbG93OiBmbGV4RmxvdyxcbiAgZm9udDogZm9udCxcbiAgZm9udEZhbWlseTogZm9udEZhbWlseSxcbiAgZm9udFZhcmlhbnQ6IGZvbnRWYXJpYW50LFxuICBmb250V2VpZ2h0OiBmb250V2VpZ2h0LFxuICBtYXJnaW46IG1hcmdpbixcbiAgcGFkZGluZzogcGFkZGluZyxcbiAgc2hhZG93T2Zmc2V0OiBzaGFkb3dPZmZzZXQsXG4gIHRleHRTaGFkb3dPZmZzZXQ6IHRleHRTaGFkb3dPZmZzZXQsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59OyIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi4vdG9rZW5UeXBlcycpLFxuICAgIHRva2VucyA9IF9yZXF1aXJlLnRva2VucztcblxudmFyIFNQQUNFID0gdG9rZW5zLlNQQUNFLFxuICAgIENPTU1BID0gdG9rZW5zLkNPTU1BLFxuICAgIExFTkdUSCA9IHRva2Vucy5MRU5HVEgsXG4gICAgTlVNQkVSID0gdG9rZW5zLk5VTUJFUixcbiAgICBBTkdMRSA9IHRva2Vucy5BTkdMRTtcblxuXG52YXIgb25lT2ZUeXBlID0gZnVuY3Rpb24gb25lT2ZUeXBlKHRva2VuVHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKGZ1bmN0aW9uU3RyZWFtKSB7XG4gICAgdmFyIHZhbHVlID0gZnVuY3Rpb25TdHJlYW0uZXhwZWN0KHRva2VuVHlwZSk7XG4gICAgZnVuY3Rpb25TdHJlYW0uZXhwZWN0RW1wdHkoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG52YXIgc2luZ2xlTnVtYmVyID0gb25lT2ZUeXBlKE5VTUJFUik7XG52YXIgc2luZ2xlTGVuZ3RoID0gb25lT2ZUeXBlKExFTkdUSCk7XG52YXIgc2luZ2xlQW5nbGUgPSBvbmVPZlR5cGUoQU5HTEUpO1xudmFyIHh5VHJhbnNmb3JtRmFjdG9yeSA9IGZ1bmN0aW9uIHh5VHJhbnNmb3JtRmFjdG9yeSh0b2tlblR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlSWZPbWl0dGVkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChmdW5jdGlvblN0cmVhbSkge1xuICAgICAgdmFyIHggPSBmdW5jdGlvblN0cmVhbS5leHBlY3QodG9rZW5UeXBlKTtcblxuICAgICAgdmFyIHkgPSB2b2lkIDA7XG4gICAgICBpZiAoZnVuY3Rpb25TdHJlYW0uaGFzVG9rZW5zKCkpIHtcbiAgICAgICAgZnVuY3Rpb25TdHJlYW0uZXhwZWN0KENPTU1BKTtcbiAgICAgICAgeSA9IGZ1bmN0aW9uU3RyZWFtLmV4cGVjdCh0b2tlblR5cGUpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZUlmT21pdHRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHkgPSB2YWx1ZUlmT21pdHRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzc3VtcHRpb24sIGlmIHggPT09IHksIHRoZW4gd2UgY2FuIG9taXQgWFlcbiAgICAgICAgLy8gSS5lLiBzY2FsZSg1KSA9PiBbeyBzY2FsZTogNSB9XSByYXRoZXIgdGhhbiBbeyBzY2FsZVg6IDUgfSwgeyBzY2FsZVk6IDUgfV1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uU3RyZWFtLmV4cGVjdEVtcHR5KCk7XG5cbiAgICAgIHJldHVybiBbX2RlZmluZVByb3BlcnR5KHt9LCBrZXkgKyAnWScsIHkpLCBfZGVmaW5lUHJvcGVydHkoe30sIGtleSArICdYJywgeCldO1xuICAgIH07XG4gIH07XG59O1xudmFyIHh5TnVtYmVyID0geHlUcmFuc2Zvcm1GYWN0b3J5KE5VTUJFUik7XG52YXIgeHlMZW5ndGggPSB4eVRyYW5zZm9ybUZhY3RvcnkoTEVOR1RIKTtcbnZhciB4eUFuZ2xlID0geHlUcmFuc2Zvcm1GYWN0b3J5KEFOR0xFKTtcblxudmFyIHBhcnRUcmFuc2Zvcm1zID0ge1xuICBwZXJzcGVjdGl2ZTogc2luZ2xlTnVtYmVyLFxuICBzY2FsZTogeHlOdW1iZXIoJ3NjYWxlJyksXG4gIHNjYWxlWDogc2luZ2xlTnVtYmVyLFxuICBzY2FsZVk6IHNpbmdsZU51bWJlcixcbiAgdHJhbnNsYXRlOiB4eUxlbmd0aCgndHJhbnNsYXRlJywgMCksXG4gIHRyYW5zbGF0ZVg6IHNpbmdsZUxlbmd0aCxcbiAgdHJhbnNsYXRlWTogc2luZ2xlTGVuZ3RoLFxuICByb3RhdGU6IHNpbmdsZUFuZ2xlLFxuICByb3RhdGVYOiBzaW5nbGVBbmdsZSxcbiAgcm90YXRlWTogc2luZ2xlQW5nbGUsXG4gIHJvdGF0ZVo6IHNpbmdsZUFuZ2xlLFxuICBza2V3WDogc2luZ2xlQW5nbGUsXG4gIHNrZXdZOiBzaW5nbGVBbmdsZSxcbiAgc2tldzogeHlBbmdsZSgnc2tldycsICcwZGVnJylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gIHZhciB0cmFuc2Zvcm1zID0gW107XG5cbiAgdmFyIGRpZFBhcnNlRmlyc3QgPSBmYWxzZTtcbiAgd2hpbGUgKHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgaWYgKGRpZFBhcnNlRmlyc3QpIHRva2VuU3RyZWFtLmV4cGVjdChTUEFDRSk7XG5cbiAgICB2YXIgZnVuY3Rpb25TdHJlYW0gPSB0b2tlblN0cmVhbS5leHBlY3RGdW5jdGlvbigpO1xuICAgIHZhciB0cmFuc2Zvcm1OYW1lID0gZnVuY3Rpb25TdHJlYW0ucGFyZW50LnZhbHVlO1xuICAgIHZhciB0cmFuc2Zvcm1lZFZhbHVlcyA9IHBhcnRUcmFuc2Zvcm1zW3RyYW5zZm9ybU5hbWVdKGZ1bmN0aW9uU3RyZWFtKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNmb3JtZWRWYWx1ZXMpKSB7XG4gICAgICB0cmFuc2Zvcm1lZFZhbHVlcyA9IFtfZGVmaW5lUHJvcGVydHkoe30sIHRyYW5zZm9ybU5hbWUsIHRyYW5zZm9ybWVkVmFsdWVzKV07XG4gICAgfVxuICAgIHRyYW5zZm9ybXMgPSB0cmFuc2Zvcm1lZFZhbHVlcy5jb25jYXQodHJhbnNmb3Jtcyk7XG5cbiAgICBkaWRQYXJzZUZpcnN0ID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2Zvcm1zO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuLi90b2tlblR5cGVzJyksXG4gICAgdG9rZW5zID0gX3JlcXVpcmUudG9rZW5zO1xuXG52YXIgTEVOR1RIID0gdG9rZW5zLkxFTkdUSCxcbiAgICBQRVJDRU5UID0gdG9rZW5zLlBFUkNFTlQsXG4gICAgU1BBQ0UgPSB0b2tlbnMuU1BBQ0U7XG5cblxubW9kdWxlLmV4cG9ydHMuZGlyZWN0aW9uRmFjdG9yeSA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBfcmVmJHR5cGVzID0gX3JlZi50eXBlcyxcbiAgICAgIHR5cGVzID0gX3JlZiR0eXBlcyA9PT0gdW5kZWZpbmVkID8gW0xFTkdUSCwgUEVSQ0VOVF0gOiBfcmVmJHR5cGVzLFxuICAgICAgX3JlZiRkaXJlY3Rpb25zID0gX3JlZi5kaXJlY3Rpb25zLFxuICAgICAgZGlyZWN0aW9ucyA9IF9yZWYkZGlyZWN0aW9ucyA9PT0gdW5kZWZpbmVkID8gWydUb3AnLCAnUmlnaHQnLCAnQm90dG9tJywgJ0xlZnQnXSA6IF9yZWYkZGlyZWN0aW9ucyxcbiAgICAgIF9yZWYkcHJlZml4ID0gX3JlZi5wcmVmaXgsXG4gICAgICBwcmVmaXggPSBfcmVmJHByZWZpeCA9PT0gdW5kZWZpbmVkID8gJycgOiBfcmVmJHByZWZpeCxcbiAgICAgIF9yZWYkc3VmZml4ID0gX3JlZi5zdWZmaXgsXG4gICAgICBzdWZmaXggPSBfcmVmJHN1ZmZpeCA9PT0gdW5kZWZpbmVkID8gJycgOiBfcmVmJHN1ZmZpeDtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0b2tlblN0cmVhbSkge1xuICAgIHZhciBfb3V0cHV0O1xuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgLy8gYm9yZGVyV2lkdGggZG9lc24ndCBjdXJyZW50bHkgYWxsb3cgYSBwZXJjZW50IHZhbHVlLCBidXQgbWF5IGRvIGluIHRoZSBmdXR1cmVcbiAgICB2YWx1ZXMucHVzaCh0b2tlblN0cmVhbS5leHBlY3QuYXBwbHkodG9rZW5TdHJlYW0sIF90b0NvbnN1bWFibGVBcnJheSh0eXBlcykpKTtcblxuICAgIHdoaWxlICh2YWx1ZXMubGVuZ3RoIDwgNCAmJiB0b2tlblN0cmVhbS5oYXNUb2tlbnMoKSkge1xuICAgICAgdG9rZW5TdHJlYW0uZXhwZWN0KFNQQUNFKTtcbiAgICAgIHZhbHVlcy5wdXNoKHRva2VuU3RyZWFtLmV4cGVjdC5hcHBseSh0b2tlblN0cmVhbSwgX3RvQ29uc3VtYWJsZUFycmF5KHR5cGVzKSkpO1xuICAgIH1cblxuICAgIHRva2VuU3RyZWFtLmV4cGVjdEVtcHR5KCk7XG5cbiAgICB2YXIgdG9wID0gdmFsdWVzWzBdLFxuICAgICAgICBfdmFsdWVzJCA9IHZhbHVlc1sxXSxcbiAgICAgICAgcmlnaHQgPSBfdmFsdWVzJCA9PT0gdW5kZWZpbmVkID8gdG9wIDogX3ZhbHVlcyQsXG4gICAgICAgIF92YWx1ZXMkMiA9IHZhbHVlc1syXSxcbiAgICAgICAgYm90dG9tID0gX3ZhbHVlcyQyID09PSB1bmRlZmluZWQgPyB0b3AgOiBfdmFsdWVzJDIsXG4gICAgICAgIF92YWx1ZXMkMyA9IHZhbHVlc1szXSxcbiAgICAgICAgbGVmdCA9IF92YWx1ZXMkMyA9PT0gdW5kZWZpbmVkID8gcmlnaHQgOiBfdmFsdWVzJDM7XG5cblxuICAgIHZhciBrZXlGb3IgPSBmdW5jdGlvbiBrZXlGb3Iobikge1xuICAgICAgcmV0dXJuICcnICsgcHJlZml4ICsgZGlyZWN0aW9uc1tuXSArIHN1ZmZpeDtcbiAgICB9O1xuXG4gICAgdmFyIG91dHB1dCA9IChfb3V0cHV0ID0ge30sIF9kZWZpbmVQcm9wZXJ0eShfb3V0cHV0LCBrZXlGb3IoMCksIHRvcCksIF9kZWZpbmVQcm9wZXJ0eShfb3V0cHV0LCBrZXlGb3IoMSksIHJpZ2h0KSwgX2RlZmluZVByb3BlcnR5KF9vdXRwdXQsIGtleUZvcigyKSwgYm90dG9tKSwgX2RlZmluZVByb3BlcnR5KF9vdXRwdXQsIGtleUZvcigzKSwgbGVmdCksIF9vdXRwdXQpO1xuXG4gICAgcmV0dXJuIHsgJG1lcmdlOiBvdXRwdXQgfTtcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmFueU9yZGVyRmFjdG9yeSA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzKSB7XG4gIHZhciBkZWxpbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogU1BBQ0U7XG4gIHJldHVybiBmdW5jdGlvbiAodG9rZW5TdHJlYW0pIHtcbiAgICB2YXIgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIHZhciB2YWx1ZXMgPSBwcm9wZXJ0eU5hbWVzLnJlZHVjZShmdW5jdGlvbiAoYWNjdW0sIHByb3BlcnR5TmFtZSkge1xuICAgICAgYWNjdW1bcHJvcGVydHlOYW1lXSA9PT0gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwge30pO1xuXG4gICAgdmFyIG51bVBhcnNlZCA9IDA7XG4gICAgd2hpbGUgKG51bVBhcnNlZCA8IHByb3BlcnR5TmFtZXMubGVuZ3RoICYmIHRva2VuU3RyZWFtLmhhc1Rva2VucygpKSB7XG4gICAgICBpZiAobnVtUGFyc2VkKSB0b2tlblN0cmVhbS5leHBlY3QoZGVsaW0pO1xuXG4gICAgICB2YXIgbWF0Y2hlZFByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZXMuZmluZChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXNbcHJvcGVydHlOYW1lXSA9PT0gdW5kZWZpbmVkICYmIHRva2VuU3RyZWFtLm1hdGNoZXMocHJvcGVydGllc1twcm9wZXJ0eU5hbWVdLnRva2VuKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW1hdGNoZWRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgdG9rZW5TdHJlYW0udGhyb3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlc1ttYXRjaGVkUHJvcGVydHlOYW1lXSA9IHRva2VuU3RyZWFtLmxhc3RWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgbnVtUGFyc2VkICs9IDE7XG4gICAgfVxuXG4gICAgdG9rZW5TdHJlYW0uZXhwZWN0RW1wdHkoKTtcblxuICAgIHByb3BlcnR5TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICBpZiAodmFsdWVzW3Byb3BlcnR5TmFtZV0gPT09IHVuZGVmaW5lZCkgdmFsdWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0uZGVmYXVsdDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7ICRtZXJnZTogdmFsdWVzIH07XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zaGFkb3dPZmZzZXRGYWN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRva2VuU3RyZWFtKSB7XG4gICAgdmFyIHdpZHRoID0gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCk7XG4gICAgdmFyIGhlaWdodCA9IHRva2VuU3RyZWFtLm1hdGNoZXMoU1BBQ0UpID8gdG9rZW5TdHJlYW0uZXhwZWN0KExFTkdUSCkgOiB3aWR0aDtcbiAgICB0b2tlblN0cmVhbS5leHBlY3RFbXB0eSgpO1xuICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcbiAgfTtcbn07IiwibW9kdWxlLmV4cG9ydHM9e1xuICBcImJsYWNrXCI6IFwiIzAwMDAwMFwiLFxuICBcInNpbHZlclwiOiBcIiNjMGMwYzBcIixcbiAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gIFwicHVycGxlXCI6IFwiIzgwMDA4MFwiLFxuICBcImZ1Y2hzaWFcIjogXCIjZmYwMGZmXCIsXG4gIFwiZ3JlZW5cIjogXCIjMDA4MDAwXCIsXG4gIFwibGltZVwiOiBcIiMwMGZmMDBcIixcbiAgXCJvbGl2ZVwiOiBcIiM4MDgwMDBcIixcbiAgXCJ5ZWxsb3dcIjogXCIjZmZmZjAwXCIsXG4gIFwibmF2eVwiOiBcIiMwMDAwODBcIixcbiAgXCJibHVlXCI6IFwiIzAwMDBmZlwiLFxuICBcInRlYWxcIjogXCIjMDA4MDgwXCIsXG4gIFwiYXF1YVwiOiBcIiMwMGZmZmZcIixcbiAgXCJvcmFuZ2VcIjogXCIjZmZhNTAwXCIsXG4gIFwiYWxpY2VibHVlXCI6IFwiI2YwZjhmZlwiLFxuICBcImFudGlxdWV3aGl0ZVwiOiBcIiNmYWViZDdcIixcbiAgXCJhcXVhbWFyaW5lXCI6IFwiIzdmZmZkNFwiLFxuICBcImF6dXJlXCI6IFwiI2YwZmZmZlwiLFxuICBcImJlaWdlXCI6IFwiI2Y1ZjVkY1wiLFxuICBcImJpc3F1ZVwiOiBcIiNmZmU0YzRcIixcbiAgXCJibGFuY2hlZGFsbW9uZFwiOiBcIiNmZmViY2RcIixcbiAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgXCJkYXJrYmx1ZVwiOiBcIiMwMDAwOGJcIixcbiAgXCJkYXJrY3lhblwiOiBcIiMwMDhiOGJcIixcbiAgXCJkYXJrZ29sZGVucm9kXCI6IFwiI2I4ODYwYlwiLFxuICBcImRhcmtncmF5XCI6IFwiI2E5YTlhOVwiLFxuICBcImRhcmtncmVlblwiOiBcIiMwMDY0MDBcIixcbiAgXCJkYXJrZ3JleVwiOiBcIiNhOWE5YTlcIixcbiAgXCJkYXJra2hha2lcIjogXCIjYmRiNzZiXCIsXG4gIFwiZGFya21hZ2VudGFcIjogXCIjOGIwMDhiXCIsXG4gIFwiZGFya29saXZlZ3JlZW5cIjogXCIjNTU2YjJmXCIsXG4gIFwiZGFya29yYW5nZVwiOiBcIiNmZjhjMDBcIixcbiAgXCJkYXJrb3JjaGlkXCI6IFwiIzk5MzJjY1wiLFxuICBcImRhcmtyZWRcIjogXCIjOGIwMDAwXCIsXG4gIFwiZGFya3NhbG1vblwiOiBcIiNlOTk2N2FcIixcbiAgXCJkYXJrc2VhZ3JlZW5cIjogXCIjOGZiYzhmXCIsXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBcIiM0ODNkOGJcIixcbiAgXCJkYXJrc2xhdGVncmF5XCI6IFwiIzJmNGY0ZlwiLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogXCIjMmY0ZjRmXCIsXG4gIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gIFwiZGltZ3JleVwiOiBcIiM2OTY5NjlcIixcbiAgXCJkb2RnZXJibHVlXCI6IFwiIzFlOTBmZlwiLFxuICBcImZpcmVicmlja1wiOiBcIiNiMjIyMjJcIixcbiAgXCJmbG9yYWx3aGl0ZVwiOiBcIiNmZmZhZjBcIixcbiAgXCJmb3Jlc3RncmVlblwiOiBcIiMyMjhiMjJcIixcbiAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgXCJncmVlbnllbGxvd1wiOiBcIiNhZGZmMmZcIixcbiAgXCJncmV5XCI6IFwiIzgwODA4MFwiLFxuICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICBcImxpZ2h0Z3JheVwiOiBcIiNkM2QzZDNcIixcbiAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgXCJsaWdodHBpbmtcIjogXCIjZmZiNmMxXCIsXG4gIFwibGlnaHRzYWxtb25cIjogXCIjZmZhMDdhXCIsXG4gIFwibGlnaHRzZWFncmVlblwiOiBcIiMyMGIyYWFcIixcbiAgXCJsaWdodHNreWJsdWVcIjogXCIjODdjZWZhXCIsXG4gIFwibGlnaHRzbGF0ZWdyYXlcIjogXCIjNzc4ODk5XCIsXG4gIFwibGlnaHRzbGF0ZWdyZXlcIjogXCIjNzc4ODk5XCIsXG4gIFwibGlnaHRzdGVlbGJsdWVcIjogXCIjYjBjNGRlXCIsXG4gIFwibGlnaHR5ZWxsb3dcIjogXCIjZmZmZmUwXCIsXG4gIFwibGltZWdyZWVuXCI6IFwiIzMyY2QzMlwiLFxuICBcImxpbmVuXCI6IFwiI2ZhZjBlNlwiLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIjNjZjZGFhXCIsXG4gIFwibWVkaXVtYmx1ZVwiOiBcIiMwMDAwY2RcIixcbiAgXCJtZWRpdW1vcmNoaWRcIjogXCIjYmE1NWQzXCIsXG4gIFwibWVkaXVtcHVycGxlXCI6IFwiIzkzNzBkYlwiLFxuICBcIm1lZGl1bXNlYWdyZWVuXCI6IFwiIzNjYjM3MVwiLFxuICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBcIiM3YjY4ZWVcIixcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIiMwMGZhOWFcIixcbiAgXCJtZWRpdW10dXJxdW9pc2VcIjogXCIjNDhkMWNjXCIsXG4gIFwibWVkaXVtdmlvbGV0cmVkXCI6IFwiI2M3MTU4NVwiLFxuICBcIm1pZG5pZ2h0Ymx1ZVwiOiBcIiMxOTE5NzBcIixcbiAgXCJtaW50Y3JlYW1cIjogXCIjZjVmZmZhXCIsXG4gIFwibWlzdHlyb3NlXCI6IFwiI2ZmZTRlMVwiLFxuICBcIm1vY2Nhc2luXCI6IFwiI2ZmZTRiNVwiLFxuICBcIm5hdmFqb3doaXRlXCI6IFwiI2ZmZGVhZFwiLFxuICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICBcIm9yYW5nZXJlZFwiOiBcIiNmZjQ1MDBcIixcbiAgXCJvcmNoaWRcIjogXCIjZGE3MGQ2XCIsXG4gIFwicGFsZWdvbGRlbnJvZFwiOiBcIiNlZWU4YWFcIixcbiAgXCJwYWxlZ3JlZW5cIjogXCIjOThmYjk4XCIsXG4gIFwicGFsZXR1cnF1b2lzZVwiOiBcIiNhZmVlZWVcIixcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFwiI2RiNzA5M1wiLFxuICBcInBhcGF5YXdoaXBcIjogXCIjZmZlZmQ1XCIsXG4gIFwicGVhY2hwdWZmXCI6IFwiI2ZmZGFiOVwiLFxuICBcInBlcnVcIjogXCIjY2Q4NTNmXCIsXG4gIFwicGlua1wiOiBcIiNmZmMwY2JcIixcbiAgXCJwbHVtXCI6IFwiI2RkYTBkZFwiLFxuICBcInBvd2RlcmJsdWVcIjogXCIjYjBlMGU2XCIsXG4gIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gIFwic2t5Ymx1ZVwiOiBcIiM4N2NlZWJcIixcbiAgXCJzbGF0ZWJsdWVcIjogXCIjNmE1YWNkXCIsXG4gIFwic2xhdGVncmF5XCI6IFwiIzcwODA5MFwiLFxuICBcInNsYXRlZ3JleVwiOiBcIiM3MDgwOTBcIixcbiAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gIFwidGhpc3RsZVwiOiBcIiNkOGJmZDhcIixcbiAgXCJ0b21hdG9cIjogXCIjZmY2MzQ3XCIsXG4gIFwidHVycXVvaXNlXCI6IFwiIzQwZTBkMFwiLFxuICBcInZpb2xldFwiOiBcIiNlZTgyZWVcIixcbiAgXCJ3aGVhdFwiOiBcIiNmNWRlYjNcIixcbiAgXCJ3aGl0ZXNtb2tlXCI6IFwiI2Y1ZjVmNVwiLFxuICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICBcInJlYmVjY2FwdXJwbGVcIjogXCIjNjYzMzk5XCJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29sb3JzLmpzb24nKVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBfaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7XG5cbi8qKlxuICogQ2FtZWxjYXNlcyBhIGh5cGhlbmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gY2FtZWxpemUoJ2JhY2tncm91bmQtY29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZENvbG9yXCJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX2h5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhbWVsaXplID0gcmVxdWlyZSgnLi9jYW1lbGl6ZScpO1xuXG52YXIgbXNQYXR0ZXJuID0gL14tbXMtLztcblxuLyoqXG4gKiBDYW1lbGNhc2VzIGEgaHlwaGVuYXRlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmRDb2xvclwiXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1tb3otdHJhbnNpdGlvbicpXG4gKiAgIDwgXCJNb3pUcmFuc2l0aW9uXCJcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnLW1zLXRyYW5zaXRpb24nKVxuICogICA8IFwibXNUcmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gKiAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGNhbWVsaXplKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZVN0eWxlTmFtZTsiLCJ2YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgd2FsayA9IHJlcXVpcmUoJy4vd2FsaycpO1xudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG5cbmZ1bmN0aW9uIFZhbHVlUGFyc2VyKHZhbHVlKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBWYWx1ZVBhcnNlcikge1xuICAgICAgICB0aGlzLm5vZGVzID0gcGFyc2UodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWYWx1ZVBhcnNlcih2YWx1ZSk7XG59XG5cblZhbHVlUGFyc2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLm5vZGVzKSA/IHN0cmluZ2lmeSh0aGlzLm5vZGVzKSA6ICcnO1xufTtcblxuVmFsdWVQYXJzZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiAoY2IsIGJ1YmJsZSkge1xuICAgIHdhbGsodGhpcy5ub2RlcywgY2IsIGJ1YmJsZSk7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5WYWx1ZVBhcnNlci51bml0ID0gcmVxdWlyZSgnLi91bml0Jyk7XG5cblZhbHVlUGFyc2VyLndhbGsgPSB3YWxrO1xuXG5WYWx1ZVBhcnNlci5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmFsdWVQYXJzZXI7XG4iLCJ2YXIgb3BlblBhcmVudGhlc2VzID0gJygnLmNoYXJDb2RlQXQoMCk7XG52YXIgY2xvc2VQYXJlbnRoZXNlcyA9ICcpJy5jaGFyQ29kZUF0KDApO1xudmFyIHNpbmdsZVF1b3RlID0gJ1xcJycuY2hhckNvZGVBdCgwKTtcbnZhciBkb3VibGVRdW90ZSA9ICdcIicuY2hhckNvZGVBdCgwKTtcbnZhciBiYWNrc2xhc2ggPSAnXFxcXCcuY2hhckNvZGVBdCgwKTtcbnZhciBzbGFzaCA9ICcvJy5jaGFyQ29kZUF0KDApO1xudmFyIGNvbW1hID0gJywnLmNoYXJDb2RlQXQoMCk7XG52YXIgY29sb24gPSAnOicuY2hhckNvZGVBdCgwKTtcbnZhciBzdGFyID0gJyonLmNoYXJDb2RlQXQoMCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHRva2VucyA9IFtdO1xuICAgIHZhciB2YWx1ZSA9IGlucHV0O1xuXG4gICAgdmFyIG5leHQsIHF1b3RlLCBwcmV2LCB0b2tlbiwgZXNjYXBlLCBlc2NhcGVQb3MsIHdoaXRlc3BhY2VQb3M7XG4gICAgdmFyIHBvcyA9IDA7XG4gICAgdmFyIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KHBvcyk7XG4gICAgdmFyIG1heCA9IHZhbHVlLmxlbmd0aDtcbiAgICB2YXIgc3RhY2sgPSBbeyBub2RlczogdG9rZW5zIH1dO1xuICAgIHZhciBiYWxhbmNlZCA9IDA7XG4gICAgdmFyIHBhcmVudDtcblxuICAgIHZhciBuYW1lID0gJyc7XG4gICAgdmFyIGJlZm9yZSA9ICcnO1xuICAgIHZhciBhZnRlciA9ICcnO1xuXG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICAvLyBXaGl0ZXNwYWNlc1xuICAgICAgICBpZiAoY29kZSA8PSAzMikge1xuICAgICAgICAgICAgbmV4dCA9IHBvcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICAgICAgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQobmV4dCk7XG4gICAgICAgICAgICB9IHdoaWxlIChjb2RlIDw9IDMyKTtcbiAgICAgICAgICAgIHRva2VuID0gdmFsdWUuc2xpY2UocG9zLCBuZXh0KTtcblxuICAgICAgICAgICAgcHJldiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gY2xvc2VQYXJlbnRoZXNlcyAmJiBiYWxhbmNlZCkge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAnZGl2Jykge1xuICAgICAgICAgICAgICAgIHByZXYuYWZ0ZXIgPSB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gY29tbWEgfHwgY29kZSA9PT0gY29sb24gfHwgY29kZSA9PT0gc2xhc2ggJiYgdmFsdWUuY2hhckNvZGVBdChuZXh0ICsgMSkgIT09IHN0YXIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3BhY2UnLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdG9rZW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9zID0gbmV4dDtcblxuICAgICAgICAvLyBRdW90ZXNcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBzaW5nbGVRdW90ZSB8fCBjb2RlID09PSBkb3VibGVRdW90ZSkge1xuICAgICAgICAgICAgbmV4dCA9IHBvcztcbiAgICAgICAgICAgIHF1b3RlID0gY29kZSA9PT0gc2luZ2xlUXVvdGUgPyAnXFwnJyA6ICdcIic7XG4gICAgICAgICAgICB0b2tlbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgIHF1b3RlOiBxdW90ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBlc2NhcGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUuaW5kZXhPZihxdW90ZSwgbmV4dCArIDEpO1xuICAgICAgICAgICAgICAgIGlmICh+bmV4dCkge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdWUuY2hhckNvZGVBdChlc2NhcGVQb3MgLSAxKSA9PT0gYmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9ICFlc2NhcGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBxdW90ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHZhbHVlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLnVuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChlc2NhcGUpO1xuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB2YWx1ZS5zbGljZShwb3MgKyAxLCBuZXh0KTtcblxuICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgcG9zID0gbmV4dCArIDE7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIC8vIENvbW1lbnRzXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gc2xhc2ggJiYgdmFsdWUuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gc3Rhcikge1xuICAgICAgICAgICAgdG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvbW1lbnQnLFxuICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4OiBwb3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIG5leHQgPSB2YWx1ZS5pbmRleE9mKCcqLycsIHBvcyk7XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0b2tlbi51bmNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9rZW4udmFsdWUgPSB2YWx1ZS5zbGljZShwb3MgKyAyLCBuZXh0KTtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcblxuICAgICAgICAgICAgcG9zID0gbmV4dCArIDI7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIC8vIERpdmlkZXJzXG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gc2xhc2ggfHwgY29kZSA9PT0gY29tbWEgfHwgY29kZSA9PT0gY29sb24pIHtcbiAgICAgICAgICAgIHRva2VuID0gdmFsdWVbcG9zXTtcblxuICAgICAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkaXYnLFxuICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4OiBwb3MgLSBiZWZvcmUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b2tlbixcbiAgICAgICAgICAgICAgICBiZWZvcmU6IGJlZm9yZSxcbiAgICAgICAgICAgICAgICBhZnRlcjogJydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmVmb3JlID0gJyc7XG5cbiAgICAgICAgICAgIHBvcyArPSAxO1xuICAgICAgICAgICAgY29kZSA9IHZhbHVlLmNoYXJDb2RlQXQocG9zKTtcblxuICAgICAgICAvLyBPcGVuIHBhcmVudGhlc2VzXG4gICAgICAgIH0gZWxzZSBpZiAob3BlblBhcmVudGhlc2VzID09PSBjb2RlKSB7XG4gICAgICAgICAgICAvLyBXaGl0ZXNwYWNlcyBhZnRlciBvcGVuIHBhcmVudGhlc2VzXG4gICAgICAgICAgICBuZXh0ID0gcG9zO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUgPD0gMzIpO1xuICAgICAgICAgICAgdG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zIC0gbmFtZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgYmVmb3JlOiB2YWx1ZS5zbGljZShwb3MgKyAxLCBuZXh0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBvcyA9IG5leHQ7XG5cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAndXJsJyAmJiBjb2RlICE9PSBzaW5nbGVRdW90ZSAmJiBjb2RlICE9PSBkb3VibGVRdW90ZSkge1xuICAgICAgICAgICAgICAgIG5leHQgLT0gMTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUuaW5kZXhPZignKScsIG5leHQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKH5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlLmNoYXJDb2RlQXQoZXNjYXBlUG9zIC0gMSkgPT09IGJhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVBvcyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSA9ICFlc2NhcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAnKSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdmFsdWUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnVuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVzY2FwZSk7XG4gICAgICAgICAgICAgICAgLy8gV2hpdGVzcGFjZXMgYmVmb3JlIGNsb3NlZFxuICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VQb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZVBvcyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdCh3aGl0ZXNwYWNlUG9zKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlIDw9IDMyKTtcbiAgICAgICAgICAgICAgICBpZiAocG9zICE9PSB3aGl0ZXNwYWNlUG9zICsgMSkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5ub2RlcyA9IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29yZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogcG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnNsaWNlKHBvcywgd2hpdGVzcGFjZVBvcyArIDEpXG4gICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLm5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b2tlbi51bmNsb3NlZCAmJiB3aGl0ZXNwYWNlUG9zICsgMSAhPT0gbmV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5hZnRlciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5ub2Rlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbmRleDogd2hpdGVzcGFjZVBvcyArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUuc2xpY2Uod2hpdGVzcGFjZVBvcyArIDEsIG5leHQpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmFmdGVyID0gdmFsdWUuc2xpY2Uod2hpdGVzcGFjZVBvcyArIDEsIG5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBuZXh0ICsgMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmFsYW5jZWQgKz0gMTtcbiAgICAgICAgICAgICAgICB0b2tlbi5hZnRlciA9ICcnO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMgPSB0b2tlbi5ub2RlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9ICcnO1xuXG4gICAgICAgIC8vIENsb3NlIHBhcmVudGhlc2VzXG4gICAgICAgIH0gZWxzZSBpZiAoY2xvc2VQYXJlbnRoZXNlcyA9PT0gY29kZSAmJiBiYWxhbmNlZCkge1xuICAgICAgICAgICAgcG9zICs9IDE7XG4gICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgICAgICBwYXJlbnQuYWZ0ZXIgPSBhZnRlcjtcbiAgICAgICAgICAgIGFmdGVyID0gJyc7XG4gICAgICAgICAgICBiYWxhbmNlZCAtPSAxO1xuICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBwYXJlbnQgPSBzdGFja1tiYWxhbmNlZF07XG4gICAgICAgICAgICB0b2tlbnMgPSBwYXJlbnQubm9kZXM7XG5cbiAgICAgICAgLy8gV29yZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgPSBwb3M7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IGJhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgKz0gMTtcbiAgICAgICAgICAgICAgICBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5leHQgPCBtYXggJiYgIShcbiAgICAgICAgICAgICAgICBjb2RlIDw9IDMyIHx8XG4gICAgICAgICAgICAgICAgY29kZSA9PT0gc2luZ2xlUXVvdGUgfHxcbiAgICAgICAgICAgICAgICBjb2RlID09PSBkb3VibGVRdW90ZSB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IGNvbW1hIHx8XG4gICAgICAgICAgICAgICAgY29kZSA9PT0gY29sb24gfHxcbiAgICAgICAgICAgICAgICBjb2RlID09PSBzbGFzaCB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IG9wZW5QYXJlbnRoZXNlcyB8fFxuICAgICAgICAgICAgICAgIGNvZGUgPT09IGNsb3NlUGFyZW50aGVzZXMgJiYgYmFsYW5jZWRcbiAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgdG9rZW4gPSB2YWx1ZS5zbGljZShwb3MsIG5leHQpO1xuXG4gICAgICAgICAgICBpZiAob3BlblBhcmVudGhlc2VzID09PSBjb2RlKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXg6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcyA9IG5leHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHBvcyA9IHN0YWNrLmxlbmd0aCAtIDE7IHBvczsgcG9zIC09IDEpIHtcbiAgICAgICAgc3RhY2tbcG9zXS51bmNsb3NlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrWzBdLm5vZGVzO1xufTtcbiIsImZ1bmN0aW9uIHN0cmluZ2lmeU5vZGUobm9kZSwgY3VzdG9tKSB7XHJcbiAgICB2YXIgdHlwZSA9IG5vZGUudHlwZTtcclxuICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XHJcbiAgICB2YXIgYnVmO1xyXG4gICAgdmFyIGN1c3RvbVJlc3VsdDtcclxuXHJcbiAgICBpZiAoY3VzdG9tICYmIChjdXN0b21SZXN1bHQgPSBjdXN0b20obm9kZSkpICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gY3VzdG9tUmVzdWx0O1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnd29yZCcgfHwgdHlwZSA9PT0gJ3NwYWNlJykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBidWYgPSBub2RlLnF1b3RlIHx8ICcnO1xyXG4gICAgICAgIHJldHVybiBidWYgKyB2YWx1ZSArIChub2RlLnVuY2xvc2VkID8gJycgOiBidWYpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29tbWVudCcpIHtcclxuICAgICAgICByZXR1cm4gJy8qJyArIHZhbHVlICsgKG5vZGUudW5jbG9zZWQgPyAnJyA6ICcqLycpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGl2Jykge1xyXG4gICAgICAgIHJldHVybiAobm9kZS5iZWZvcmUgfHwgJycpICsgdmFsdWUgKyAobm9kZS5hZnRlciB8fCAnJyk7XHJcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5ub2RlcykpIHtcclxuICAgICAgICBidWYgPSBzdHJpbmdpZnkobm9kZS5ub2Rlcyk7XHJcbiAgICAgICAgaWYgKHR5cGUgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJ1ZjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlICsgJygnICsgKG5vZGUuYmVmb3JlIHx8ICcnKSArIGJ1ZiArIChub2RlLmFmdGVyIHx8ICcnKSArIChub2RlLnVuY2xvc2VkID8gJycgOiAnKScpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdpZnkobm9kZXMsIGN1c3RvbSkge1xyXG4gICAgdmFyIHJlc3VsdCwgaTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpIHtcclxuICAgICAgICByZXN1bHQgPSAnJztcclxuICAgICAgICBmb3IgKGkgPSBub2Rlcy5sZW5ndGggLSAxOyB+aTsgaSAtPSAxKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHN0cmluZ2lmeU5vZGUobm9kZXNbaV0sIGN1c3RvbSkgKyByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyaW5naWZ5Tm9kZShub2RlcywgY3VzdG9tKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdpZnk7XHJcbiIsInZhciBtaW51cyA9ICctJy5jaGFyQ29kZUF0KDApO1xudmFyIHBsdXMgID0gJysnLmNoYXJDb2RlQXQoMCk7XG52YXIgZG90ICAgPSAnLicuY2hhckNvZGVBdCgwKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgcG9zID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgIHZhciBkb3R0ZWQgPSBmYWxzZTtcbiAgICB2YXIgY29udGFpbnNOdW1iZXIgPSBmYWxzZTtcbiAgICB2YXIgY29kZTtcbiAgICB2YXIgbnVtYmVyID0gJyc7XG5cbiAgICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7XG4gICAgICAgIGNvZGUgPSB2YWx1ZS5jaGFyQ29kZUF0KHBvcyk7XG5cbiAgICAgICAgaWYgKGNvZGUgPj0gNDggJiYgY29kZSA8PSA1Nykge1xuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgICAgICBjb250YWluc051bWJlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gZG90KSB7XG4gICAgICAgICAgICBpZiAoZG90dGVkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3R0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gcGx1cyB8fCBjb2RlID09PSBtaW51cykge1xuICAgICAgICAgICAgaWYgKHBvcyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtYmVyICs9IHZhbHVlW3Bvc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluc051bWJlciA/IHtcbiAgICAgICAgbnVtYmVyOiBudW1iZXIsXG4gICAgICAgIHVuaXQ6IHZhbHVlLnNsaWNlKHBvcylcbiAgICB9IDogZmFsc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB3YWxrKG5vZGVzLCBjYiwgYnViYmxlKSB7XHJcbiAgICB2YXIgaSwgbWF4LCBub2RlLCByZXN1bHQ7XHJcblxyXG4gICAgZm9yIChpID0gMCwgbWF4ID0gbm9kZXMubGVuZ3RoOyBpIDwgbWF4OyBpICs9IDEpIHtcclxuICAgICAgICBub2RlID0gbm9kZXNbaV07XHJcbiAgICAgICAgaWYgKCFidWJibGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gY2Iobm9kZSwgaSwgbm9kZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgbm9kZS50eXBlID09PSAnZnVuY3Rpb24nICYmIEFycmF5LmlzQXJyYXkobm9kZS5ub2RlcykpIHtcclxuICAgICAgICAgICAgd2Fsayhub2RlLm5vZGVzLCBjYiwgYnViYmxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidWJibGUpIHtcclxuICAgICAgICAgICAgY2Iobm9kZSwgaSwgbm9kZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xudmFyIHBhcnNlID0gcmVxdWlyZSgncG9zdGNzcy12YWx1ZS1wYXJzZXInKTtcbnZhciBjYW1lbGl6ZVN0eWxlTmFtZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NhbWVsaXplU3R5bGVOYW1lJyk7XG52YXIgdHJhbnNmb3JtcyA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtcycpO1xudmFyIFRva2VuU3RyZWFtID0gcmVxdWlyZSgnLi9Ub2tlblN0cmVhbScpO1xuXG4vLyBOb3RlIGlmIHRoaXMgaXMgd3JvbmcsIHlvdSdsbCBuZWVkIHRvIGNoYW5nZSB0b2tlblR5cGVzLmpzIHRvb1xudmFyIG51bWJlck9yTGVuZ3RoUmUgPSAvXihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbRWVdWystXT9cXGQrKT8pKD86cHgpPyQvaTtcbnZhciBib29sUmUgPSAvXnRydWV8ZmFsc2UkL2k7XG5cbi8vIFVuZG9jdW1lbnRlZCBleHBvcnRcbnZhciB0cmFuc2Zvcm1SYXdWYWx1ZSA9IGV4cG9ydHMudHJhbnNmb3JtUmF3VmFsdWUgPSBmdW5jdGlvbiB0cmFuc2Zvcm1SYXdWYWx1ZShpbnB1dCkge1xuICB2YXIgdmFsdWUgPSBpbnB1dC50cmltKCk7XG5cbiAgdmFyIG51bWJlck1hdGNoID0gdmFsdWUubWF0Y2gobnVtYmVyT3JMZW5ndGhSZSk7XG4gIGlmIChudW1iZXJNYXRjaCAhPT0gbnVsbCkgcmV0dXJuIE51bWJlcihudW1iZXJNYXRjaFsxXSk7XG5cbiAgdmFyIGJvb2xNYXRjaCA9IGlucHV0Lm1hdGNoKGJvb2xSZSk7XG4gIGlmIChib29sTWF0Y2ggIT09IG51bGwpIHJldHVybiBib29sTWF0Y2hbMF0udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbnZhciBiYXNlVHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUgPSBmdW5jdGlvbiBiYXNlVHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUocHJvcE5hbWUsIGlucHV0VmFsdWUpIHtcbiAgdmFyIGFzdCA9IHBhcnNlKGlucHV0VmFsdWUudHJpbSgpKTtcbiAgdmFyIHRva2VuU3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKGFzdC5ub2Rlcyk7XG4gIHJldHVybiB0cmFuc2Zvcm1zW3Byb3BOYW1lXSh0b2tlblN0cmVhbSk7XG59O1xuXG52YXIgdHJhbnNmb3JtU2hvcnRoYW5kVmFsdWUgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gYmFzZVRyYW5zZm9ybVNob3J0aGFuZFZhbHVlIDogZnVuY3Rpb24gKHByb3BOYW1lLCBpbnB1dFZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhc2VUcmFuc2Zvcm1TaG9ydGhhbmRWYWx1ZShwcm9wTmFtZSwgaW5wdXRWYWx1ZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBkZWNsYXJhdGlvbiBcIicgKyBwcm9wTmFtZSArICc6ICcgKyBpbnB1dFZhbHVlICsgJ1wiJyk7XG4gIH1cbn07XG5cbnZhciBnZXRTdHlsZXNGb3JQcm9wZXJ0eSA9IGV4cG9ydHMuZ2V0U3R5bGVzRm9yUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRTdHlsZXNGb3JQcm9wZXJ0eShwcm9wTmFtZSwgaW5wdXRWYWx1ZSwgYWxsb3dTaG9ydGhhbmQpIHtcbiAgdmFyIGlzUmF3VmFsdWUgPSBhbGxvd1Nob3J0aGFuZCA9PT0gZmFsc2UgfHwgIShwcm9wTmFtZSBpbiB0cmFuc2Zvcm1zKTtcbiAgdmFyIHByb3BWYWx1ZSA9IGlzUmF3VmFsdWUgPyB0cmFuc2Zvcm1SYXdWYWx1ZShpbnB1dFZhbHVlKSA6IHRyYW5zZm9ybVNob3J0aGFuZFZhbHVlKHByb3BOYW1lLCBpbnB1dFZhbHVlLnRyaW0oKSk7XG5cbiAgcmV0dXJuIHByb3BWYWx1ZSAmJiBwcm9wVmFsdWUuJG1lcmdlID8gcHJvcFZhbHVlLiRtZXJnZSA6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgcHJvcE5hbWUsIHByb3BWYWx1ZSk7XG59O1xuXG52YXIgZ2V0UHJvcGVydHlOYW1lID0gZXhwb3J0cy5nZXRQcm9wZXJ0eU5hbWUgPSBjYW1lbGl6ZVN0eWxlTmFtZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJ1bGVzKSB7XG4gIHZhciBzaG9ydGhhbmRCbGFja2xpc3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdO1xuICByZXR1cm4gcnVsZXMucmVkdWNlKGZ1bmN0aW9uIChhY2N1bSwgcnVsZSkge1xuICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUocnVsZVswXSk7XG4gICAgdmFyIHZhbHVlID0gcnVsZVsxXTtcbiAgICB2YXIgYWxsb3dTaG9ydGhhbmQgPSBzaG9ydGhhbmRCbGFja2xpc3QuaW5kZXhPZihwcm9wZXJ0eU5hbWUpID09PSAtMTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2N1bSwgZ2V0U3R5bGVzRm9yUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSwgYWxsb3dTaG9ydGhhbmQpKTtcbiAgfSwge30pO1xufTsiXX0=
const css2rn = require('css-to-react-native');
const input = document.getElementById('code');
const result = document.getElementById('result');
const strrf = str => str.trim().replace(/^"/, "'").replace(/",?$/, "'");
const btn = document.querySelector('#go');
btn.addEventListener('click', () => {
const rules = input.value.replace(/\/\*(.|\n)*?\*\//, '').split(';').map(item => item.split(':').map(x => String(x).trim())).filter(x => x && x[0] !== '');
const output = JSON.stringify(css2rn.default(rules), null, 2);
const ok = output.replace(/ \"(.*)\":(.*)\n/g, (n, a, b) => { return ` ${a}: ${strrf(b)},\n`; }).replace(/,,/g, ',');
result.value = ok.substr(1, ok.length - 2).trim().replace(/\n\s+/g, '\n');
});
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"css-to-react-native": "2.0.4"
}
}
<!-- contents of this file will be placed inside the <body> -->
<label>CSS</label><br />
<textarea id="code" style="width: 500px" rows=12>
font-size: 12px;
color: red;
</textarea><br />
<button id="go">Parse</button><br /><br />
<textarea id="result" style="width: 500px" rows=12></textarea>
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment