1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | var _exportNames = {
|
7 | invertBase16Theme: true,
|
8 | createStyling: true,
|
9 | getBase16Theme: true,
|
10 | invertTheme: true,
|
11 | Base16Theme: true
|
12 | };
|
13 | Object.defineProperty(exports, "Base16Theme", {
|
14 | enumerable: true,
|
15 | get: function get() {
|
16 | return base16.Base16Theme;
|
17 | }
|
18 | });
|
19 | exports.invertTheme = exports.getBase16Theme = exports.createStyling = exports.invertBase16Theme = void 0;
|
20 |
|
21 | var base16 = _interopRequireWildcard(require("base16"));
|
22 |
|
23 | var _color = _interopRequireDefault(require("color"));
|
24 |
|
25 | var _lodash = _interopRequireDefault(require("lodash.curry"));
|
26 |
|
27 | var _colorConverters = require("./colorConverters");
|
28 |
|
29 | var _types = require("./types");
|
30 |
|
31 | Object.keys(_types).forEach(function (key) {
|
32 | if (key === "default" || key === "__esModule") return;
|
33 | if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
34 | Object.defineProperty(exports, key, {
|
35 | enumerable: true,
|
36 | get: function get() {
|
37 | return _types[key];
|
38 | }
|
39 | });
|
40 | });
|
41 |
|
42 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
43 |
|
44 | function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
45 |
|
46 | function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
47 |
|
48 | function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
49 |
|
50 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
51 |
|
52 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
53 |
|
54 | 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; }
|
55 |
|
56 | function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
57 |
|
58 | function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
59 |
|
60 | function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
61 |
|
62 | function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
63 |
|
64 | function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
65 |
|
66 | function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
67 |
|
68 | var DEFAULT_BASE16 = base16["default"];
|
69 | var BASE16_KEYS = Object.keys(DEFAULT_BASE16); // we need a correcting factor, so that a dark, but not black background color
|
70 | // converts to bright enough inversed color
|
71 |
|
72 | var flip = function flip(x) {
|
73 | return x < 0.25 ? 1 : x < 0.5 ? 0.9 - x : 1.1 - x;
|
74 | };
|
75 |
|
76 | var invertColor = function invertColor(hexString) {
|
77 | var color = (0, _color["default"])(hexString);
|
78 |
|
79 | var _rgb2yuv = (0, _colorConverters.rgb2yuv)(color.array()),
|
80 | _rgb2yuv2 = _slicedToArray(_rgb2yuv, 3),
|
81 | y = _rgb2yuv2[0],
|
82 | u = _rgb2yuv2[1],
|
83 | v = _rgb2yuv2[2];
|
84 |
|
85 | var flippedYuv = [flip(y), u, v];
|
86 | var rgb = (0, _colorConverters.yuv2rgb)(flippedYuv);
|
87 | return _color["default"].rgb(rgb).hex();
|
88 | };
|
89 |
|
90 | var merger = function merger(styling) {
|
91 | return function (prevStyling) {
|
92 | return {
|
93 | className: [prevStyling.className, styling.className].filter(Boolean).join(' '),
|
94 | style: _objectSpread(_objectSpread({}, prevStyling.style || {}), styling.style || {})
|
95 | };
|
96 | };
|
97 | };
|
98 |
|
99 | var mergeStyling = function mergeStyling(customStyling, defaultStyling) {
|
100 | if (customStyling === undefined) {
|
101 | return defaultStyling;
|
102 | }
|
103 |
|
104 | if (defaultStyling === undefined) {
|
105 | return customStyling;
|
106 | }
|
107 |
|
108 | var customType = _typeof(customStyling);
|
109 |
|
110 | var defaultType = _typeof(defaultStyling);
|
111 |
|
112 | switch (customType) {
|
113 | case 'string':
|
114 | switch (defaultType) {
|
115 | case 'string':
|
116 | return [defaultStyling, customStyling].filter(Boolean).join(' ');
|
117 |
|
118 | case 'object':
|
119 | return merger({
|
120 | className: customStyling,
|
121 | style: defaultStyling
|
122 | });
|
123 |
|
124 | case 'function':
|
125 | return function (styling) {
|
126 | for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
127 | args[_key - 1] = arguments[_key];
|
128 | }
|
129 |
|
130 | return merger({
|
131 | className: customStyling
|
132 | })(defaultStyling.apply(void 0, [styling].concat(args)));
|
133 | };
|
134 | }
|
135 |
|
136 | break;
|
137 |
|
138 | case 'object':
|
139 | switch (defaultType) {
|
140 | case 'string':
|
141 | return merger({
|
142 | className: defaultStyling,
|
143 | style: customStyling
|
144 | });
|
145 |
|
146 | case 'object':
|
147 | return _objectSpread(_objectSpread({}, defaultStyling), customStyling);
|
148 |
|
149 | case 'function':
|
150 | return function (styling) {
|
151 | for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
152 | args[_key2 - 1] = arguments[_key2];
|
153 | }
|
154 |
|
155 | return merger({
|
156 | style: customStyling
|
157 | })(defaultStyling.apply(void 0, [styling].concat(args)));
|
158 | };
|
159 | }
|
160 |
|
161 | break;
|
162 |
|
163 | case 'function':
|
164 | switch (defaultType) {
|
165 | case 'string':
|
166 | return function (styling) {
|
167 | for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
168 | args[_key3 - 1] = arguments[_key3];
|
169 | }
|
170 |
|
171 | return customStyling.apply(void 0, [merger(styling)({
|
172 | className: defaultStyling
|
173 | })].concat(args));
|
174 | };
|
175 |
|
176 | case 'object':
|
177 | return function (styling) {
|
178 | for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
179 | args[_key4 - 1] = arguments[_key4];
|
180 | }
|
181 |
|
182 | return customStyling.apply(void 0, [merger(styling)({
|
183 | style: defaultStyling
|
184 | })].concat(args));
|
185 | };
|
186 |
|
187 | case 'function':
|
188 | return function (styling) {
|
189 | for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
|
190 | args[_key5 - 1] = arguments[_key5];
|
191 | }
|
192 |
|
193 | return customStyling.apply(void 0, [defaultStyling.apply(void 0, [styling].concat(args))].concat(args));
|
194 | };
|
195 | }
|
196 |
|
197 | }
|
198 | };
|
199 |
|
200 | var mergeStylings = function mergeStylings(customStylings, defaultStylings) {
|
201 | var keys = Object.keys(defaultStylings);
|
202 |
|
203 | for (var key in customStylings) {
|
204 | if (keys.indexOf(key) === -1) keys.push(key);
|
205 | }
|
206 |
|
207 | return keys.reduce(function (mergedStyling, key) {
|
208 | return mergedStyling[key] = mergeStyling(customStylings[key], defaultStylings[key]), mergedStyling;
|
209 | }, {});
|
210 | };
|
211 |
|
212 | var getStylingByKeys = function getStylingByKeys(mergedStyling, keys) {
|
213 | for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
|
214 | args[_key6 - 2] = arguments[_key6];
|
215 | }
|
216 |
|
217 | if (keys === null) {
|
218 | return mergedStyling;
|
219 | }
|
220 |
|
221 | if (!Array.isArray(keys)) {
|
222 | keys = [keys];
|
223 | }
|
224 |
|
225 | var styles = keys.map(function (key) {
|
226 | return mergedStyling[key];
|
227 | }).filter(Boolean);
|
228 | var props = styles.reduce(function (obj, s) {
|
229 | if (typeof s === 'string') {
|
230 | obj.className = [obj.className, s].filter(Boolean).join(' ');
|
231 | } else if (_typeof(s) === 'object') {
|
232 | obj.style = _objectSpread(_objectSpread({}, obj.style), s);
|
233 | } else if (typeof s === 'function') {
|
234 | obj = _objectSpread(_objectSpread({}, obj), s.apply(void 0, [obj].concat(args)));
|
235 | }
|
236 |
|
237 | return obj;
|
238 | }, {
|
239 | className: '',
|
240 | style: {}
|
241 | });
|
242 |
|
243 | if (!props.className) {
|
244 | delete props.className;
|
245 | }
|
246 |
|
247 | if (Object.keys(props.style).length === 0) {
|
248 | delete props.style;
|
249 | }
|
250 |
|
251 | return props;
|
252 | };
|
253 |
|
254 | var invertBase16Theme = function invertBase16Theme(base16Theme) {
|
255 | return Object.keys(base16Theme).reduce(function (t, key) {
|
256 | return t[key] = /^base/.test(key) ? invertColor(base16Theme[key]) : key === 'scheme' ? base16Theme[key] + ':inverted' : base16Theme[key], t;
|
257 | }, {});
|
258 | };
|
259 |
|
260 | exports.invertBase16Theme = invertBase16Theme;
|
261 | var createStyling = (0, _lodash["default"])(function (getStylingFromBase16) {
|
262 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
263 | var themeOrStyling = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
264 | var _options$defaultBase = options.defaultBase16,
|
265 | defaultBase16 = _options$defaultBase === void 0 ? DEFAULT_BASE16 : _options$defaultBase,
|
266 | _options$base16Themes = options.base16Themes,
|
267 | base16Themes = _options$base16Themes === void 0 ? null : _options$base16Themes;
|
268 | var base16Theme = getBase16Theme(themeOrStyling, base16Themes);
|
269 |
|
270 | if (base16Theme) {
|
271 | themeOrStyling = _objectSpread(_objectSpread({}, base16Theme), themeOrStyling);
|
272 | }
|
273 |
|
274 | var theme = BASE16_KEYS.reduce(function (t, key) {
|
275 | return t[key] = themeOrStyling[key] || defaultBase16[key], t;
|
276 | }, {});
|
277 | var customStyling = Object.keys(themeOrStyling).reduce(function (s, key) {
|
278 | return BASE16_KEYS.indexOf(key) === -1 ? (s[key] = themeOrStyling[key], s) : s;
|
279 | }, {});
|
280 | var defaultStyling = getStylingFromBase16(theme);
|
281 | var mergedStyling = mergeStylings(customStyling, defaultStyling);
|
282 |
|
283 | for (var _len7 = arguments.length, args = new Array(_len7 > 3 ? _len7 - 3 : 0), _key7 = 3; _key7 < _len7; _key7++) {
|
284 | args[_key7 - 3] = arguments[_key7];
|
285 | }
|
286 |
|
287 | return (0, _lodash["default"])(getStylingByKeys, 2).apply(void 0, [mergedStyling].concat(args));
|
288 | }, 3);
|
289 | exports.createStyling = createStyling;
|
290 |
|
291 | var isStylingConfig = function isStylingConfig(theme) {
|
292 | return !!theme.extend;
|
293 | };
|
294 |
|
295 | var getBase16Theme = function getBase16Theme(theme, base16Themes) {
|
296 | if (theme && isStylingConfig(theme) && theme.extend) {
|
297 | theme = theme.extend;
|
298 | }
|
299 |
|
300 | if (typeof theme === 'string') {
|
301 | var _theme$split = theme.split(':'),
|
302 | _theme$split2 = _slicedToArray(_theme$split, 2),
|
303 | _themeName = _theme$split2[0],
|
304 | modifier = _theme$split2[1];
|
305 |
|
306 | if (base16Themes) {
|
307 | theme = base16Themes[_themeName];
|
308 | } else {
|
309 | theme = base16[_themeName];
|
310 | }
|
311 |
|
312 | if (modifier === 'inverted') {
|
313 | theme = invertBase16Theme(theme);
|
314 | }
|
315 | }
|
316 |
|
317 | return theme && Object.prototype.hasOwnProperty.call(theme, 'base00') ? theme : undefined;
|
318 | };
|
319 |
|
320 | exports.getBase16Theme = getBase16Theme;
|
321 |
|
322 | var invertTheme = function invertTheme(theme) {
|
323 | if (typeof theme === 'string') {
|
324 | return "".concat(theme, ":inverted");
|
325 | }
|
326 |
|
327 | if (theme && isStylingConfig(theme) && theme.extend) {
|
328 | if (typeof theme.extend === 'string') {
|
329 | return _objectSpread(_objectSpread({}, theme), {}, {
|
330 | extend: "".concat(theme.extend, ":inverted")
|
331 | });
|
332 | }
|
333 |
|
334 | return _objectSpread(_objectSpread({}, theme), {}, {
|
335 | extend: invertBase16Theme(theme.extend)
|
336 | });
|
337 | }
|
338 |
|
339 | if (theme) {
|
340 | return invertBase16Theme(theme);
|
341 | }
|
342 |
|
343 | return theme;
|
344 | };
|
345 |
|
346 | exports.invertTheme = invertTheme;
|
347 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0JBU0UxNiIsImJhc2UxNiIsIkJBU0UxNl9LRVlTIiwiT2JqZWN0Iiwia2V5cyIsImZsaXAiLCJ4IiwiaW52ZXJ0Q29sb3IiLCJoZXhTdHJpbmciLCJjb2xvciIsImFycmF5IiwieSIsInUiLCJ2IiwiZmxpcHBlZFl1diIsInJnYiIsIkNvbG9yIiwiaGV4IiwibWVyZ2VyIiwic3R5bGluZyIsInByZXZTdHlsaW5nIiwiY2xhc3NOYW1lIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJzdHlsZSIsIm1lcmdlU3R5bGluZyIsImN1c3RvbVN0eWxpbmciLCJkZWZhdWx0U3R5bGluZyIsInVuZGVmaW5lZCIsImN1c3RvbVR5cGUiLCJkZWZhdWx0VHlwZSIsImFyZ3MiLCJtZXJnZVN0eWxpbmdzIiwiY3VzdG9tU3R5bGluZ3MiLCJkZWZhdWx0U3R5bGluZ3MiLCJrZXkiLCJpbmRleE9mIiwicHVzaCIsInJlZHVjZSIsIm1lcmdlZFN0eWxpbmciLCJnZXRTdHlsaW5nQnlLZXlzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3R5bGVzIiwibWFwIiwicHJvcHMiLCJvYmoiLCJzIiwibGVuZ3RoIiwiaW52ZXJ0QmFzZTE2VGhlbWUiLCJiYXNlMTZUaGVtZSIsInQiLCJ0ZXN0IiwiY3JlYXRlU3R5bGluZyIsImdldFN0eWxpbmdGcm9tQmFzZTE2Iiwib3B0aW9ucyIsInRoZW1lT3JTdHlsaW5nIiwiZGVmYXVsdEJhc2UxNiIsImJhc2UxNlRoZW1lcyIsImdldEJhc2UxNlRoZW1lIiwidGhlbWUiLCJpc1N0eWxpbmdDb25maWciLCJleHRlbmQiLCJzcGxpdCIsInRoZW1lTmFtZSIsIm1vZGlmaWVyIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW52ZXJ0VGhlbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBb1NBOztBQUFB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RUFBa0I7QUFDaEJFLE1BQUFBLEtBQUssR0FBR0YsWUFBWSxDQUFDTSxVQUFELENBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xKLE1BQUFBLEtBQUssR0FBRzVELE1BQU0sQ0FBQ2dFLFVBQUQsQ0FBZDtBQUNEOztBQUNELFFBQUlDLFFBQVEsS0FBSyxVQUFqQixFQUE2QjtBQUMzQkwsTUFBQUEsS0FBSyxHQUFHWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF6QjtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0EsS0FBSyxJQUFJMUQsTUFBTSxDQUFDZ0UsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDUixLQUFyQyxFQUE0QyxRQUE1QyxDQUFULEdBQ0ZBLEtBREUsR0FFSGhDLFNBRko7QUFHRCxDQXZCTTs7OztBQXlCQSxJQUFNeUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ1QsS0FBRCxFQUFpRDtBQUMxRSxNQUFJLE9BQU9BLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDN0IscUJBQVVBLEtBQVY7QUFDRDs7QUFFRCxNQUFJQSxLQUFLLElBQUlDLGVBQWUsQ0FBQ0QsS0FBRCxDQUF4QixJQUFtQ0EsS0FBSyxDQUFDRSxNQUE3QyxFQUFxRDtBQUNuRCxRQUFJLE9BQU9GLEtBQUssQ0FBQ0UsTUFBYixLQUF3QixRQUE1QixFQUFzQztBQUNwQyw2Q0FBWUYsS0FBWjtBQUFtQkUsUUFBQUEsTUFBTSxZQUFLRixLQUFLLENBQUNFLE1BQVg7QUFBekI7QUFDRDs7QUFFRCwyQ0FDS0YsS0FETDtBQUVFRSxNQUFBQSxNQUFNLEVBQUViLGlCQUFpQixDQUFDVyxLQUFLLENBQUNFLE1BQVA7QUFGM0I7QUFJRDs7QUFFRCxNQUFJRixLQUFKLEVBQVc7QUFDVCxXQUFPWCxpQkFBaUIsQ0FBQ1csS0FBRCxDQUF4QjtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRCxDQXJCTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJhc2UxNiBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IHsgQmFzZTE2VGhlbWUgfSBmcm9tICdiYXNlMTYnO1xuaW1wb3J0IENvbG9yIGZyb20gJ2NvbG9yJztcbmltcG9ydCAqIGFzIENTUyBmcm9tICdjc3N0eXBlJztcbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuaW1wb3J0IHsgQ29sb3IgYXMgQ29sb3JUdXBsZSwgeXV2MnJnYiwgcmdiMnl1diB9IGZyb20gJy4vY29sb3JDb252ZXJ0ZXJzJztcbmltcG9ydCB7XG4gIFN0eWxpbmcsXG4gIFN0eWxpbmdDb25maWcsXG4gIFN0eWxpbmdGdW5jdGlvbixcbiAgU3R5bGluZ1ZhbHVlLFxuICBTdHlsaW5nVmFsdWVGdW5jdGlvbixcbiAgVGhlbWUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0UxNiA9IGJhc2UxNi5kZWZhdWx0O1xuXG5jb25zdCBCQVNFMTZfS0VZUyA9IE9iamVjdC5rZXlzKERFRkFVTFRfQkFTRTE2KTtcblxuLy8gd2UgbmVlZCBhIGNvcnJlY3RpbmcgZmFjdG9yLCBzbyB0aGF0IGEgZGFyaywgYnV0IG5vdCBibGFjayBiYWNrZ3JvdW5kIGNvbG9yXG4vLyBjb252ZXJ0cyB0byBicmlnaHQgZW5vdWdoIGludmVyc2VkIGNvbG9yXG5jb25zdCBmbGlwID0gKHg6IG51bWJlcikgPT4gKHggPCAwLjI1ID8gMSA6IHggPCAwLjUgPyAwLjkgLSB4IDogMS4xIC0geCk7XG5cbmNvbnN0IGludmVydENvbG9yID0gKGhleFN0cmluZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNvbG9yID0gQ29sb3IoaGV4U3RyaW5nKTtcbiAgY29uc3QgW3ksIHUsIHZdID0gcmdiMnl1dihjb2xvci5hcnJheSgpIGFzIENvbG9yVHVwbGUpO1xuICBjb25zdCBmbGlwcGVkWXV2OiBDb2xvclR1cGxlID0gW2ZsaXAoeSksIHUsIHZdO1xuICBjb25zdCByZ2IgPSB5dXYycmdiKGZsaXBwZWRZdXYpO1xuICByZXR1cm4gQ29sb3IucmdiKHJnYikuaGV4KCk7XG59O1xuXG5jb25zdCBtZXJnZXIgPSAoc3R5bGluZzogUGFydGlhbDxTdHlsaW5nPikgPT4ge1xuICByZXR1cm4gKHByZXZTdHlsaW5nOiBQYXJ0aWFsPFN0eWxpbmc+KSA9PiAoe1xuICAgIGNsYXNzTmFtZTogW3ByZXZTdHlsaW5nLmNsYXNzTmFtZSwgc3R5bGluZy5jbGFzc05hbWVdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbignICcpLFxuICAgIHN0eWxlOiB7IC4uLihwcmV2U3R5bGluZy5zdHlsZSB8fCB7fSksIC4uLihzdHlsaW5nLnN0eWxlIHx8IHt9KSB9LFxuICB9KTtcbn07XG5cbmNvbnN0IG1lcmdlU3R5bGluZyA9IChcbiAgY3VzdG9tU3R5bGluZzogU3R5bGluZ1ZhbHVlLFxuICBkZWZhdWx0U3R5bGluZzogU3R5bGluZ1ZhbHVlXG4pOiBTdHlsaW5nVmFsdWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoY3VzdG9tU3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHlsaW5nO1xuICB9XG4gIGlmIChkZWZhdWx0U3R5bGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGN1c3RvbVN0eWxpbmc7XG4gIH1cblxuICBjb25zdCBjdXN0b21UeXBlID0gdHlwZW9mIGN1c3RvbVN0eWxpbmc7XG4gIGNvbnN0IGRlZmF1bHRUeXBlID0gdHlwZW9mIGRlZmF1bHRTdHlsaW5nO1xuXG4gIHN3aXRjaCAoY3VzdG9tVHlwZSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBzd2l0Y2ggKGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgcmV0dXJuIFtkZWZhdWx0U3R5bGluZywgY3VzdG9tU3R5bGluZ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICByZXR1cm4gbWVyZ2VyKHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY3VzdG9tU3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZzogU3R5bGluZywgLi4uYXJnczogYW55W10pID0+XG4gICAgICAgICAgICBtZXJnZXIoe1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGN1c3RvbVN0eWxpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgfSkoKGRlZmF1bHRTdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShzdHlsaW5nLCAuLi5hcmdzKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgc3dpdGNoIChkZWZhdWx0VHlwZSkge1xuICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgIHJldHVybiBtZXJnZXIoe1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBzdHlsZTogY3VzdG9tU3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+LFxuICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4oZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiksXG4gICAgICAgICAgICAuLi4oY3VzdG9tU3R5bGluZyBhcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+KSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgcmV0dXJuIChzdHlsaW5nOiBTdHlsaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgICAgIG1lcmdlcih7XG4gICAgICAgICAgICAgIHN0eWxlOiBjdXN0b21TdHlsaW5nIGFzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4sXG4gICAgICAgICAgICB9KSgoZGVmYXVsdFN0eWxpbmcgYXMgU3R5bGluZ1ZhbHVlRnVuY3Rpb24pKHN0eWxpbmcsIC4uLmFyZ3MpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHN3aXRjaCAoZGVmYXVsdFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICByZXR1cm4gKHN0eWxpbmcsIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAoY3VzdG9tU3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgIG1lcmdlcihzdHlsaW5nKSh7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBkZWZhdWx0U3R5bGluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIHJldHVybiAoc3R5bGluZywgLi4uYXJncykgPT5cbiAgICAgICAgICAgIChjdXN0b21TdHlsaW5nIGFzIFN0eWxpbmdWYWx1ZUZ1bmN0aW9uKShcbiAgICAgICAgICAgICAgbWVyZ2VyKHN0eWxpbmcpKHtcbiAgICAgICAgICAgICAgICBzdHlsZTogZGVmYXVsdFN0eWxpbmcgYXMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPixcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gKHN0eWxpbmcsIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAoY3VzdG9tU3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgIChkZWZhdWx0U3R5bGluZyBhcyBTdHlsaW5nVmFsdWVGdW5jdGlvbikoXG4gICAgICAgICAgICAgICAgc3R5bGluZyxcbiAgICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICAgICkgYXMgU3R5bGluZyxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgfVxufTtcblxuY29uc3QgbWVyZ2VTdHlsaW5ncyA9IChcbiAgY3VzdG9tU3R5bGluZ3M6IFN0eWxpbmdDb25maWcsXG4gIGRlZmF1bHRTdHlsaW5nczogU3R5bGluZ0NvbmZpZ1xuKTogU3R5bGluZ0NvbmZpZyA9PiB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0U3R5bGluZ3MpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBjdXN0b21TdHlsaW5ncykge1xuICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIGtleXMucHVzaChrZXkpO1xuICB9XG5cbiAgcmV0dXJuIGtleXMucmVkdWNlKFxuICAgIChtZXJnZWRTdHlsaW5nLCBrZXkpID0+IChcbiAgICAgIChtZXJnZWRTdHlsaW5nW2tleSBhcyBrZXlvZiBTdHlsaW5nQ29uZmlnXSA9IG1lcmdlU3R5bGluZyhcbiAgICAgICAgY3VzdG9tU3R5bGluZ3Nba2V5XSBhcyBTdHlsaW5nVmFsdWUsXG4gICAgICAgIGRlZmF1bHRTdHlsaW5nc1trZXldIGFzIFN0eWxpbmdWYWx1ZVxuICAgICAgKSBhcyBTdHlsaW5nVmFsdWUpLFxuICAgICAgbWVyZ2VkU3R5bGluZ1xuICAgICksXG4gICAge30gYXMgU3R5bGluZ0NvbmZpZ1xuICApO1xufTtcblxuY29uc3QgZ2V0U3R5bGluZ0J5S2V5cyA9IChcbiAgbWVyZ2VkU3R5bGluZzogU3R5bGluZ0NvbmZpZyxcbiAga2V5czogKHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkKSB8IChzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZClbXSxcbiAgLi4uYXJnczogYW55W11cbik6IFN0eWxpbmcgPT4ge1xuICBpZiAoa2V5cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiAobWVyZ2VkU3R5bGluZyBhcyB1bmtub3duKSBhcyBTdHlsaW5nO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAga2V5cyA9IFtrZXlzXTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlcyA9IGtleXNcbiAgICAubWFwKChrZXkpID0+IG1lcmdlZFN0eWxpbmdba2V5IGFzIHN0cmluZ10pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcblxuICBjb25zdCBwcm9wcyA9IHN0eWxlcy5yZWR1Y2UoXG4gICAgKG9iaiwgcykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzID09PSAnc3RyaW5nJykge1xuICAgICAgICBvYmouY2xhc3NOYW1lID0gW29iai5jbGFzc05hbWUsIHNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmouc3R5bGUgPSB7IC4uLm9iai5zdHlsZSwgLi4ucyB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSB7IC4uLm9iaiwgLi4ucyhvYmosIC4uLmFyZ3MpIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICB7IGNsYXNzTmFtZTogJycsIHN0eWxlOiB7fSB9XG4gICk7XG5cbiAgaWYgKCFwcm9wcy5jbGFzc05hbWUpIHtcbiAgICBkZWxldGUgcHJvcHMuY2xhc3NOYW1lO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHByb3BzLnN0eWxlKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgcHJvcHMuc3R5bGU7XG4gIH1cblxuICByZXR1cm4gcHJvcHM7XG59O1xuXG5leHBvcnQgY29uc3QgaW52ZXJ0QmFzZTE2VGhlbWUgPSAoYmFzZTE2VGhlbWU6IEJhc2UxNlRoZW1lKTogQmFzZTE2VGhlbWUgPT5cbiAgT2JqZWN0LmtleXMoYmFzZTE2VGhlbWUpLnJlZHVjZShcbiAgICAodCwga2V5KSA9PiAoXG4gICAgICAodFtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdID0gL15iYXNlLy50ZXN0KGtleSlcbiAgICAgICAgPyBpbnZlcnRDb2xvcihiYXNlMTZUaGVtZVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKVxuICAgICAgICA6IGtleSA9PT0gJ3NjaGVtZSdcbiAgICAgICAgPyBiYXNlMTZUaGVtZVtrZXldICsgJzppbnZlcnRlZCdcbiAgICAgICAgOiBiYXNlMTZUaGVtZVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKSxcbiAgICAgIHRcbiAgICApLFxuICAgIHt9IGFzIEJhc2UxNlRoZW1lXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTdHlsaW5nID0gY3VycnkoXG4gIChcbiAgICBnZXRTdHlsaW5nRnJvbUJhc2UxNjogKGJhc2UxNlRoZW1lOiBCYXNlMTZUaGVtZSkgPT4gU3R5bGluZ0NvbmZpZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBkZWZhdWx0QmFzZTE2PzogQmFzZTE2VGhlbWU7XG4gICAgICBiYXNlMTZUaGVtZXM/OiB7IFt0aGVtZU5hbWU6IHN0cmluZ106IEJhc2UxNlRoZW1lIH07XG4gICAgfSA9IHt9LFxuICAgIHRoZW1lT3JTdHlsaW5nOiBUaGVtZSA9IHt9LFxuICAgIC4uLmFyZ3NcbiAgKTogU3R5bGluZ0Z1bmN0aW9uID0+IHtcbiAgICBjb25zdCB7IGRlZmF1bHRCYXNlMTYgPSBERUZBVUxUX0JBU0UxNiwgYmFzZTE2VGhlbWVzID0gbnVsbCB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJhc2UxNlRoZW1lID0gZ2V0QmFzZTE2VGhlbWUodGhlbWVPclN0eWxpbmcsIGJhc2UxNlRoZW1lcyk7XG4gICAgaWYgKGJhc2UxNlRoZW1lKSB7XG4gICAgICB0aGVtZU9yU3R5bGluZyA9IHtcbiAgICAgICAgLi4uYmFzZTE2VGhlbWUsXG4gICAgICAgIC4uLih0aGVtZU9yU3R5bGluZyBhcyBCYXNlMTZUaGVtZSB8IFN0eWxpbmdDb25maWcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0aGVtZSA9IEJBU0UxNl9LRVlTLnJlZHVjZShcbiAgICAgICh0LCBrZXkpID0+IChcbiAgICAgICAgKHRba2V5IGFzIGtleW9mIEJhc2UxNlRoZW1lXSA9XG4gICAgICAgICAgKHRoZW1lT3JTdHlsaW5nIGFzIEJhc2UxNlRoZW1lKVtrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdIHx8XG4gICAgICAgICAgZGVmYXVsdEJhc2UxNltrZXkgYXMga2V5b2YgQmFzZTE2VGhlbWVdKSxcbiAgICAgICAgdFxuICAgICAgKSxcbiAgICAgIHt9IGFzIEJhc2UxNlRoZW1lXG4gICAgKTtcblxuICAgIGNvbnN0IGN1c3RvbVN0eWxpbmcgPSBPYmplY3Qua2V5cyh0aGVtZU9yU3R5bGluZykucmVkdWNlKFxuICAgICAgKHMsIGtleSkgPT5cbiAgICAgICAgQkFTRTE2X0tFWVMuaW5kZXhPZihrZXkpID09PSAtMVxuICAgICAgICAgID8gKChzW2tleV0gPSAodGhlbWVPclN0eWxpbmcgYXMgU3R5bGluZ0NvbmZpZylba2V5XSksIHMpXG4gICAgICAgICAgOiBzLFxuICAgICAge30gYXMgU3R5bGluZ0NvbmZpZ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWZhdWx0U3R5bGluZyA9IGdldFN0eWxpbmdGcm9tQmFzZTE2KHRoZW1lKTtcblxuICAgIGNvbnN0IG1lcmdlZFN0eWxpbmcgPSBtZXJnZVN0eWxpbmdzKGN1c3RvbVN0eWxpbmcsIGRlZmF1bHRTdHlsaW5nKTtcblxuICAgIHJldHVybiBjdXJyeShnZXRTdHlsaW5nQnlLZXlzLCAyKShtZXJnZWRTdHlsaW5nLCAuLi5hcmdzKTtcbiAgfSxcbiAgM1xuKTtcblxuY29uc3QgaXNTdHlsaW5nQ29uZmlnID0gKHRoZW1lOiBUaGVtZSk6IHRoZW1lIGlzIFN0eWxpbmdDb25maWcgPT5cbiAgISEodGhlbWUgYXMgU3R5bGluZ0NvbmZpZykuZXh0ZW5kO1xuXG5leHBvcnQgY29uc3QgZ2V0QmFzZTE2VGhlbWUgPSAoXG4gIHRoZW1lOiBUaGVtZSxcbiAgYmFzZTE2VGhlbWVzPzogeyBbdGhlbWVOYW1lOiBzdHJpbmddOiBCYXNlMTZUaGVtZSB9IHwgbnVsbFxuKTogQmFzZTE2VGhlbWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodGhlbWUgJiYgaXNTdHlsaW5nQ29uZmlnKHRoZW1lKSAmJiB0aGVtZS5leHRlbmQpIHtcbiAgICB0aGVtZSA9IHRoZW1lLmV4dGVuZCBhcyBzdHJpbmcgfCBCYXNlMTZUaGVtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgW3RoZW1lTmFtZSwgbW9kaWZpZXJdID0gdGhlbWUuc3BsaXQoJzonKTtcbiAgICBpZiAoYmFzZTE2VGhlbWVzKSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlRoZW1lc1t0aGVtZU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGVtZSA9IGJhc2UxNlt0aGVtZU5hbWUgYXMga2V5b2YgdHlwZW9mIGJhc2UxNl07XG4gICAgfVxuICAgIGlmIChtb2RpZmllciA9PT0gJ2ludmVydGVkJykge1xuICAgICAgdGhlbWUgPSBpbnZlcnRCYXNlMTZUaGVtZSh0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoZW1lICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGVtZSwgJ2Jhc2UwMCcpXG4gICAgPyAodGhlbWUgYXMgQmFzZTE2VGhlbWUpXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgaW52ZXJ0VGhlbWUgPSAodGhlbWU6IFRoZW1lIHwgdW5kZWZpbmVkKTogVGhlbWUgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHRoZW1lID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgJHt0aGVtZX06aW52ZXJ0ZWRgO1xuICB9XG5cbiAgaWYgKHRoZW1lICYmIGlzU3R5bGluZ0NvbmZpZyh0aGVtZSkgJiYgdGhlbWUuZXh0ZW5kKSB7XG4gICAgaWYgKHR5cGVvZiB0aGVtZS5leHRlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyAuLi50aGVtZSwgZXh0ZW5kOiBgJHt0aGVtZS5leHRlbmR9OmludmVydGVkYCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGVtZSxcbiAgICAgIGV4dGVuZDogaW52ZXJ0QmFzZTE2VGhlbWUodGhlbWUuZXh0ZW5kIGFzIEJhc2UxNlRoZW1lKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHRoZW1lKSB7XG4gICAgcmV0dXJuIGludmVydEJhc2UxNlRoZW1lKHRoZW1lIGFzIEJhc2UxNlRoZW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGVtZTtcbn07XG5cbmV4cG9ydCB7IEJhc2UxNlRoZW1lIH07XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ== |
\ | No newline at end of file |