@pie-lib/math-input-mathlive 1.1.5-beta.13 → 1.1.5-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/keypad-label.test.js +2 -201
- package/lib/__tests__/latex-bridge.test.js +1 -164
- package/lib/__tests__/mathlive-instance.test.js +1 -232
- package/lib/keypad/index.js +12 -8
- package/lib/keypad/index.js.map +1 -1
- package/lib/mathlive-instance.js +31 -14
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +51 -10
- package/lib/mf/common-styles.js.map +1 -1
- package/package.json +1 -1
- package/src/keypad/index.jsx +12 -8
- package/src/mathlive-instance.js +45 -14
- package/src/mf/common-styles.js +54 -10
|
@@ -159,55 +159,6 @@ describe('mathlive-instance', function () {
|
|
|
159
159
|
expect(MathfieldElement.fontsDirectory).toEqual("".concat(document.baseURI.replace(/\/$/, ''), "/mathlive-fonts"));
|
|
160
160
|
expect(MathfieldElement.fontsDirectory.startsWith('http')).toBe(true);
|
|
161
161
|
});
|
|
162
|
-
|
|
163
|
-
// \neq, \nsim and \ncong are built from Private Use Area glyphs that only
|
|
164
|
-
// the KaTeX fonts contain, so "no fonts" renders garbage rather than
|
|
165
|
-
// degrading gracefully - hence a CDN fallback by default.
|
|
166
|
-
it('falls back to a version-pinned CDN when nothing is configured', function () {
|
|
167
|
-
var MathfieldElement = {};
|
|
168
|
-
instance.__setMathLiveForTest({
|
|
169
|
-
MathfieldElement: MathfieldElement,
|
|
170
|
-
version: {
|
|
171
|
-
mathlive: '9.9.9'
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
instance.configureFonts(undefined);
|
|
175
|
-
expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@9.9.9/fonts');
|
|
176
|
-
});
|
|
177
|
-
it('uses /fonts, not /dist/fonts (the latter 404s on unpkg)', function () {
|
|
178
|
-
var MathfieldElement = {};
|
|
179
|
-
instance.__setMathLiveForTest({
|
|
180
|
-
MathfieldElement: MathfieldElement,
|
|
181
|
-
version: {
|
|
182
|
-
mathlive: '0.110.0'
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
instance.configureFonts(undefined);
|
|
186
|
-
expect(MathfieldElement.fontsDirectory).toEqual('https://unpkg.com/mathlive@0.110.0/fonts');
|
|
187
|
-
expect(MathfieldElement.fontsDirectory).not.toContain('/dist/');
|
|
188
|
-
});
|
|
189
|
-
it('a configured path wins over the CDN', function () {
|
|
190
|
-
var MathfieldElement = {};
|
|
191
|
-
instance.__setMathLiveForTest({
|
|
192
|
-
MathfieldElement: MathfieldElement,
|
|
193
|
-
version: {
|
|
194
|
-
mathlive: '0.110.0'
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
instance.configureFonts('/mathlive-fonts');
|
|
198
|
-
expect(MathfieldElement.fontsDirectory).not.toContain('unpkg.com');
|
|
199
|
-
});
|
|
200
|
-
it('null still opts out entirely', function () {
|
|
201
|
-
var MathfieldElement = {};
|
|
202
|
-
instance.__setMathLiveForTest({
|
|
203
|
-
MathfieldElement: MathfieldElement,
|
|
204
|
-
version: {
|
|
205
|
-
mathlive: '0.110.0'
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
instance.configureFonts(null);
|
|
209
|
-
expect(MathfieldElement.fontsDirectory).toBeNull();
|
|
210
|
-
});
|
|
211
162
|
it('leaves a fully-qualified url untouched', function () {
|
|
212
163
|
var MathfieldElement = {};
|
|
213
164
|
instance.__setMathLiveForTest({
|
|
@@ -225,188 +176,6 @@ describe('mathlive-instance', function () {
|
|
|
225
176
|
expect(MathfieldElement.fontsDirectory).toBeNull();
|
|
226
177
|
});
|
|
227
178
|
});
|
|
228
|
-
|
|
229
|
-
// A live <math-field> renders in shadow DOM, so nothing in the page's
|
|
230
|
-
// stylesheets reaches it - the stretchy-accent fix has to be injected there.
|
|
231
|
-
/**
|
|
232
|
-
* A keypad key like \frac inserts `\frac{#?}{#?}`; MathLive turns each `#?`
|
|
233
|
-
* into a `\placeholder{}` atom and *selects* the first one. Measured in
|
|
234
|
-
* Chromium: that atom is a leaf (its offsets are before/after, there is no
|
|
235
|
-
* position inside), so MathLive renders NO caret element and shows only the
|
|
236
|
-
* selection highlight - the box read as focused-but-dead. The caret is drawn
|
|
237
|
-
* by our own shadow CSS, gated on a class so it is placeholder-specific.
|
|
238
|
-
*/
|
|
239
|
-
describe('trackPlaceholderCaret', function () {
|
|
240
|
-
var fakeField = function fakeField(selection, latex) {
|
|
241
|
-
var classes = new Set();
|
|
242
|
-
return {
|
|
243
|
-
listeners: {},
|
|
244
|
-
selection: selection,
|
|
245
|
-
selectionIsCollapsed: !selection,
|
|
246
|
-
getValue: function getValue() {
|
|
247
|
-
return latex;
|
|
248
|
-
},
|
|
249
|
-
classList: {
|
|
250
|
-
toggle: function toggle(name, on) {
|
|
251
|
-
return on ? classes.add(name) : classes["delete"](name);
|
|
252
|
-
},
|
|
253
|
-
contains: function contains(name) {
|
|
254
|
-
return classes.has(name);
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
addEventListener: function addEventListener(name, fn) {
|
|
258
|
-
this.listeners[name] = fn;
|
|
259
|
-
},
|
|
260
|
-
removeEventListener: function removeEventListener(name) {
|
|
261
|
-
delete this.listeners[name];
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
};
|
|
265
|
-
it('marks the host when a placeholder is selected', function () {
|
|
266
|
-
var mf = fakeField({
|
|
267
|
-
ranges: [[1, 2]]
|
|
268
|
-
}, '\\placeholder{}');
|
|
269
|
-
instance.trackPlaceholderCaret(mf);
|
|
270
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(true);
|
|
271
|
-
});
|
|
272
|
-
it('does not mark an ordinary selection', function () {
|
|
273
|
-
var mf = fakeField({
|
|
274
|
-
ranges: [[0, 3]]
|
|
275
|
-
}, 'x+1');
|
|
276
|
-
instance.trackPlaceholderCaret(mf);
|
|
277
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
278
|
-
});
|
|
279
|
-
it('does not mark a collapsed selection, which has a real caret already', function () {
|
|
280
|
-
var mf = fakeField(null, '\\placeholder{}');
|
|
281
|
-
instance.trackPlaceholderCaret(mf);
|
|
282
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
283
|
-
});
|
|
284
|
-
it('leaves a named prompt alone - it takes a real caret inside', function () {
|
|
285
|
-
var mf = fakeField({
|
|
286
|
-
ranges: [[1, 2]]
|
|
287
|
-
}, '\\placeholder[r1]{}');
|
|
288
|
-
instance.trackPlaceholderCaret(mf);
|
|
289
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
290
|
-
});
|
|
291
|
-
it('re-evaluates whenever the selection moves', function () {
|
|
292
|
-
var mf = fakeField(null, '');
|
|
293
|
-
instance.trackPlaceholderCaret(mf);
|
|
294
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
295
|
-
|
|
296
|
-
// the caret lands on a placeholder
|
|
297
|
-
mf.selection = {
|
|
298
|
-
ranges: [[1, 2]]
|
|
299
|
-
};
|
|
300
|
-
mf.selectionIsCollapsed = false;
|
|
301
|
-
mf.getValue = function () {
|
|
302
|
-
return '\\placeholder{}';
|
|
303
|
-
};
|
|
304
|
-
mf.listeners['selection-change']();
|
|
305
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(true);
|
|
306
|
-
|
|
307
|
-
// ...and moves off it again
|
|
308
|
-
mf.selectionIsCollapsed = true;
|
|
309
|
-
mf.listeners['selection-change']();
|
|
310
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
311
|
-
});
|
|
312
|
-
it('returns a teardown that detaches the listener', function () {
|
|
313
|
-
var mf = fakeField(null, '');
|
|
314
|
-
var off = instance.trackPlaceholderCaret(mf);
|
|
315
|
-
expect((0, _typeof2["default"])(mf.listeners['selection-change'])).toEqual('function');
|
|
316
|
-
off();
|
|
317
|
-
expect(mf.listeners['selection-change']).toBeUndefined();
|
|
318
|
-
});
|
|
319
|
-
it('survives a field that throws while reading the selection', function () {
|
|
320
|
-
var mf = fakeField({
|
|
321
|
-
ranges: [[1, 2]]
|
|
322
|
-
}, '');
|
|
323
|
-
mf.getValue = function () {
|
|
324
|
-
throw new Error('detached');
|
|
325
|
-
};
|
|
326
|
-
expect(function () {
|
|
327
|
-
return instance.trackPlaceholderCaret(mf);
|
|
328
|
-
}).not.toThrow();
|
|
329
|
-
expect(mf.classList.contains(instance.PLACEHOLDER_CARET_CLASS)).toBe(false);
|
|
330
|
-
});
|
|
331
|
-
it('is a no-op without a field', function () {
|
|
332
|
-
expect(instance.trackPlaceholderCaret(undefined)).toBeUndefined();
|
|
333
|
-
expect(instance.trackPlaceholderCaret({})).toBeUndefined();
|
|
334
|
-
});
|
|
335
|
-
});
|
|
336
|
-
describe('applyShadowStyles', function () {
|
|
337
|
-
var host = function host() {
|
|
338
|
-
var el = document.createElement('div');
|
|
339
|
-
el.attachShadow({
|
|
340
|
-
mode: 'open'
|
|
341
|
-
});
|
|
342
|
-
return el;
|
|
343
|
-
};
|
|
344
|
-
it('is a no-op without a shadow root', function () {
|
|
345
|
-
expect(function () {
|
|
346
|
-
return instance.applyShadowStyles(undefined);
|
|
347
|
-
}).not.toThrow();
|
|
348
|
-
expect(function () {
|
|
349
|
-
return instance.applyShadowStyles(document.createElement('div'));
|
|
350
|
-
}).not.toThrow();
|
|
351
|
-
});
|
|
352
|
-
it('injects the accent fix into the shadow root', function () {
|
|
353
|
-
var el = host();
|
|
354
|
-
instance.applyShadowStyles(el);
|
|
355
|
-
var viaSheet = el.shadowRoot.__pieAccentSheet;
|
|
356
|
-
var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
|
|
357
|
-
var css = viaSheet ? 'adopted' : viaStyle && viaStyle.textContent || '';
|
|
358
|
-
expect(viaSheet || viaStyle).toBeTruthy();
|
|
359
|
-
if (viaStyle) {
|
|
360
|
-
expect(css).toContain('margin-left:0 !important');
|
|
361
|
-
// scoped so single-glyph accents keep their centring offset
|
|
362
|
-
expect(css).toContain(':has(.ML__stretchy)');
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
it('injects the placeholder caret rules', function () {
|
|
366
|
-
var el = host();
|
|
367
|
-
instance.applyShadowStyles(el);
|
|
368
|
-
var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
|
|
369
|
-
if (viaStyle) {
|
|
370
|
-
var css = viaStyle.textContent;
|
|
371
|
-
|
|
372
|
-
// gated on the host class, so an ordinary selection gets no caret
|
|
373
|
-
expect(css).toContain(":host(.".concat(instance.PLACEHOLDER_CARET_CLASS, ")"));
|
|
374
|
-
// MathLive's own blink keyframes and caret colour, already in this root
|
|
375
|
-
expect(css).toContain('ML__caret-blink');
|
|
376
|
-
expect(css).toContain('--_caret-color');
|
|
377
|
-
// the innermost selected element only: MathLive marks a wrapper AND the
|
|
378
|
-
// glyph span, which would otherwise render two carets
|
|
379
|
-
expect(css).toContain('.ML__selected:not(:has(.ML__selected))');
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
it('injects the radical index size fix', function () {
|
|
383
|
-
var el = host();
|
|
384
|
-
instance.applyShadowStyles(el);
|
|
385
|
-
var viaStyle = el.shadowRoot.querySelector('style[data-pie-accent]');
|
|
386
|
-
if (viaStyle) {
|
|
387
|
-
var css = viaStyle.textContent;
|
|
388
|
-
|
|
389
|
-
// MathLive's scriptscriptstyle index (an inline 50%) reads too small in
|
|
390
|
-
// the authoring UI; a mathfield's shadow root needs its own copy of the
|
|
391
|
-
// rule, since host styles do not cross the boundary. Compared against
|
|
392
|
-
// the exported rule, so the size stays defined in one place.
|
|
393
|
-
// eslint-disable-next-line global-require
|
|
394
|
-
var _require = require('../mf/common-styles'),
|
|
395
|
-
ROOT_INDEX_CSS = _require.ROOT_INDEX_CSS;
|
|
396
|
-
expect(ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
|
|
397
|
-
expect(css).toContain(ROOT_INDEX_CSS);
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
it('does not inject twice', function () {
|
|
401
|
-
var el = host();
|
|
402
|
-
instance.applyShadowStyles(el);
|
|
403
|
-
instance.applyShadowStyles(el);
|
|
404
|
-
var styles = el.shadowRoot.querySelectorAll('style[data-pie-accent]');
|
|
405
|
-
|
|
406
|
-
// either one adopted sheet, or exactly one style node
|
|
407
|
-
expect(el.shadowRoot.__pieAccentSheet ? 1 : styles.length).toBe(1);
|
|
408
|
-
});
|
|
409
|
-
});
|
|
410
179
|
describe('latexToMarkup', function () {
|
|
411
180
|
it('returns empty string when MathLive is not loaded', function () {
|
|
412
181
|
expect(instance.latexToMarkup('\\pi')).toEqual('');
|
|
@@ -416,4 +185,4 @@ describe('mathlive-instance', function () {
|
|
|
416
185
|
});
|
|
417
186
|
});
|
|
418
187
|
});
|
|
419
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImluc3RhbmNlIiwiYmVmb3JlRWFjaCIsImplc3QiLCJyZXNldE1vZHVsZXMiLCJyZXF1aXJlIiwiX19yZXNldEVtYmVkcyIsIml0IiwicmVnaXN0ZXJFbWJlZCIsImh0bWxTdHJpbmciLCJsYXRleCIsImV4cGVjdCIsInJlZ2lzdGVyZWRFbWJlZHMiLCJ0b0VxdWFsIiwiZ2V0TWFjcm9zIiwiYW5zd2VyQmxvY2siLCJuZXdMaW5lIiwic29tZXRoaW5nQ3VzdG9tIiwibWF0aGxpdmVMYXRleCIsImN1c3RvbSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVuZGVmaW5lZCIsIm1hY3JvcyIsInBhcmFsbGVsb2dyYW0iLCJ0b0JlRGVmaW5lZCIsImxvbmdkaXYiLCJuYXBwcm94IiwiZm9yRWFjaCIsIm5hbWUiLCJfdHlwZW9mMiIsIlBJRV9NQUNST1MiLCJ0b0JlIiwidG9Db250YWluIiwiYXBwbHlTdGF0aWNNYXRoIiwidG9CZVVuZGVmaW5lZCIsImVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiX19zZXRNYXRoTGl2ZUZvclRlc3QiLCJjb252ZXJ0TGF0ZXhUb01hcmt1cCIsImwiLCJjb25jYXQiLCJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCIsImNvbmZpZ3VyZUZvbnRzIiwiTWF0aGZpZWxkRWxlbWVudCIsImZvbnRzRGlyZWN0b3J5IiwiYmFzZVVSSSIsInJlcGxhY2UiLCJzdGFydHNXaXRoIiwidmVyc2lvbiIsIm1hdGhsaXZlIiwidG9CZU51bGwiLCJmYWtlRmllbGQiLCJzZWxlY3Rpb24iLCJjbGFzc2VzIiwiU2V0IiwibGlzdGVuZXJzIiwic2VsZWN0aW9uSXNDb2xsYXBzZWQiLCJnZXRWYWx1ZSIsImNsYXNzTGlzdCIsInRvZ2dsZSIsIm9uIiwiYWRkIiwiY29udGFpbnMiLCJoYXMiLCJhZGRFdmVudExpc3RlbmVyIiwiZm4iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibWYiLCJyYW5nZXMiLCJ0cmFja1BsYWNlaG9sZGVyQ2FyZXQiLCJQTEFDRUhPTERFUl9DQVJFVF9DTEFTUyIsIm9mZiIsImhvc3QiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwiYXBwbHlTaGFkb3dTdHlsZXMiLCJ2aWFTaGVldCIsInNoYWRvd1Jvb3QiLCJfX3BpZUFjY2VudFNoZWV0IiwidmlhU3R5bGUiLCJxdWVyeVNlbGVjdG9yIiwiY3NzIiwidG9CZVRydXRoeSIsIl9yZXF1aXJlIiwiUk9PVF9JTkRFWF9DU1MiLCJzdHlsZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwibGVuZ3RoIiwibGF0ZXhUb01hcmt1cCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWF0aGxpdmUtaW5zdGFuY2UudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJkZXNjcmliZSgnbWF0aGxpdmUtaW5zdGFuY2UnLCAoKSA9PiB7XG4gIGxldCBpbnN0YW5jZTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc2V0TW9kdWxlcygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIGluc3RhbmNlID0gcmVxdWlyZSgnLi4vbWF0aGxpdmUtaW5zdGFuY2UnKTtcbiAgICBpbnN0YW5jZS5fX3Jlc2V0RW1iZWRzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlckVtYmVkJywgKCkgPT4ge1xuICAgIGl0KCdyZWdpc3RlcnMgYSBrbm93biBlbWJlZCBhbmQgZXhwb3NlcyBpdCBhcyBhIG1hY3JvJywgKCkgPT4ge1xuICAgICAgaW5zdGFuY2UucmVnaXN0ZXJFbWJlZCgnYW5zd2VyQmxvY2snLCAoKSA9PiAoe1xuICAgICAgICBodG1sU3RyaW5nOiAnPGRpdiBjbGFzcz1cImFuc3dlckJsb2NrXCI+PC9kaXY+JyxcbiAgICAgICAgbGF0ZXg6ICgpID0+ICdcXFxcZW1iZWR7YW5zd2VyQmxvY2t9W10nLFxuICAgICAgfSkpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UucmVnaXN0ZXJlZEVtYmVkcygpKS50b0VxdWFsKFsnYW5zd2VyQmxvY2snXSk7XG4gICAgICAvLyBUaGUgbWFjcm8gdGFncyBvdXRwdXQgd2l0aCBkYXRhLWVtYmVkIHNvIENTUyBjYW4gdGFyZ2V0IGl0LCByZXBsYWNpbmdcbiAgICAgIC8vIE1hdGhRdWlsbCdzIGh0bWxTdHJpbmcgaG9vay5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5nZXRNYWNyb3MoKS5hbnN3ZXJCbG9jaykudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPWFuc3dlckJsb2NrfXtcXFxccGxhY2Vob2xkZXJ7fX0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZWdpc3RlcnMgbmV3TGluZSBhcyBhIGhhcm1sZXNzIG1hY3JvIChpdCBpcyBoYW5kbGVkIGJ5IGxhdGV4LWJyaWRnZSknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCduZXdMaW5lJywgKCkgPT4gKHsgbGF0ZXg6ICgpID0+ICdcXFxcZW1iZWR7bmV3TGluZX1bXScgfSkpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UuZ2V0TWFjcm9zKCkubmV3TGluZSkudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPW5ld0xpbmV9e30nKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVua25vd24gZW1iZWQnLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdzb21ldGhpbmdDdXN0b20nLCAoKSA9PiAoeyBodG1sU3RyaW5nOiAnPGI+eDwvYj4nIH0pKTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmdldE1hY3JvcygpLnNvbWV0aGluZ0N1c3RvbSkudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPXNvbWV0aGluZ0N1c3RvbX17XFxcXHBsYWNlaG9sZGVye319Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaG9ub3VycyBhbiBleHBsaWNpdCBtYXRobGl2ZUxhdGV4IGZyb20gdGhlIGZhY3RvcnknLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdjdXN0b20nLCAoKSA9PiAoeyBtYXRobGl2ZUxhdGV4OiAnXFxcXGFscGhhJyB9KSk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5nZXRNYWNyb3MoKS5jdXN0b20pLnRvRXF1YWwoJ1xcXFxodG1sRGF0YXtlbWJlZD1jdXN0b219e1xcXFxhbHBoYX0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyB3aGVuIHRoZSBmYWN0b3J5IHRocm93cycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdiYWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdib29tJyk7XG4gICAgICAgIH0pLFxuICAgICAgKS5ub3QudG9UaHJvdygpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UucmVnaXN0ZXJlZEVtYmVkcygpKS50b0VxdWFsKFsnYmFkJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lnbm9yZXMgYmFkIGFyZ3VtZW50cycsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQodW5kZWZpbmVkLCAoKSA9PiAoe30pKTtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ25vRmFjdG9yeScsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5yZWdpc3RlcmVkRW1iZWRzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Fsd2F5cyBpbmNsdWRlcyB0aGUgcGllIG1hY3JvIHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1hY3JvcyA9IGluc3RhbmNlLmdldE1hY3JvcygpO1xuXG4gICAgICBleHBlY3QobWFjcm9zLnBhcmFsbGVsb2dyYW0pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobWFjcm9zLmxvbmdkaXYpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobWFjcm9zLm5hcHByb3gpLnRvRXF1YWwoJ1xcXFxub3RcXFxcYXBwcm94Jyk7XG4gICAgfSk7XG5cbiAgICAvLyBBcmd1bWVudC10YWtpbmcgbWFjcm9zIGV4aXN0IG9ubHkgc28gcHJldmlvdXNseSBhdXRob3JlZCBsYXRleCBwYXJzZXMuXG4gICAgLy8gRWRpdGluZyBuZXZlciBnb2VzIHRocm91Z2ggdGhlbTogTWF0aExpdmUgc2VyaWFsaXNlcyBhIG1hY3JvIGZyb20gaXRzXG4gICAgLy8gb3JpZ2luYWwgYXJndW1lbnRzLCBzbyB0eXBlZCBjb250ZW50IG5ldmVyIGNvbWVzIGJhY2sgb3V0LlxuICAgIGl0KCdhcmd1bWVudC10YWtpbmcgbWFjcm9zIGFyZSBwbGFpbiBwYXJzZS1vbmx5IGRlZmluaXRpb25zJywgKCkgPT4ge1xuICAgICAgWydsb25nZGl2JywgJ292ZXJhcmMnLCAnYWJzJ10uZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBleHBlY3QodHlwZW9mIGluc3RhbmNlLlBJRV9NQUNST1NbbmFtZV0pLnRvQmUoJ3N0cmluZycpO1xuICAgICAgICBleHBlY3QoaW5zdGFuY2UuUElFX01BQ1JPU1tuYW1lXSkudG9Db250YWluKCcjMScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYXJndW1lbnQtbGVzcyBzeW1ib2xzIHN0YXkgYXRvbWljJywgKCkgPT4ge1xuICAgICAgWydwZXJwZW5kaWN1bGFyJywgJ3NxdWFyZScsICdkZWdyZWUnLCAnbmFwcHJveCcsICdwYXJhbGxlbG9ncmFtJ10uZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBleHBlY3QodHlwZW9mIGluc3RhbmNlLlBJRV9NQUNST1NbbmFtZV0pLnRvQmUoJ3N0cmluZycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9uZ2RpdiBtYXRjaGVzIHRoZSBNYXRoSmF4IG1hY3JvIHVzZWQgYnkgbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UuUElFX01BQ1JPUy5sb25nZGl2KS50b0VxdWFsKCdcXFxcZW5jbG9zZXtsb25nZGl2fXsjMX0nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FwcGx5U3RhdGljTWF0aCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyB1bmRlZmluZWQgd2l0aG91dCBhbiBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChudWxsLCAneCcpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZGVmZXJzIChyZXR1cm5zIHVuZGVmaW5lZCkgd2hlbiBNYXRoTGl2ZSBoYXMgbm90IGxvYWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5hcHBseVN0YXRpY01hdGgoZWwsICd4JykpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIHN5bmNocm9ub3VzbHkgb25jZSBNYXRoTGl2ZSBpcyBhdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IGNvbnZlcnRMYXRleFRvTWFya3VwOiAobCkgPT4gYDxzcGFuPiR7bH08L3NwYW4+YCB9KTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChlbCwgJ1xcXFxwaScpKS50b0JlKGVsKTtcbiAgICAgIGV4cGVjdChlbC5pbm5lckhUTUwpLnRvRXF1YWwoJzxzcGFuPlxcXFxwaTwvc3Bhbj4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBlbGVtZW50IHRleHRDb250ZW50IHdoZW4gbm8gbGF0ZXggaXMgcGFzc2VkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZWwudGV4dENvbnRlbnQgPSAnXFxcXHRoZXRhJztcbiAgICAgIGluc3RhbmNlLl9fc2V0TWF0aExpdmVGb3JUZXN0KHsgY29udmVydExhdGV4VG9NYXJrdXA6IChsKSA9PiBgPGk+JHtsfTwvaT5gIH0pO1xuICAgICAgaW5zdGFuY2UuYXBwbHlTdGF0aWNNYXRoKGVsKTtcblxuICAgICAgZXhwZWN0KGVsLmlubmVySFRNTCkudG9FcXVhbCgnPGk+XFxcXHRoZXRhPC9pPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2JyaWRnZXMgc3RvcmVkIGxhdGV4IChuZXdMaW5lIGVtYmVkKSBiZWZvcmUgcmVuZGVyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBjb252ZXJ0TGF0ZXhUb01hcmt1cDogKGwpID0+IGwgfSk7XG4gICAgICBpbnN0YW5jZS5hcHBseVN0YXRpY01hdGgoZWwsICdhXFxcXGVtYmVke25ld0xpbmV9W11iJyk7XG5cbiAgICAgIC8vIFxcZW1iZWR7bmV3TGluZX1bXSBtdXN0IGJlY29tZSBhIG11bHRpbGluZSBlbnZpcm9ubWVudFxuICAgICAgZXhwZWN0KGVsLmlubmVySFRNTCkudG9Db250YWluKCdkaXNwbGF5bGluZXMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyZUZvbnRzJywgKCkgPT4ge1xuICAgIC8vIE1hdGhMaXZlJ3MgZGVmYXVsdCBmb250c0RpcmVjdG9yeSBpcyB0aGUgcmVsYXRpdmUgJy4vZm9udHMvJywgd2hpY2ggaXRcbiAgICAvLyByZXNvbHZlcyBhZ2FpbnN0IGl0cyBvd24gKGVtcHR5LCB3aGVuIGJ1bmRsZWQpIHNjcmlwdCB1cmwgYW5kIHRocm93c1xuICAgIC8vIFwiSW52YWxpZCBiYXNlIFVSTFwiIGZyb20gbG9hZEZvbnRzLiBQYXRocyBtdXN0IGJlY29tZSBhYnNvbHV0ZS5cbiAgICBpdCgnaXMgZXhwb3J0ZWQgYW5kIGNhbGxhYmxlIGJlZm9yZSBNYXRoTGl2ZSBsb2FkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0eXBlb2YgaW5zdGFuY2UuY29uZmlndXJlRm9udHMpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgICBleHBlY3QoKCkgPT4gaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FjY2VwdHMgbnVsbCB0byBkaXNhYmxlIGZvbnQgbG9hZGluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS5jb25maWd1cmVGb250cyhudWxsKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGFuIGFic29sdXRlIHVybCB0byBhbiBhbHJlYWR5LWxvYWRlZCBNYXRoZmllbGRFbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICAvLyBzaW11bGF0ZSBhIGxvYWRlZCBpbnN0YW5jZVxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9FcXVhbChgJHtkb2N1bWVudC5iYXNlVVJJLnJlcGxhY2UoL1xcLyQvLCAnJyl9L21hdGhsaXZlLWZvbnRzYCk7XG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeS5zdGFydHNXaXRoKCdodHRwJykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBcXG5lcSwgXFxuc2ltIGFuZCBcXG5jb25nIGFyZSBidWlsdCBmcm9tIFByaXZhdGUgVXNlIEFyZWEgZ2x5cGhzIHRoYXQgb25seVxuICAgIC8vIHRoZSBLYVRlWCBmb250cyBjb250YWluLCBzbyBcIm5vIGZvbnRzXCIgcmVuZGVycyBnYXJiYWdlIHJhdGhlciB0aGFuXG4gICAgLy8gZGVncmFkaW5nIGdyYWNlZnVsbHkgLSBoZW5jZSBhIENETiBmYWxsYmFjayBieSBkZWZhdWx0LlxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGEgdmVyc2lvbi1waW5uZWQgQ0ROIHdoZW4gbm90aGluZyBpcyBjb25maWd1cmVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQsIHZlcnNpb246IHsgbWF0aGxpdmU6ICc5LjkuOScgfSB9KTtcbiAgICAgIGluc3RhbmNlLmNvbmZpZ3VyZUZvbnRzKHVuZGVmaW5lZCk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKCdodHRwczovL3VucGtnLmNvbS9tYXRobGl2ZUA5LjkuOS9mb250cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgL2ZvbnRzLCBub3QgL2Rpc3QvZm9udHMgKHRoZSBsYXR0ZXIgNDA0cyBvbiB1bnBrZyknLCAoKSA9PiB7XG4gICAgICBjb25zdCBNYXRoZmllbGRFbGVtZW50ID0ge307XG5cbiAgICAgIGluc3RhbmNlLl9fc2V0TWF0aExpdmVGb3JUZXN0KHsgTWF0aGZpZWxkRWxlbWVudCwgdmVyc2lvbjogeyBtYXRobGl2ZTogJzAuMTEwLjAnIH0gfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cyh1bmRlZmluZWQpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9FcXVhbCgnaHR0cHM6Ly91bnBrZy5jb20vbWF0aGxpdmVAMC4xMTAuMC9mb250cycpO1xuICAgICAgZXhwZWN0KE1hdGhmaWVsZEVsZW1lbnQuZm9udHNEaXJlY3RvcnkpLm5vdC50b0NvbnRhaW4oJy9kaXN0LycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgY29uZmlndXJlZCBwYXRoIHdpbnMgb3ZlciB0aGUgQ0ROJywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQsIHZlcnNpb246IHsgbWF0aGxpdmU6ICcwLjExMC4wJyB9IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJy9tYXRobGl2ZS1mb250cycpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkubm90LnRvQ29udGFpbigndW5wa2cuY29tJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbnVsbCBzdGlsbCBvcHRzIG91dCBlbnRpcmVseScsICgpID0+IHtcbiAgICAgIGNvbnN0IE1hdGhmaWVsZEVsZW1lbnQgPSB7fTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50LCB2ZXJzaW9uOiB7IG1hdGhsaXZlOiAnMC4xMTAuMCcgfSB9KTtcbiAgICAgIGluc3RhbmNlLmNvbmZpZ3VyZUZvbnRzKG51bGwpO1xuXG4gICAgICBleHBlY3QoTWF0aGZpZWxkRWxlbWVudC5mb250c0RpcmVjdG9yeSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBmdWxseS1xdWFsaWZpZWQgdXJsIHVudG91Y2hlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IE1hdGhmaWVsZEVsZW1lbnQgPSB7fTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJ2h0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2ZvbnRzJyk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKCdodHRwczovL2Nkbi5leGFtcGxlLmNvbS9mb250cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBudWxsIHRocm91Z2ggcmF0aGVyIHRoYW4gcmVzb2x2aW5nIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQgfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cyhudWxsKTtcblxuICAgICAgZXhwZWN0KE1hdGhmaWVsZEVsZW1lbnQuZm9udHNEaXJlY3RvcnkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEEgbGl2ZSA8bWF0aC1maWVsZD4gcmVuZGVycyBpbiBzaGFkb3cgRE9NLCBzbyBub3RoaW5nIGluIHRoZSBwYWdlJ3NcbiAgLy8gc3R5bGVzaGVldHMgcmVhY2hlcyBpdCAtIHRoZSBzdHJldGNoeS1hY2NlbnQgZml4IGhhcyB0byBiZSBpbmplY3RlZCB0aGVyZS5cbiAgLyoqXG4gICAqIEEga2V5cGFkIGtleSBsaWtlIFxcZnJhYyBpbnNlcnRzIGBcXGZyYWN7Iz99eyM/fWA7IE1hdGhMaXZlIHR1cm5zIGVhY2ggYCM/YFxuICAgKiBpbnRvIGEgYFxccGxhY2Vob2xkZXJ7fWAgYXRvbSBhbmQgKnNlbGVjdHMqIHRoZSBmaXJzdCBvbmUuIE1lYXN1cmVkIGluXG4gICAqIENocm9taXVtOiB0aGF0IGF0b20gaXMgYSBsZWFmIChpdHMgb2Zmc2V0cyBhcmUgYmVmb3JlL2FmdGVyLCB0aGVyZSBpcyBub1xuICAgKiBwb3NpdGlvbiBpbnNpZGUpLCBzbyBNYXRoTGl2ZSByZW5kZXJzIE5PIGNhcmV0IGVsZW1lbnQgYW5kIHNob3dzIG9ubHkgdGhlXG4gICAqIHNlbGVjdGlvbiBoaWdobGlnaHQgLSB0aGUgYm94IHJlYWQgYXMgZm9jdXNlZC1idXQtZGVhZC4gVGhlIGNhcmV0IGlzIGRyYXduXG4gICAqIGJ5IG91ciBvd24gc2hhZG93IENTUywgZ2F0ZWQgb24gYSBjbGFzcyBzbyBpdCBpcyBwbGFjZWhvbGRlci1zcGVjaWZpYy5cbiAgICovXG4gIGRlc2NyaWJlKCd0cmFja1BsYWNlaG9sZGVyQ2FyZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFrZUZpZWxkID0gKHNlbGVjdGlvbiwgbGF0ZXgpID0+IHtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpc3RlbmVyczoge30sXG4gICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgc2VsZWN0aW9uSXNDb2xsYXBzZWQ6ICFzZWxlY3Rpb24sXG4gICAgICAgIGdldFZhbHVlOiAoKSA9PiBsYXRleCxcbiAgICAgICAgY2xhc3NMaXN0OiB7XG4gICAgICAgICAgdG9nZ2xlOiAobmFtZSwgb24pID0+IChvbiA/IGNsYXNzZXMuYWRkKG5hbWUpIDogY2xhc3Nlcy5kZWxldGUobmFtZSkpLFxuICAgICAgICAgIGNvbnRhaW5zOiAobmFtZSkgPT4gY2xhc3Nlcy5oYXMobmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZm4pIHtcbiAgICAgICAgICB0aGlzLmxpc3RlbmVyc1tuYW1lXSA9IGZuO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbbmFtZV07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBpdCgnbWFya3MgdGhlIGhvc3Qgd2hlbiBhIHBsYWNlaG9sZGVyIGlzIHNlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICdcXFxccGxhY2Vob2xkZXJ7fScpO1xuXG4gICAgICBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpO1xuXG4gICAgICBleHBlY3QobWYuY2xhc3NMaXN0LmNvbnRhaW5zKGluc3RhbmNlLlBMQUNFSE9MREVSX0NBUkVUX0NMQVNTKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBtYXJrIGFuIG9yZGluYXJ5IHNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1mID0gZmFrZUZpZWxkKHsgcmFuZ2VzOiBbWzAsIDNdXSB9LCAneCsxJyk7XG5cbiAgICAgIGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBtYXJrIGEgY29sbGFwc2VkIHNlbGVjdGlvbiwgd2hpY2ggaGFzIGEgcmVhbCBjYXJldCBhbHJlYWR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQobnVsbCwgJ1xcXFxwbGFjZWhvbGRlcnt9Jyk7XG5cbiAgICAgIGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBuYW1lZCBwcm9tcHQgYWxvbmUgLSBpdCB0YWtlcyBhIHJlYWwgY2FyZXQgaW5zaWRlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICdcXFxccGxhY2Vob2xkZXJbcjFde30nKTtcblxuICAgICAgaW5zdGFuY2UudHJhY2tQbGFjZWhvbGRlckNhcmV0KG1mKTtcblxuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlLWV2YWx1YXRlcyB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIG1vdmVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQobnVsbCwgJycpO1xuXG4gICAgICBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuXG4gICAgICAvLyB0aGUgY2FyZXQgbGFuZHMgb24gYSBwbGFjZWhvbGRlclxuICAgICAgbWYuc2VsZWN0aW9uID0geyByYW5nZXM6IFtbMSwgMl1dIH07XG4gICAgICBtZi5zZWxlY3Rpb25Jc0NvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgbWYuZ2V0VmFsdWUgPSAoKSA9PiAnXFxcXHBsYWNlaG9sZGVye30nO1xuICAgICAgbWYubGlzdGVuZXJzWydzZWxlY3Rpb24tY2hhbmdlJ10oKTtcbiAgICAgIGV4cGVjdChtZi5jbGFzc0xpc3QuY29udGFpbnMoaW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1MpKS50b0JlKHRydWUpO1xuXG4gICAgICAvLyAuLi5hbmQgbW92ZXMgb2ZmIGl0IGFnYWluXG4gICAgICBtZi5zZWxlY3Rpb25Jc0NvbGxhcHNlZCA9IHRydWU7XG4gICAgICBtZi5saXN0ZW5lcnNbJ3NlbGVjdGlvbi1jaGFuZ2UnXSgpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSB0ZWFyZG93biB0aGF0IGRldGFjaGVzIHRoZSBsaXN0ZW5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1mID0gZmFrZUZpZWxkKG51bGwsICcnKTtcbiAgICAgIGNvbnN0IG9mZiA9IGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldChtZik7XG5cbiAgICAgIGV4cGVjdCh0eXBlb2YgbWYubGlzdGVuZXJzWydzZWxlY3Rpb24tY2hhbmdlJ10pLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgICBvZmYoKTtcbiAgICAgIGV4cGVjdChtZi5saXN0ZW5lcnNbJ3NlbGVjdGlvbi1jaGFuZ2UnXSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1cnZpdmVzIGEgZmllbGQgdGhhdCB0aHJvd3Mgd2hpbGUgcmVhZGluZyB0aGUgc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbWYgPSBmYWtlRmllbGQoeyByYW5nZXM6IFtbMSwgMl1dIH0sICcnKTtcblxuICAgICAgbWYuZ2V0VmFsdWUgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGV0YWNoZWQnKTtcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS50cmFja1BsYWNlaG9sZGVyQ2FyZXQobWYpKS5ub3QudG9UaHJvdygpO1xuICAgICAgZXhwZWN0KG1mLmNsYXNzTGlzdC5jb250YWlucyhpbnN0YW5jZS5QTEFDRUhPTERFUl9DQVJFVF9DTEFTUykpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGEgbm8tb3Agd2l0aG91dCBhIGZpZWxkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLnRyYWNrUGxhY2Vob2xkZXJDYXJldCh1bmRlZmluZWQpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QoaW5zdGFuY2UudHJhY2tQbGFjZWhvbGRlckNhcmV0KHt9KSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXBwbHlTaGFkb3dTdHlsZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgaG9zdCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGVsLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcblxuICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG5cbiAgICBpdCgnaXMgYSBuby1vcCB3aXRob3V0IGEgc2hhZG93IHJvb3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gaW5zdGFuY2UuYXBwbHlTaGFkb3dTdHlsZXModW5kZWZpbmVkKSkubm90LnRvVGhyb3coKTtcbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS5hcHBseVNoYWRvd1N0eWxlcyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5qZWN0cyB0aGUgYWNjZW50IGZpeCBpbnRvIHRoZSBzaGFkb3cgcm9vdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gaG9zdCgpO1xuXG4gICAgICBpbnN0YW5jZS5hcHBseVNoYWRvd1N0eWxlcyhlbCk7XG5cbiAgICAgIGNvbnN0IHZpYVNoZWV0ID0gZWwuc2hhZG93Um9vdC5fX3BpZUFjY2VudFNoZWV0O1xuICAgICAgY29uc3QgdmlhU3R5bGUgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtcGllLWFjY2VudF0nKTtcbiAgICAgIGNvbnN0IGNzcyA9IHZpYVNoZWV0ID8gJ2Fkb3B0ZWQnIDogKHZpYVN0eWxlICYmIHZpYVN0eWxlLnRleHRDb250ZW50KSB8fCAnJztcblxuICAgICAgZXhwZWN0KHZpYVNoZWV0IHx8IHZpYVN0eWxlKS50b0JlVHJ1dGh5KCk7XG5cbiAgICAgIGlmICh2aWFTdHlsZSkge1xuICAgICAgICBleHBlY3QoY3NzKS50b0NvbnRhaW4oJ21hcmdpbi1sZWZ0OjAgIWltcG9ydGFudCcpO1xuICAgICAgICAvLyBzY29wZWQgc28gc2luZ2xlLWdseXBoIGFjY2VudHMga2VlcCB0aGVpciBjZW50cmluZyBvZmZzZXRcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCc6aGFzKC5NTF9fc3RyZXRjaHkpJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaW5qZWN0cyB0aGUgcGxhY2Vob2xkZXIgY2FyZXQgcnVsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGhvc3QoKTtcblxuICAgICAgaW5zdGFuY2UuYXBwbHlTaGFkb3dTdHlsZXMoZWwpO1xuXG4gICAgICBjb25zdCB2aWFTdHlsZSA9IGVsLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc3R5bGVbZGF0YS1waWUtYWNjZW50XScpO1xuXG4gICAgICBpZiAodmlhU3R5bGUpIHtcbiAgICAgICAgY29uc3QgY3NzID0gdmlhU3R5bGUudGV4dENvbnRlbnQ7XG5cbiAgICAgICAgLy8gZ2F0ZWQgb24gdGhlIGhvc3QgY2xhc3MsIHNvIGFuIG9yZGluYXJ5IHNlbGVjdGlvbiBnZXRzIG5vIGNhcmV0XG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbihgOmhvc3QoLiR7aW5zdGFuY2UuUExBQ0VIT0xERVJfQ0FSRVRfQ0xBU1N9KWApO1xuICAgICAgICAvLyBNYXRoTGl2ZSdzIG93biBibGluayBrZXlmcmFtZXMgYW5kIGNhcmV0IGNvbG91ciwgYWxyZWFkeSBpbiB0aGlzIHJvb3RcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCdNTF9fY2FyZXQtYmxpbmsnKTtcbiAgICAgICAgZXhwZWN0KGNzcykudG9Db250YWluKCctLV9jYXJldC1jb2xvcicpO1xuICAgICAgICAvLyB0aGUgaW5uZXJtb3N0IHNlbGVjdGVkIGVsZW1lbnQgb25seTogTWF0aExpdmUgbWFya3MgYSB3cmFwcGVyIEFORCB0aGVcbiAgICAgICAgLy8gZ2x5cGggc3Bhbiwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHJlbmRlciB0d28gY2FyZXRzXG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbignLk1MX19zZWxlY3RlZDpub3QoOmhhcyguTUxfX3NlbGVjdGVkKSknKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdpbmplY3RzIHRoZSByYWRpY2FsIGluZGV4IHNpemUgZml4JywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBob3N0KCk7XG5cbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcblxuICAgICAgY29uc3QgdmlhU3R5bGUgPSBlbC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtcGllLWFjY2VudF0nKTtcblxuICAgICAgaWYgKHZpYVN0eWxlKSB7XG4gICAgICAgIGNvbnN0IGNzcyA9IHZpYVN0eWxlLnRleHRDb250ZW50O1xuXG4gICAgICAgIC8vIE1hdGhMaXZlJ3Mgc2NyaXB0c2NyaXB0c3R5bGUgaW5kZXggKGFuIGlubGluZSA1MCUpIHJlYWRzIHRvbyBzbWFsbCBpblxuICAgICAgICAvLyB0aGUgYXV0aG9yaW5nIFVJOyBhIG1hdGhmaWVsZCdzIHNoYWRvdyByb290IG5lZWRzIGl0cyBvd24gY29weSBvZiB0aGVcbiAgICAgICAgLy8gcnVsZSwgc2luY2UgaG9zdCBzdHlsZXMgZG8gbm90IGNyb3NzIHRoZSBib3VuZGFyeS4gQ29tcGFyZWQgYWdhaW5zdFxuICAgICAgICAvLyB0aGUgZXhwb3J0ZWQgcnVsZSwgc28gdGhlIHNpemUgc3RheXMgZGVmaW5lZCBpbiBvbmUgcGxhY2UuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgICAgICBjb25zdCB7IFJPT1RfSU5ERVhfQ1NTIH0gPSByZXF1aXJlKCcuLi9tZi9jb21tb24tc3R5bGVzJyk7XG5cbiAgICAgICAgZXhwZWN0KFJPT1RfSU5ERVhfQ1NTKS50b0NvbnRhaW4oJy5NTF9fc3FydC1pbmRleCA+Jyk7XG4gICAgICAgIGV4cGVjdChjc3MpLnRvQ29udGFpbihST09UX0lOREVYX0NTUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgaW5qZWN0IHR3aWNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBob3N0KCk7XG5cbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcbiAgICAgIGluc3RhbmNlLmFwcGx5U2hhZG93U3R5bGVzKGVsKTtcblxuICAgICAgY29uc3Qgc3R5bGVzID0gZWwuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZVtkYXRhLXBpZS1hY2NlbnRdJyk7XG5cbiAgICAgIC8vIGVpdGhlciBvbmUgYWRvcHRlZCBzaGVldCwgb3IgZXhhY3RseSBvbmUgc3R5bGUgbm9kZVxuICAgICAgZXhwZWN0KGVsLnNoYWRvd1Jvb3QuX19waWVBY2NlbnRTaGVldCA/IDEgOiBzdHlsZXMubGVuZ3RoKS50b0JlKDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGF0ZXhUb01hcmt1cCcsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBlbXB0eSBzdHJpbmcgd2hlbiBNYXRoTGl2ZSBpcyBub3QgbG9hZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGluc3RhbmNlLmxhdGV4VG9NYXJrdXAoJ1xcXFxwaScpKS50b0VxdWFsKCcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGVtcHR5IHN0cmluZyBmb3IgZW1wdHkgbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UubGF0ZXhUb01hcmt1cCgnJykpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUFBLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxZQUFNO0VBQ2xDLElBQUlDLFFBQVE7RUFFWkMsVUFBVSxDQUFDLFlBQU07SUFDZkMsSUFBSSxDQUFDQyxZQUFZLENBQUMsQ0FBQztJQUNuQjtJQUNBSCxRQUFRLEdBQUdJLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztJQUMxQ0osUUFBUSxDQUFDSyxhQUFhLENBQUMsQ0FBQztFQUMxQixDQUFDLENBQUM7RUFFRk4sUUFBUSxDQUFD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
|
|
188
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsImluc3RhbmNlIiwiYmVmb3JlRWFjaCIsImplc3QiLCJyZXNldE1vZHVsZXMiLCJyZXF1aXJlIiwiX19yZXNldEVtYmVkcyIsIml0IiwicmVnaXN0ZXJFbWJlZCIsImh0bWxTdHJpbmciLCJsYXRleCIsImV4cGVjdCIsInJlZ2lzdGVyZWRFbWJlZHMiLCJ0b0VxdWFsIiwiZ2V0TWFjcm9zIiwiYW5zd2VyQmxvY2siLCJuZXdMaW5lIiwic29tZXRoaW5nQ3VzdG9tIiwibWF0aGxpdmVMYXRleCIsImN1c3RvbSIsIkVycm9yIiwibm90IiwidG9UaHJvdyIsInVuZGVmaW5lZCIsIm1hY3JvcyIsInBhcmFsbGVsb2dyYW0iLCJ0b0JlRGVmaW5lZCIsImxvbmdkaXYiLCJuYXBwcm94IiwiZm9yRWFjaCIsIm5hbWUiLCJfdHlwZW9mMiIsIlBJRV9NQUNST1MiLCJ0b0JlIiwidG9Db250YWluIiwiYXBwbHlTdGF0aWNNYXRoIiwidG9CZVVuZGVmaW5lZCIsImVsIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiX19zZXRNYXRoTGl2ZUZvclRlc3QiLCJjb252ZXJ0TGF0ZXhUb01hcmt1cCIsImwiLCJjb25jYXQiLCJpbm5lckhUTUwiLCJ0ZXh0Q29udGVudCIsImNvbmZpZ3VyZUZvbnRzIiwiTWF0aGZpZWxkRWxlbWVudCIsImZvbnRzRGlyZWN0b3J5IiwiYmFzZVVSSSIsInJlcGxhY2UiLCJzdGFydHNXaXRoIiwidG9CZU51bGwiLCJsYXRleFRvTWFya3VwIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL19fdGVzdHNfXy9tYXRobGl2ZS1pbnN0YW5jZS50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImRlc2NyaWJlKCdtYXRobGl2ZS1pbnN0YW5jZScsICgpID0+IHtcbiAgbGV0IGluc3RhbmNlO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzZXRNb2R1bGVzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgaW5zdGFuY2UgPSByZXF1aXJlKCcuLi9tYXRobGl2ZS1pbnN0YW5jZScpO1xuICAgIGluc3RhbmNlLl9fcmVzZXRFbWJlZHMoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlZ2lzdGVyRW1iZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3JlZ2lzdGVycyBhIGtub3duIGVtYmVkIGFuZCBleHBvc2VzIGl0IGFzIGEgbWFjcm8nLCAoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5yZWdpc3RlckVtYmVkKCdhbnN3ZXJCbG9jaycsICgpID0+ICh7XG4gICAgICAgIGh0bWxTdHJpbmc6ICc8ZGl2IGNsYXNzPVwiYW5zd2VyQmxvY2tcIj48L2Rpdj4nLFxuICAgICAgICBsYXRleDogKCkgPT4gJ1xcXFxlbWJlZHthbnN3ZXJCbG9ja31bXScsXG4gICAgICB9KSk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5yZWdpc3RlcmVkRW1iZWRzKCkpLnRvRXF1YWwoWydhbnN3ZXJCbG9jayddKTtcbiAgICAgIC8vIFRoZSBtYWNybyB0YWdzIG91dHB1dCB3aXRoIGRhdGEtZW1iZWQgc28gQ1NTIGNhbiB0YXJnZXQgaXQsIHJlcGxhY2luZ1xuICAgICAgLy8gTWF0aFF1aWxsJ3MgaHRtbFN0cmluZyBob29rLlxuICAgICAgZXhwZWN0KGluc3RhbmNlLmdldE1hY3JvcygpLmFuc3dlckJsb2NrKS50b0VxdWFsKCdcXFxcaHRtbERhdGF7ZW1iZWQ9YW5zd2VyQmxvY2t9e1xcXFxwbGFjZWhvbGRlcnt9fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlZ2lzdGVycyBuZXdMaW5lIGFzIGEgaGFybWxlc3MgbWFjcm8gKGl0IGlzIGhhbmRsZWQgYnkgbGF0ZXgtYnJpZGdlKScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ25ld0xpbmUnLCAoKSA9PiAoeyBsYXRleDogKCkgPT4gJ1xcXFxlbWJlZHtuZXdMaW5lfVtdJyB9KSk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5nZXRNYWNyb3MoKS5uZXdMaW5lKS50b0VxdWFsKCdcXFxcaHRtbERhdGF7ZW1iZWQ9bmV3TGluZX17fScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhbGxzIGJhY2sgdG8gYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biBlbWJlZCcsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ3NvbWV0aGluZ0N1c3RvbScsICgpID0+ICh7IGh0bWxTdHJpbmc6ICc8Yj54PC9iPicgfSkpO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UuZ2V0TWFjcm9zKCkuc29tZXRoaW5nQ3VzdG9tKS50b0VxdWFsKCdcXFxcaHRtbERhdGF7ZW1iZWQ9c29tZXRoaW5nQ3VzdG9tfXtcXFxccGxhY2Vob2xkZXJ7fX0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdob25vdXJzIGFuIGV4cGxpY2l0IG1hdGhsaXZlTGF0ZXggZnJvbSB0aGUgZmFjdG9yeScsICgpID0+IHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ2N1c3RvbScsICgpID0+ICh7IG1hdGhsaXZlTGF0ZXg6ICdcXFxcYWxwaGEnIH0pKTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmdldE1hY3JvcygpLmN1c3RvbSkudG9FcXVhbCgnXFxcXGh0bWxEYXRhe2VtYmVkPWN1c3RvbX17XFxcXGFscGhhfScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IHRocm93IHdoZW4gdGhlIGZhY3RvcnkgdGhyb3dzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIGluc3RhbmNlLnJlZ2lzdGVyRW1iZWQoJ2JhZCcsICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Jvb20nKTtcbiAgICAgICAgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG5cbiAgICAgIGV4cGVjdChpbnN0YW5jZS5yZWdpc3RlcmVkRW1iZWRzKCkpLnRvRXF1YWwoWydiYWQnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBiYWQgYXJndW1lbnRzJywgKCkgPT4ge1xuICAgICAgaW5zdGFuY2UucmVnaXN0ZXJFbWJlZCh1bmRlZmluZWQsICgpID0+ICh7fSkpO1xuICAgICAgaW5zdGFuY2UucmVnaXN0ZXJFbWJlZCgnbm9GYWN0b3J5JywgdW5kZWZpbmVkKTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLnJlZ2lzdGVyZWRFbWJlZHMoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWx3YXlzIGluY2x1ZGVzIHRoZSBwaWUgbWFjcm8gc2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbWFjcm9zID0gaW5zdGFuY2UuZ2V0TWFjcm9zKCk7XG5cbiAgICAgIGV4cGVjdChtYWNyb3MucGFyYWxsZWxvZ3JhbSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChtYWNyb3MubG9uZ2RpdikudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChtYWNyb3MubmFwcHJveCkudG9FcXVhbCgnXFxcXG5vdFxcXFxhcHByb3gnKTtcbiAgICB9KTtcblxuICAgIC8vIEFyZ3VtZW50LXRha2luZyBtYWNyb3MgZXhpc3Qgb25seSBzbyBwcmV2aW91c2x5IGF1dGhvcmVkIGxhdGV4IHBhcnNlcy5cbiAgICAvLyBFZGl0aW5nIG5ldmVyIGdvZXMgdGhyb3VnaCB0aGVtOiBNYXRoTGl2ZSBzZXJpYWxpc2VzIGEgbWFjcm8gZnJvbSBpdHNcbiAgICAvLyBvcmlnaW5hbCBhcmd1bWVudHMsIHNvIHR5cGVkIGNvbnRlbnQgbmV2ZXIgY29tZXMgYmFjayBvdXQuXG4gICAgaXQoJ2FyZ3VtZW50LXRha2luZyBtYWNyb3MgYXJlIHBsYWluIHBhcnNlLW9ubHkgZGVmaW5pdGlvbnMnLCAoKSA9PiB7XG4gICAgICBbJ2xvbmdkaXYnLCAnb3ZlcmFyYycsICdhYnMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0eXBlb2YgaW5zdGFuY2UuUElFX01BQ1JPU1tuYW1lXSkudG9CZSgnc3RyaW5nJyk7XG4gICAgICAgIGV4cGVjdChpbnN0YW5jZS5QSUVfTUFDUk9TW25hbWVdKS50b0NvbnRhaW4oJyMxJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhcmd1bWVudC1sZXNzIHN5bWJvbHMgc3RheSBhdG9taWMnLCAoKSA9PiB7XG4gICAgICBbJ3BlcnBlbmRpY3VsYXInLCAnc3F1YXJlJywgJ2RlZ3JlZScsICduYXBwcm94JywgJ3BhcmFsbGVsb2dyYW0nXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGV4cGVjdCh0eXBlb2YgaW5zdGFuY2UuUElFX01BQ1JPU1tuYW1lXSkudG9CZSgnc3RyaW5nJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdsb25nZGl2IG1hdGNoZXMgdGhlIE1hdGhKYXggbWFjcm8gdXNlZCBieSBtYXRoLXJlbmRlcmluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5QSUVfTUFDUk9TLmxvbmdkaXYpLnRvRXF1YWwoJ1xcXFxlbmNsb3Nle2xvbmdkaXZ9eyMxfScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXBwbHlTdGF0aWNNYXRoJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCB3aXRob3V0IGFuIGVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UuYXBwbHlTdGF0aWNNYXRoKG51bGwsICd4JykpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWZlcnMgKHJldHVybnMgdW5kZWZpbmVkKSB3aGVuIE1hdGhMaXZlIGhhcyBub3QgbG9hZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZXhwZWN0KGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChlbCwgJ3gnKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbmRlcnMgc3luY2hyb25vdXNseSBvbmNlIE1hdGhMaXZlIGlzIGF2YWlsYWJsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGluc3RhbmNlLl9fc2V0TWF0aExpdmVGb3JUZXN0KHsgY29udmVydExhdGV4VG9NYXJrdXA6IChsKSA9PiBgPHNwYW4+JHtsfTwvc3Bhbj5gIH0pO1xuXG4gICAgICBleHBlY3QoaW5zdGFuY2UuYXBwbHlTdGF0aWNNYXRoKGVsLCAnXFxcXHBpJykpLnRvQmUoZWwpO1xuICAgICAgZXhwZWN0KGVsLmlubmVySFRNTCkudG9FcXVhbCgnPHNwYW4+XFxcXHBpPC9zcGFuPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhbGxzIGJhY2sgdG8gdGhlIGVsZW1lbnQgdGV4dENvbnRlbnQgd2hlbiBubyBsYXRleCBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBlbC50ZXh0Q29udGVudCA9ICdcXFxcdGhldGEnO1xuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBjb252ZXJ0TGF0ZXhUb01hcmt1cDogKGwpID0+IGA8aT4ke2x9PC9pPmAgfSk7XG4gICAgICBpbnN0YW5jZS5hcHBseVN0YXRpY01hdGgoZWwpO1xuXG4gICAgICBleHBlY3QoZWwuaW5uZXJIVE1MKS50b0VxdWFsKCc8aT5cXFxcdGhldGE8L2k+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnJpZGdlcyBzdG9yZWQgbGF0ZXggKG5ld0xpbmUgZW1iZWQpIGJlZm9yZSByZW5kZXJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IGNvbnZlcnRMYXRleFRvTWFya3VwOiAobCkgPT4gbCB9KTtcbiAgICAgIGluc3RhbmNlLmFwcGx5U3RhdGljTWF0aChlbCwgJ2FcXFxcZW1iZWR7bmV3TGluZX1bXWInKTtcblxuICAgICAgLy8gXFxlbWJlZHtuZXdMaW5lfVtdIG11c3QgYmVjb21lIGEgbXVsdGlsaW5lIGVudmlyb25tZW50XG4gICAgICBleHBlY3QoZWwuaW5uZXJIVE1MKS50b0NvbnRhaW4oJ2Rpc3BsYXlsaW5lcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29uZmlndXJlRm9udHMnLCAoKSA9PiB7XG4gICAgLy8gTWF0aExpdmUncyBkZWZhdWx0IGZvbnRzRGlyZWN0b3J5IGlzIHRoZSByZWxhdGl2ZSAnLi9mb250cy8nLCB3aGljaCBpdFxuICAgIC8vIHJlc29sdmVzIGFnYWluc3QgaXRzIG93biAoZW1wdHksIHdoZW4gYnVuZGxlZCkgc2NyaXB0IHVybCBhbmQgdGhyb3dzXG4gICAgLy8gXCJJbnZhbGlkIGJhc2UgVVJMXCIgZnJvbSBsb2FkRm9udHMuIFBhdGhzIG11c3QgYmVjb21lIGFic29sdXRlLlxuICAgIGl0KCdpcyBleHBvcnRlZCBhbmQgY2FsbGFibGUgYmVmb3JlIE1hdGhMaXZlIGxvYWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHR5cGVvZiBpbnN0YW5jZS5jb25maWd1cmVGb250cykudG9CZSgnZnVuY3Rpb24nKTtcbiAgICAgIGV4cGVjdCgoKSA9PiBpbnN0YW5jZS5jb25maWd1cmVGb250cygnL21hdGhsaXZlLWZvbnRzJykpLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBudWxsIHRvIGRpc2FibGUgZm9udCBsb2FkaW5nJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+IGluc3RhbmNlLmNvbmZpZ3VyZUZvbnRzKG51bGwpKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGxpZXMgYW4gYWJzb2x1dGUgdXJsIHRvIGFuIGFscmVhZHktbG9hZGVkIE1hdGhmaWVsZEVsZW1lbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBNYXRoZmllbGRFbGVtZW50ID0ge307XG5cbiAgICAgIC8vIHNpbXVsYXRlIGEgbG9hZGVkIGluc3RhbmNlXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQgfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cygnL21hdGhsaXZlLWZvbnRzJyk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKGAke2RvY3VtZW50LmJhc2VVUkkucmVwbGFjZSgvXFwvJC8sICcnKX0vbWF0aGxpdmUtZm9udHNgKTtcbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5LnN0YXJ0c1dpdGgoJ2h0dHAnKSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBmdWxseS1xdWFsaWZpZWQgdXJsIHVudG91Y2hlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IE1hdGhmaWVsZEVsZW1lbnQgPSB7fTtcblxuICAgICAgaW5zdGFuY2UuX19zZXRNYXRoTGl2ZUZvclRlc3QoeyBNYXRoZmllbGRFbGVtZW50IH0pO1xuICAgICAgaW5zdGFuY2UuY29uZmlndXJlRm9udHMoJ2h0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2ZvbnRzJyk7XG5cbiAgICAgIGV4cGVjdChNYXRoZmllbGRFbGVtZW50LmZvbnRzRGlyZWN0b3J5KS50b0VxdWFsKCdodHRwczovL2Nkbi5leGFtcGxlLmNvbS9mb250cycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBudWxsIHRocm91Z2ggcmF0aGVyIHRoYW4gcmVzb2x2aW5nIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgTWF0aGZpZWxkRWxlbWVudCA9IHt9O1xuXG4gICAgICBpbnN0YW5jZS5fX3NldE1hdGhMaXZlRm9yVGVzdCh7IE1hdGhmaWVsZEVsZW1lbnQgfSk7XG4gICAgICBpbnN0YW5jZS5jb25maWd1cmVGb250cyhudWxsKTtcblxuICAgICAgZXhwZWN0KE1hdGhmaWVsZEVsZW1lbnQuZm9udHNEaXJlY3RvcnkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYXRleFRvTWFya3VwJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGVtcHR5IHN0cmluZyB3aGVuIE1hdGhMaXZlIGlzIG5vdCBsb2FkZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaW5zdGFuY2UubGF0ZXhUb01hcmt1cCgnXFxcXHBpJykpLnRvRXF1YWwoJycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZW1wdHkgc3RyaW5nIGZvciBlbXB0eSBsYXRleCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChpbnN0YW5jZS5sYXRleFRvTWFya3VwKCcnKSkudG9FcXVhbCgnJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQUEsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFlBQU07RUFDbEMsSUFBSUMsUUFBUTtFQUVaQyxVQUFVLENBQUMsWUFBTTtJQUNmQyxJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO0lBQ25CO0lBQ0FILFFBQVEsR0FBR0ksT0FBTyxDQUFDLHNCQUFzQixDQUFDO0lBQzFDSixRQUFRLENBQUNLLGFBQWEsQ0FBQyxDQUFDO0VBQzFCLENBQUMsQ0FBQztFQUVGTixRQUFRLENBQUMsZUFBZSxFQUFFLFlBQU07SUFDOUJPLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxZQUFNO01BQzVETixRQUFRLENBQUNPLGFBQWEsQ0FBQyxhQUFhLEVBQUU7UUFBQSxPQUFPO1VBQzNDQyxVQUFVLEVBQUUsaUNBQWlDO1VBQzdDQyxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBQTtZQUFBLE9BQVEsd0JBQXdCO1VBQUE7UUFDdkMsQ0FBQztNQUFBLENBQUMsQ0FBQztNQUVIQyxNQUFNLENBQUNWLFFBQVEsQ0FBQ1csZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFD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QUM7TUFFMUNuQyxNQUFNLENBQUNvQyxnQkFBZ0IsQ0FBQ0MsY0FBYyxDQUFDLENBQUNuQyxPQUFPLElBQUE4QixNQUFBLENBQUlMLFFBQVEsQ0FBQ1csT0FBTyxDQUFDQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxvQkFBaUIsQ0FBQztNQUN4R3ZDLE1BQU0sQ0FBQ29DLGdCQUFnQixDQUFDQyxjQUFjLENBQUNHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQztJQUN2RSxDQUFDLENBQUM7SUFFRjFCLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxZQUFNO01BQ2pELElBQU13QyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7TUFFM0I5QyxRQUFRLENBQUN1QyxvQkFBb0IsQ0FBQztRQUFFTyxnQkFBZ0IsRUFBaEJBO01BQWlCLENBQUMsQ0FBQztNQUNuRDlDLFFBQVEsQ0FBQzZDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQztNQUV4RG5DLE1BQU0sQ0FBQ29DLGdCQUFnQixDQUFDQyxjQUFjLENBQUMsQ0FBQ25DLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztJQUNsRixDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLDhDQUE4QyxFQUFFLFlBQU07TUFDdkQsSUFBTXdDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztNQUUzQjlDLFFBQVEsQ0FBQ3VDLG9CQUFvQixDQUFDO1FBQUVPLGdCQUFnQixFQUFoQkE7TUFBaUIsQ0FBQyxDQUFDO01BQ25EOUMsUUFBUSxDQUFDNkMsY0FBYyxDQUFDLElBQUksQ0FBQztNQUU3Qm5DLE1BQU0sQ0FBQ29DLGdCQUFnQixDQUFDQyxjQUFjLENBQUMsQ0FBQ0ksUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZwRCxRQUFRLENBQUMsZUFBZSxFQUFFLFlBQU07SUFDOUJPLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxZQUFNO01BQzNESSxNQUFNLENBQUNWLFFBQVEsQ0FBQ29ELGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDeEMsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUNwRCxDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLHNDQUFzQyxFQUFFLFlBQU07TUFDL0NJLE1BQU0sQ0FBQ1YsUUFBUSxDQUFDb0QsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUN4QyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|
package/lib/keypad/index.js
CHANGED
|
@@ -101,21 +101,25 @@ var LabelHolder = (0, _styles.styled)('span', {
|
|
|
101
101
|
'&:has(.ML__mfrac)': {
|
|
102
102
|
paddingTop: '0.25em'
|
|
103
103
|
},
|
|
104
|
-
// Centre a fraction's bar between its empty slots
|
|
104
|
+
// Centre a fraction's bar between its empty slots. MathLive spaces the bar for
|
|
105
|
+
// text, but a slot is a taller `\rule` box, so the bar hugs the numerator's box.
|
|
106
|
+
// Measured on the real keypad: dropping it 0.07em centres it between two boxes, and 0.08em
|
|
107
|
+
// between a real numerator (`x`, whose ink ends at the baseline) and an empty
|
|
108
|
+
// denominator. Only the bar moves, not the slots. The numerator is the second
|
|
109
|
+
// `.ML__center` (MathLive emits the denominator first).
|
|
105
110
|
'& .ML__mfrac:has([data-pie-empty]) .ML__frac-line': {
|
|
106
111
|
position: 'relative',
|
|
107
|
-
top: '0.
|
|
112
|
+
top: '0.14em'
|
|
108
113
|
},
|
|
109
|
-
// A real numerator (`x`) is lighter than an empty box and its ink ends at the
|
|
110
|
-
// baseline, so the full drop overshoots: it needs a smaller drop. The numerator is
|
|
111
|
-
// the second `.ML__center` (MathLive emits the denominator first).
|
|
112
114
|
'& .ML__mfrac:has([data-pie-empty]):not(:has(.ML__center ~ .ML__center [data-pie-empty])) .ML__frac-line': {
|
|
113
115
|
top: '0.13em'
|
|
114
116
|
},
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
+
// A mixed number (`x` then the fraction): the leading `x` is a sibling of the
|
|
118
|
+
// fraction, which a lone `\frac{}{}` does not have, and the label's pixel
|
|
119
|
+
// rounding then lands the bar a row lower - so it takes a smaller drop. This
|
|
120
|
+
// also keeps the bar level with the `x`.
|
|
117
121
|
'& .ML__mfrac:has([data-pie-empty]):not(:only-child) .ML__frac-line': {
|
|
118
|
-
top: '0.
|
|
122
|
+
top: '0.1em'
|
|
119
123
|
}
|
|
120
124
|
}, _commonStyles.rootIndexStyles);
|
|
121
125
|
});
|
package/lib/keypad/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_longdiv","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","paddingTop","position","top","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","labelRef","React","createRef","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","fixLongDivisionWhenReady","current","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","prevState","componentWillUnmount","render","createElement","ref","includes","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","_this$keypadRef","keyPadElement","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\nimport { fixLongDivisionWhenReady } from '../longdiv';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A fraction is taller than the label's 1em line box, so its numerator sat\n // flush against (and was clipped by) the top edge. Extra room above it grows\n // the box, which the keypad then centres, so the fraction moves down a little.\n '&:has(.ML__mfrac)': {\n paddingTop: '0.25em',\n },\n // Centre a fraction's bar between its empty slots (see `placeholderStyles`).\n '& .ML__mfrac:has([data-pie-empty]) .ML__frac-line': {\n position: 'relative',\n top: '0.16em',\n },\n // A real numerator (`x`) is lighter than an empty box and its ink ends at the\n // baseline, so the full drop overshoots: it needs a smaller drop. The numerator is\n // the second `.ML__center` (MathLive emits the denominator first).\n '& .ML__mfrac:has([data-pie-empty]):not(:has(.ML__center ~ .ML__center [data-pie-empty])) .ML__frac-line': {\n top: '0.13em',\n },\n // Same for a mixed number (`x` then the fraction): the leading `x` is a sibling\n // of the fraction, which a lone `\\frac{}{}` does not have.\n '& .ML__mfrac:has([data-pie-empty]):not(:only-child) .ML__frac-line': {\n top: '0.13em',\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n this.labelRef = React.createRef();\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n // The long-division key's label needs MathLive's drawing corrected.\n fixLongDivisionWhenReady(this.labelRef.current);\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n\n if (this.state.markup !== (prevState && prevState.markup)) {\n fixLongDivisionWhenReady(this.labelRef.current);\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder\n ref={this.labelRef}\n slanted={SLANTED_LABELS.includes(this.props.latex)}\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_react","_interopRequireDefault","require","_propTypes","_Button","_IconButton","_styles","_debug","_lodashEs","_renderUi","_keys","_keysLayout","_commonStyles","_mathliveInstance","_longdiv","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","ownKeys","r","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","log","debug","SLANTED_LABELS","SLANT","SLANTED_STROKE","SLANTED_SCALE_Y","LabelHolder","styled","shouldForwardProp","prop","_ref","slanted","transform","concat","WebkitTextStroke","pointerEvents","textTransform","color","text","display","textAlign","lineHeight","maxWidth","overflow","backgroundColor","keypadEmptyPlaceholder","undefined","opacity","paddingTop","position","top","rootIndexStyles","LatexLabel","exports","_React$Component","props","_this","_classCallCheck2","state","markup","latexToMarkup","latex","labelRef","React","createRef","_inherits2","_createClass2","key","value","_componentDidMount","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","fixLongDivisionWhenReady","current","abrupt","loadMathLive","unmounted","setState","warned","stop","componentDidMount","componentDidUpdate","prevProps","prevState","componentWillUnmount","render","createElement","ref","includes","dangerouslySetInnerHTML","__html","Component","PropTypes","string","isRequired","createCustomLayout","layoutObj","gridTemplateColumns","columns","gridTemplateRows","rows","gridAutoFlow","KeyPadContainer","commonKeyboardStyles","width","gridRowGap","gridColumnGap","fontFamily","buttonBackground","category","keypadButtonOperator","keypadButton","keypadButtonOperatorHover","keypadButtonHover","StyledButton","Button","_ref2","isDelete","isComma","isDot","minWidth","fontSize","borderRadius","StyledLatexButtonWrapper","_ref3","padding","margin","StyledIconButton","IconButton","_ref4","height","KeyPad","_React$Component2","_this2","setKeypadInteraction","onPress","base","extras","flatten","_toConsumableArray2","sortKeys","noDecimal","write","label","keypadRef","_this$keypadRef","keyPadElement","mainContainer","closest","currentToolbar","controlledKeypadMode","mainContainerPosition","getBoundingClientRect","currentToolbarPosition","difference","totalHeight","style","addEventListener","handleKeypadInteraction","_this$keypadRef2","removeEventListener","_this3","_this$props","className","baseSet","additionalKeys","layoutForKeyPad","onFocus","mode","noBaseSet","keysWithoutBaseSet","allKeys","flowKeys","shift","Math","floor","join","map","k","index","command","extra","actions","extraProps","onClick","buttonClick","bind","disabled","keyIsNotAllowed","ariaLabel","name","_extends2","Icon","icon","tabIndex","size","bool","array","object","func","oneOfType","number","_default"],"sources":["../../src/keypad/index.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport { styled } from '@mui/material/styles';\nimport debug from 'debug';\nimport { flatten } from 'lodash-es';\nimport { color } from '@pie-lib/render-ui';\n\nimport { baseSet } from '../keys';\nimport { sortKeys } from './keys-layout';\nimport { commonKeyboardStyles, rootIndexStyles } from '../mf/common-styles';\nimport { loadMathLive, latexToMarkup } from '../mathlive-instance';\nimport { fixLongDivisionWhenReady } from '../longdiv';\n\nconst log = debug('pie-lib:math-input-mathlive:keypad');\n\n/**\n * A LaTeX keypad label.\n *\n * The MathQuill implementation rendered every LaTeX label as its own\n * `MQ.StaticMath` instance. Here each label is static HTML produced once by\n * `convertLatexToMarkup`, so a 40-key keypad no longer creates 40 live math\n * instances.\n */\n// Labels that the legacy keypad drew slanted. MathQuill styled `\\parallel` as\n// italic, which slants the two bars; MathLive draws it upright. A skew is used\n// rather than `font-style: italic` so the slant does not depend on the font\n// having an italic face for this glyph.\nconst SLANTED_LABELS = ['\\\\parallel'];\nconst SLANT = 'skewX(-15deg)';\n// MathLive's `∥` has hairline bars next to the radical sign and the other keys, so\n// they are thickened with a text stroke and stretched a little taller.\nconst SLANTED_STROKE = '0.03em currentColor';\nconst SLANTED_SCALE_Y = 1.25;\n\n// The `color.*()` helpers must be called lazily, inside the styled callback.\n// Evaluating them in a plain object literal runs them at module load, which\n// breaks any consumer that mocks a subset of @pie-lib/render-ui.\nconst LabelHolder = styled('span', { shouldForwardProp: (prop) => prop !== 'slanted' })(({ slanted }) => ({\n ...(slanted && {\n transform: `${SLANT} scaleY(${SLANTED_SCALE_Y})`,\n '& *': { WebkitTextStroke: SLANTED_STROKE },\n }),\n pointerEvents: 'none',\n textTransform: 'none',\n color: color.text(),\n // Deliberately inline-block, NOT inline-flex: MathLive's markup relies on\n // normal inline flow. Making its spans flex items collapses their width, and\n // stretchy accents render an <svg width=\"100%\" preserveAspectRatio=\"none\">\n // that then squeezes into a spike instead of spanning the content.\n display: 'inline-block',\n textAlign: 'center',\n lineHeight: 1,\n // Keep a label from sizing its grid column. `overflow: hidden` also collapses\n // the label's min-content contribution, so a wide accent cannot drag the\n // column across the screen. The svg's own positioning is left to\n // mathlive-static.css (injected by the package) - duplicating it here broke\n // the accent's containing block.\n maxWidth: '100%',\n overflow: 'hidden',\n // Answer-block / empty-slot boxes inside a label.\n '& .ML__placeholder': {\n backgroundColor: color.keypadEmptyPlaceholder ? color.keypadEmptyPlaceholder() : undefined,\n },\n // The stand-in glyph for an empty argument slot (see EMPTY_SLOT). Muted so it\n // reads as \"a slot goes here\" rather than as part of the symbol, matching how\n // MathQuill shaded `.mq-empty`.\n '& [data-pie-empty]': {\n opacity: 0.5,\n },\n // A fraction is taller than the label's 1em line box, so its numerator sat\n // flush against (and was clipped by) the top edge. Extra room above it grows\n // the box, which the keypad then centres, so the fraction moves down a little.\n '&:has(.ML__mfrac)': {\n paddingTop: '0.25em',\n },\n // Centre a fraction's bar between its empty slots. MathLive spaces the bar for\n // text, but a slot is a taller `\\rule` box, so the bar hugs the numerator's box.\n // Measured on the real keypad: dropping it 0.07em centres it between two boxes, and 0.08em\n // between a real numerator (`x`, whose ink ends at the baseline) and an empty\n // denominator. Only the bar moves, not the slots. The numerator is the second\n // `.ML__center` (MathLive emits the denominator first).\n '& .ML__mfrac:has([data-pie-empty]) .ML__frac-line': {\n position: 'relative',\n top: '0.14em',\n },\n '& .ML__mfrac:has([data-pie-empty]):not(:has(.ML__center ~ .ML__center [data-pie-empty])) .ML__frac-line': {\n top: '0.13em',\n },\n // A mixed number (`x` then the fraction): the leading `x` is a sibling of the\n // fraction, which a lone `\\frac{}{}` does not have, and the label's pixel\n // rounding then lands the bar a row lower - so it takes a smaller drop. This\n // also keeps the bar level with the `x`.\n '& .ML__mfrac:has([data-pie-empty]):not(:only-child) .ML__frac-line': {\n top: '0.1em',\n },\n // A readable index on the nth-root key. Carried by the label itself, not only\n // by the keypad container, so it holds wherever a LatexLabel is mounted.\n ...rootIndexStyles,\n}));\n\nexport class LatexLabel extends React.Component {\n static propTypes = {\n latex: PropTypes.string.isRequired,\n };\n\n constructor(props) {\n super(props);\n this.state = { markup: latexToMarkup(props.latex) };\n this.labelRef = React.createRef();\n }\n\n async componentDidMount() {\n // MathLive may not have finished loading when the keypad first mounts.\n if (this.state.markup) {\n // The long-division key's label needs MathLive's drawing corrected.\n fixLongDivisionWhenReady(this.labelRef.current);\n return;\n }\n\n await loadMathLive();\n\n if (this.unmounted) {\n return;\n }\n\n const markup = latexToMarkup(this.props.latex);\n\n if (markup) {\n this.setState({ markup });\n return;\n }\n\n // Still nothing: the engine is genuinely unavailable (a missing chunk, a\n // blocked request). Keep the raw-latex fallback visible rather than an\n // empty button, and log once so this is diagnosable.\n if (!LatexLabel.warned) {\n LatexLabel.warned = true;\n log('MathLive unavailable - keypad labels are falling back to raw latex');\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.latex !== this.props.latex) {\n this.setState({ markup: latexToMarkup(this.props.latex) });\n }\n\n if (this.state.markup !== (prevState && prevState.markup)) {\n fixLongDivisionWhenReady(this.labelRef.current);\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n render() {\n const { markup } = this.state;\n\n // Fall back to the raw latex so a button is never blank.\n return markup ? (\n // eslint-disable-next-line react/no-danger\n <LabelHolder\n ref={this.labelRef}\n slanted={SLANTED_LABELS.includes(this.props.latex)}\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n ) : (\n <LabelHolder slanted={SLANTED_LABELS.includes(this.props.latex)}>{this.props.latex}</LabelHolder>\n );\n }\n}\n\nconst createCustomLayout = (layoutObj) => {\n if (layoutObj) {\n return {\n gridTemplateColumns: `repeat(${layoutObj.columns}, minmax(min-content, 150px))`,\n gridTemplateRows: `repeat(${layoutObj.rows}, minmax(40px, 60px))`,\n gridAutoFlow: 'initial',\n };\n }\n\n return {};\n};\n\nconst KeyPadContainer = styled('div')(() => ({\n ...commonKeyboardStyles,\n width: '100%',\n display: 'grid',\n gridTemplateRows: 'repeat(5, minmax(40px, 60px))',\n gridRowGap: '0px',\n gridColumnGap: '0px',\n gridAutoFlow: 'column',\n '&.character': {\n textTransform: 'initial !important',\n gridTemplateRows: 'repeat(5, minmax(40px, 50px)) !important',\n },\n '&.language': {\n gridTemplateRows: 'repeat(4, minmax(40px, 50px)) !important',\n '& *': {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n },\n },\n}));\n\nconst buttonBackground = (category) => ({\n backgroundColor: category === 'operators' ? color.keypadButtonOperator() : color.keypadButton(),\n '&:hover': {\n backgroundColor: category === 'operators' ? color.keypadButtonOperatorHover() : color.keypadButtonHover(),\n },\n});\n\nconst StyledButton = styled(Button)(({ category, isDelete, isComma, isDot }) => ({\n minWidth: 'auto',\n textTransform: 'none',\n fontSize: isComma || isDot ? '200% !important' : '140% !important',\n lineHeight: isComma || isDot ? '100%' : 'normal',\n color: color.text(),\n ...buttonBackground(category),\n borderRadius: 0,\n ...(isDelete && {\n fontFamily: 'Roboto, Helvetica, Arial, sans-serif !important',\n }),\n}));\n\nconst StyledLatexButtonWrapper = styled(Button)(({ category }) => ({\n textTransform: 'none',\n padding: 0,\n margin: 0,\n fontSize: '110% !important',\n minWidth: 'auto',\n borderRadius: 0,\n ...buttonBackground(category),\n}));\n\nconst StyledIconButton = styled(IconButton)(({ category }) => ({\n minWidth: 'auto',\n ...buttonBackground(category),\n borderRadius: 0,\n '& .icon': {\n height: '30px',\n },\n}));\n\nexport class KeyPad extends React.Component {\n static propTypes = {\n className: PropTypes.string,\n controlledKeypadMode: PropTypes.bool,\n baseSet: PropTypes.array,\n additionalKeys: PropTypes.array,\n layoutForKeyPad: PropTypes.object,\n onPress: PropTypes.func.isRequired,\n onFocus: PropTypes.func,\n noDecimal: PropTypes.bool,\n setKeypadInteraction: PropTypes.func,\n mode: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n };\n\n static defaultProps = {\n baseSet: baseSet,\n noDecimal: false,\n };\n\n constructor(props) {\n super(props);\n this.keypadRef = React.createRef();\n }\n\n componentDidMount() {\n // Ensure MathLive is available for the LaTeX labels.\n loadMathLive();\n\n const keyPadElement = this.keypadRef?.current;\n const mainContainer = keyPadElement?.closest('.main-container');\n const currentToolbar = keyPadElement?.closest('.pie-toolbar');\n\n // need only for math keyboard so we need also controlledKeypadMode\n if (this.props.controlledKeypadMode && mainContainer && currentToolbar) {\n const mainContainerPosition = mainContainer.getBoundingClientRect();\n const currentToolbarPosition = currentToolbar.getBoundingClientRect();\n const difference =\n mainContainerPosition.top +\n mainContainerPosition.height -\n (currentToolbarPosition.top + currentToolbarPosition.height);\n\n if (difference < 0) {\n const totalHeight = mainContainerPosition.height + mainContainerPosition.top - difference;\n\n mainContainer.style.height = `${totalHeight}px`;\n }\n }\n\n if (keyPadElement) {\n keyPadElement.addEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.addEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n componentWillUnmount() {\n const keyPadElement = this.keypadRef?.current;\n\n if (this.props.controlledKeypadMode && keyPadElement) {\n const mainContainer = keyPadElement.closest('.main-container');\n\n if (mainContainer) {\n mainContainer.style.height = 'unset';\n }\n }\n\n if (keyPadElement) {\n keyPadElement.removeEventListener('touchstart', this.handleKeypadInteraction, true);\n keyPadElement.removeEventListener('mousedown', this.handleKeypadInteraction, true);\n }\n }\n\n handleKeypadInteraction = () => {\n if (this.props.setKeypadInteraction) {\n this.props.setKeypadInteraction(true);\n }\n };\n\n buttonClick = (key) => {\n log('[buttonClick]', key);\n this.props.onPress(key);\n };\n\n flowKeys = (base, extras) => flatten([...sortKeys(base), ...sortKeys(extras)]);\n\n keyIsNotAllowed = (key) => {\n const { noDecimal } = this.props;\n\n return !!(((key.write === '.' && key.label === '.') || (key.write === ',' && key.label === ',')) && noDecimal);\n };\n\n render() {\n const { className, baseSet: base, additionalKeys, layoutForKeyPad, onFocus, mode } = this.props;\n\n const noBaseSet = ['non-negative-integers', 'integers', 'decimals', 'fractions', 'item-authoring', 'language'];\n const keysWithoutBaseSet = noBaseSet.includes(mode);\n const allKeys = keysWithoutBaseSet\n ? this.flowKeys([], additionalKeys || [])\n : this.flowKeys(base, additionalKeys || []);\n\n const shift = allKeys.length % 5 ? 1 : 0;\n const style = {\n gridTemplateColumns: `repeat(${Math.floor(allKeys.length / 5) + shift}, minmax(min-content, 150px))`,\n ...createCustomLayout(layoutForKeyPad),\n };\n\n return (\n <KeyPadContainer\n ref={this.keypadRef}\n className={[className, mode].filter(Boolean).join(' ')}\n style={style}\n onFocus={onFocus}\n >\n {allKeys.map((k, index) => {\n if (!k) {\n return <span key={`empty-${index}`} />;\n }\n\n const key = `${k.label || k.latex || k.command}-${index}`;\n const category = !keysWithoutBaseSet ? k.category : undefined;\n const extra = { ...(k.actions || {}), ...(k.extraProps || {}) };\n const onClick = this.buttonClick.bind(this, k);\n const disabled = this.keyIsNotAllowed(k);\n const ariaLabel = k.ariaLabel ? k.ariaLabel : k.name || k.label;\n\n if (k.latex) {\n return (\n <StyledLatexButtonWrapper\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n aria-label={ariaLabel}\n {...extra}\n >\n <LatexLabel latex={k.latex} />\n </StyledLatexButtonWrapper>\n );\n }\n\n if (k.label) {\n return (\n <StyledButton\n key={key}\n onClick={onClick}\n disabled={disabled}\n category={category}\n isDelete={k.label === '⌫'}\n isComma={k.label === ','}\n isDot={k.label === '.'}\n aria-label={ariaLabel}\n {...extra}\n >\n {k.label}\n </StyledButton>\n );\n }\n\n const Icon = k.icon ? k.icon : 'div';\n\n return (\n <StyledIconButton\n key={key}\n tabIndex={'-1'}\n onClick={onClick}\n disabled={disabled}\n category={category}\n size=\"large\"\n {...extra}\n >\n <Icon className=\"icon\" />\n </StyledIconButton>\n );\n })}\n </KeyPadContainer>\n );\n }\n}\n\nexport default KeyPad;\n"],"mappings":"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","ignoreList":[]}
|