@pie-lib/math-input-mathlive 1.0.12 → 1.0.13
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__/composites.test.js +255 -0
- package/lib/__tests__/drop-in-compat.test.js +133 -0
- package/lib/__tests__/index.test.js +118 -0
- package/lib/__tests__/input-imperative.test.js +155 -0
- package/lib/__tests__/keypad-label.test.js +216 -0
- package/lib/__tests__/keypad-render.test.js +206 -0
- package/lib/__tests__/latex-bridge.test.js +301 -0
- package/lib/__tests__/mathlive-instance.test.js +415 -0
- package/lib/__tests__/mount-race.test.js +198 -0
- package/lib/__tests__/static-prompts.test.js +405 -0
- package/lib/__tests__/tmp-markup.test.js +26 -0
- package/lib/keypad/index.js +4 -4
- package/lib/keypad/index.js.map +1 -1
- package/lib/mathlive-instance.js +6 -1
- package/lib/mathlive-instance.js.map +1 -1
- package/lib/mf/common-styles.js +41 -6
- package/lib/mf/common-styles.js.map +1 -1
- package/lib/mf/index.js +6 -0
- package/lib/mf/index.js.map +1 -1
- package/lib/mf/static.js +2 -2
- package/lib/mf/static.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/keypad-label.test.jsx +73 -0
- package/src/__tests__/mathlive-instance.test.js +22 -0
- package/src/keypad/index.jsx +4 -1
- package/src/mathlive-instance.js +6 -1
- package/src/mf/common-styles.js +45 -4
- package/src/mf/index.js +2 -0
- package/src/mf/static.jsx +4 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _latexBridge = require("../latex-bridge");
|
|
5
|
+
var _input = _interopRequireDefault(require("../mf/input"));
|
|
6
|
+
/**
|
|
7
|
+
* The imperative surface that @pie-lib/math-toolbar drives
|
|
8
|
+
* (editor-and-pad.jsx: clear/command/keystroke/write/latex).
|
|
9
|
+
*
|
|
10
|
+
* These call the methods against a stub mathfield, because a real
|
|
11
|
+
* <math-field> needs a browser. What matters here is the *translation*:
|
|
12
|
+
* MathQuill-era arguments must become valid MathLive operations.
|
|
13
|
+
*/
|
|
14
|
+
var stubField = function stubField() {
|
|
15
|
+
var calls = {
|
|
16
|
+
insert: [],
|
|
17
|
+
executeCommand: [],
|
|
18
|
+
focus: 0
|
|
19
|
+
};
|
|
20
|
+
return {
|
|
21
|
+
calls: calls,
|
|
22
|
+
value: '',
|
|
23
|
+
getValue: function getValue() {
|
|
24
|
+
return '';
|
|
25
|
+
},
|
|
26
|
+
insert: function insert(v) {
|
|
27
|
+
calls.insert.push(v);
|
|
28
|
+
},
|
|
29
|
+
executeCommand: function executeCommand(v) {
|
|
30
|
+
calls.executeCommand.push(v);
|
|
31
|
+
},
|
|
32
|
+
focus: function focus() {
|
|
33
|
+
calls.focus++;
|
|
34
|
+
},
|
|
35
|
+
blur: function blur() {}
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
var withField = function withField() {
|
|
39
|
+
var input = new _input["default"]({});
|
|
40
|
+
var f = stubField();
|
|
41
|
+
input.mathField = f;
|
|
42
|
+
return {
|
|
43
|
+
input: input,
|
|
44
|
+
f: f
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
describe('Input imperative API (drives math-toolbar)', function () {
|
|
48
|
+
describe('keystroke', function () {
|
|
49
|
+
it('maps MathQuill keystroke names to MathLive selectors', function () {
|
|
50
|
+
var _withField = withField(),
|
|
51
|
+
input = _withField.input,
|
|
52
|
+
f = _withField.f;
|
|
53
|
+
input.keystroke('Left');
|
|
54
|
+
input.keystroke('Right');
|
|
55
|
+
input.keystroke('Backspace');
|
|
56
|
+
expect(f.calls.executeCommand).toEqual(['moveToPreviousChar', 'moveToNextChar', 'deleteBackward']);
|
|
57
|
+
});
|
|
58
|
+
it('passes an unknown value through as a selector', function () {
|
|
59
|
+
var _withField2 = withField(),
|
|
60
|
+
input = _withField2.input,
|
|
61
|
+
f = _withField2.f;
|
|
62
|
+
input.keystroke('deleteForward');
|
|
63
|
+
expect(f.calls.executeCommand).toEqual(['deleteForward']);
|
|
64
|
+
});
|
|
65
|
+
it('does not throw when the engine rejects the selector', function () {
|
|
66
|
+
var _withField3 = withField(),
|
|
67
|
+
input = _withField3.input;
|
|
68
|
+
input.mathField.executeCommand = function () {
|
|
69
|
+
throw new Error('unknown command');
|
|
70
|
+
};
|
|
71
|
+
expect(function () {
|
|
72
|
+
return input.keystroke('Nonsense');
|
|
73
|
+
}).not.toThrow();
|
|
74
|
+
});
|
|
75
|
+
it('covers every keystroke the keypad emits', function () {
|
|
76
|
+
// navigation.js / edit.js only produce these three
|
|
77
|
+
['Left', 'Right', 'Backspace'].forEach(function (k) {
|
|
78
|
+
return expect(_latexBridge.KEYSTROKES[k]).toBeDefined();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('command', function () {
|
|
83
|
+
it('expands argument-taking commands into placeholders', function () {
|
|
84
|
+
var _withField4 = withField(),
|
|
85
|
+
input = _withField4.input,
|
|
86
|
+
f = _withField4.f;
|
|
87
|
+
input.command('\\frac');
|
|
88
|
+
|
|
89
|
+
// a bare \frac would give no editable slots
|
|
90
|
+
expect(f.calls.insert).toEqual(['\\frac{#?}{#?}']);
|
|
91
|
+
});
|
|
92
|
+
it('handles array commands', function () {
|
|
93
|
+
var _withField5 = withField(),
|
|
94
|
+
input = _withField5.input,
|
|
95
|
+
f = _withField5.f;
|
|
96
|
+
input.command(['\\log', '_']);
|
|
97
|
+
expect(f.calls.insert).toEqual(['\\log_{#?}']);
|
|
98
|
+
});
|
|
99
|
+
it('passes argument-less commands through', function () {
|
|
100
|
+
var _withField6 = withField(),
|
|
101
|
+
input = _withField6.input,
|
|
102
|
+
f = _withField6.f;
|
|
103
|
+
input.command('\\pi');
|
|
104
|
+
expect(f.calls.insert).toEqual(['\\pi']);
|
|
105
|
+
});
|
|
106
|
+
it('agrees with keyToAction', function () {
|
|
107
|
+
expect((0, _latexBridge.keyToAction)({
|
|
108
|
+
command: '\\sqrt'
|
|
109
|
+
}).value).toEqual('\\sqrt{#?}');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('safety before MathLive loads', function () {
|
|
113
|
+
it('every method is a no-op rather than a crash', function () {
|
|
114
|
+
var input = new _input["default"]({});
|
|
115
|
+
|
|
116
|
+
// mathField is undefined until loadMathLive() resolves
|
|
117
|
+
expect(input.latex()).toEqual('');
|
|
118
|
+
expect(input.clear()).toEqual('');
|
|
119
|
+
expect(input.command('\\frac')).toEqual('');
|
|
120
|
+
expect(input.keystroke('Left')).toEqual('');
|
|
121
|
+
expect(input.write('x')).toEqual('');
|
|
122
|
+
expect(function () {
|
|
123
|
+
return input.focus();
|
|
124
|
+
}).not.toThrow();
|
|
125
|
+
expect(function () {
|
|
126
|
+
return input.blur();
|
|
127
|
+
}).not.toThrow();
|
|
128
|
+
expect(function () {
|
|
129
|
+
return input.setLatex('x');
|
|
130
|
+
}).not.toThrow();
|
|
131
|
+
expect(input.element).toBeUndefined();
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('mqCompat facade', function () {
|
|
135
|
+
// math-toolbar used to call this.input.mathField.latex(); external
|
|
136
|
+
// consumers may still do the same.
|
|
137
|
+
it('exposes latex() as a getter', function () {
|
|
138
|
+
var _withField7 = withField(),
|
|
139
|
+
input = _withField7.input;
|
|
140
|
+
input.mathField.getValue = function () {
|
|
141
|
+
return '\\frac{1}{2}';
|
|
142
|
+
};
|
|
143
|
+
expect(input.mqCompat.latex()).toEqual('\\frac{1}{2}');
|
|
144
|
+
});
|
|
145
|
+
it('exposes latex(v) as a setter and el()', function () {
|
|
146
|
+
var _withField8 = withField(),
|
|
147
|
+
input = _withField8.input,
|
|
148
|
+
f = _withField8.f;
|
|
149
|
+
input.mqCompat.latex('x+1');
|
|
150
|
+
expect(f.value).toEqual('x+1');
|
|
151
|
+
expect(input.mqCompat.el()).toBe(f);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiX2lucHV0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInN0dWJGaWVsZCIsImNhbGxzIiwiaW5zZXJ0IiwiZXhlY3V0ZUNvbW1hbmQiLCJmb2N1cyIsInZhbHVlIiwiZ2V0VmFsdWUiLCJ2IiwicHVzaCIsImJsdXIiLCJ3aXRoRmllbGQiLCJpbnB1dCIsIklucHV0IiwiZiIsIm1hdGhGaWVsZCIsImRlc2NyaWJlIiwiaXQiLCJfd2l0aEZpZWxkIiwia2V5c3Ryb2tlIiwiZXhwZWN0IiwidG9FcXVhbCIsIl93aXRoRmllbGQyIiwiX3dpdGhGaWVsZDMiLCJFcnJvciIsIm5vdCIsInRvVGhyb3ciLCJmb3JFYWNoIiwiayIsIktFWVNUUk9LRVMiLCJ0b0JlRGVmaW5lZCIsIl93aXRoRmllbGQ0IiwiY29tbWFuZCIsIl93aXRoRmllbGQ1IiwiX3dpdGhGaWVsZDYiLCJrZXlUb0FjdGlvbiIsImxhdGV4IiwiY2xlYXIiLCJ3cml0ZSIsInNldExhdGV4IiwiZWxlbWVudCIsInRvQmVVbmRlZmluZWQiLCJfd2l0aEZpZWxkNyIsIm1xQ29tcGF0IiwiX3dpdGhGaWVsZDgiLCJlbCIsInRvQmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2lucHV0LWltcGVyYXRpdmUudGVzdC5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS0VZU1RST0tFUywga2V5VG9BY3Rpb24gfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IElucHV0IGZyb20gJy4uL21mL2lucHV0JztcblxuLyoqXG4gKiBUaGUgaW1wZXJhdGl2ZSBzdXJmYWNlIHRoYXQgQHBpZS1saWIvbWF0aC10b29sYmFyIGRyaXZlc1xuICogKGVkaXRvci1hbmQtcGFkLmpzeDogY2xlYXIvY29tbWFuZC9rZXlzdHJva2Uvd3JpdGUvbGF0ZXgpLlxuICpcbiAqIFRoZXNlIGNhbGwgdGhlIG1ldGhvZHMgYWdhaW5zdCBhIHN0dWIgbWF0aGZpZWxkLCBiZWNhdXNlIGEgcmVhbFxuICogPG1hdGgtZmllbGQ+IG5lZWRzIGEgYnJvd3Nlci4gV2hhdCBtYXR0ZXJzIGhlcmUgaXMgdGhlICp0cmFuc2xhdGlvbio6XG4gKiBNYXRoUXVpbGwtZXJhIGFyZ3VtZW50cyBtdXN0IGJlY29tZSB2YWxpZCBNYXRoTGl2ZSBvcGVyYXRpb25zLlxuICovXG5jb25zdCBzdHViRmllbGQgPSAoKSA9PiB7XG4gIGNvbnN0IGNhbGxzID0geyBpbnNlcnQ6IFtdLCBleGVjdXRlQ29tbWFuZDogW10sIGZvY3VzOiAwIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjYWxscyxcbiAgICB2YWx1ZTogJycsXG4gICAgZ2V0VmFsdWU6ICgpID0+ICcnLFxuICAgIGluc2VydCh2KSB7XG4gICAgICBjYWxscy5pbnNlcnQucHVzaCh2KTtcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21tYW5kKHYpIHtcbiAgICAgIGNhbGxzLmV4ZWN1dGVDb21tYW5kLnB1c2godik7XG4gICAgfSxcbiAgICBmb2N1cygpIHtcbiAgICAgIGNhbGxzLmZvY3VzKys7XG4gICAgfSxcbiAgICBibHVyKCkge30sXG4gIH07XG59O1xuXG5jb25zdCB3aXRoRmllbGQgPSAoKSA9PiB7XG4gIGNvbnN0IGlucHV0ID0gbmV3IElucHV0KHt9KTtcbiAgY29uc3QgZiA9IHN0dWJGaWVsZCgpO1xuXG4gIGlucHV0Lm1hdGhGaWVsZCA9IGY7XG5cbiAgcmV0dXJuIHsgaW5wdXQsIGYgfTtcbn07XG5cbmRlc2NyaWJlKCdJbnB1dCBpbXBlcmF0aXZlIEFQSSAoZHJpdmVzIG1hdGgtdG9vbGJhciknLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdrZXlzdHJva2UnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgTWF0aFF1aWxsIGtleXN0cm9rZSBuYW1lcyB0byBNYXRoTGl2ZSBzZWxlY3RvcnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCBmIH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQua2V5c3Ryb2tlKCdMZWZ0Jyk7XG4gICAgICBpbnB1dC5rZXlzdHJva2UoJ1JpZ2h0Jyk7XG4gICAgICBpbnB1dC5rZXlzdHJva2UoJ0JhY2tzcGFjZScpO1xuXG4gICAgICBleHBlY3QoZi5jYWxscy5leGVjdXRlQ29tbWFuZCkudG9FcXVhbChbJ21vdmVUb1ByZXZpb3VzQ2hhcicsICdtb3ZlVG9OZXh0Q2hhcicsICdkZWxldGVCYWNrd2FyZCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgYW4gdW5rbm93biB2YWx1ZSB0aHJvdWdoIGFzIGEgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0LCBmIH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQua2V5c3Ryb2tlKCdkZWxldGVGb3J3YXJkJyk7XG5cbiAgICAgIGV4cGVjdChmLmNhbGxzLmV4ZWN1dGVDb21tYW5kKS50b0VxdWFsKFsnZGVsZXRlRm9yd2FyZCddKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCB0aHJvdyB3aGVuIHRoZSBlbmdpbmUgcmVqZWN0cyB0aGUgc2VsZWN0b3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQubWF0aEZpZWxkLmV4ZWN1dGVDb21tYW5kID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCcpO1xuICAgICAgfTtcblxuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LmtleXN0cm9rZSgnTm9uc2Vuc2UnKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3ZlcnMgZXZlcnkga2V5c3Ryb2tlIHRoZSBrZXlwYWQgZW1pdHMnLCAoKSA9PiB7XG4gICAgICAvLyBuYXZpZ2F0aW9uLmpzIC8gZWRpdC5qcyBvbmx5IHByb2R1Y2UgdGhlc2UgdGhyZWVcbiAgICAgIFsnTGVmdCcsICdSaWdodCcsICdCYWNrc3BhY2UnXS5mb3JFYWNoKChrKSA9PiBleHBlY3QoS0VZU1RST0tFU1trXSkudG9CZURlZmluZWQoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb21tYW5kJywgKCkgPT4ge1xuICAgIGl0KCdleHBhbmRzIGFyZ3VtZW50LXRha2luZyBjb21tYW5kcyBpbnRvIHBsYWNlaG9sZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKCdcXFxcZnJhYycpO1xuXG4gICAgICAvLyBhIGJhcmUgXFxmcmFjIHdvdWxkIGdpdmUgbm8gZWRpdGFibGUgc2xvdHNcbiAgICAgIGV4cGVjdChmLmNhbGxzLmluc2VydCkudG9FcXVhbChbJ1xcXFxmcmFjeyM/fXsjP30nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFuZGxlcyBhcnJheSBjb21tYW5kcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKFsnXFxcXGxvZycsICdfJ10pO1xuXG4gICAgICBleHBlY3QoZi5jYWxscy5pbnNlcnQpLnRvRXF1YWwoWydcXFxcbG9nX3sjP30nXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGFyZ3VtZW50LWxlc3MgY29tbWFuZHMgdGhyb3VnaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5jb21tYW5kKCdcXFxccGknKTtcblxuICAgICAgZXhwZWN0KGYuY2FsbHMuaW5zZXJ0KS50b0VxdWFsKFsnXFxcXHBpJ10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FncmVlcyB3aXRoIGtleVRvQWN0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGtleVRvQWN0aW9uKHsgY29tbWFuZDogJ1xcXFxzcXJ0JyB9KS52YWx1ZSkudG9FcXVhbCgnXFxcXHNxcnR7Iz99Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzYWZldHkgYmVmb3JlIE1hdGhMaXZlIGxvYWRzJywgKCkgPT4ge1xuICAgIGl0KCdldmVyeSBtZXRob2QgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhIGNyYXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBuZXcgSW5wdXQoe30pO1xuXG4gICAgICAvLyBtYXRoRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsIGxvYWRNYXRoTGl2ZSgpIHJlc29sdmVzXG4gICAgICBleHBlY3QoaW5wdXQubGF0ZXgoKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQuY2xlYXIoKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQuY29tbWFuZCgnXFxcXGZyYWMnKSkudG9FcXVhbCgnJyk7XG4gICAgICBleHBlY3QoaW5wdXQua2V5c3Ryb2tlKCdMZWZ0JykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KGlucHV0LndyaXRlKCd4JykpLnRvRXF1YWwoJycpO1xuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LmZvY3VzKCkpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoKCkgPT4gaW5wdXQuYmx1cigpKS5ub3QudG9UaHJvdygpO1xuICAgICAgZXhwZWN0KCgpID0+IGlucHV0LnNldExhdGV4KCd4JykpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoaW5wdXQuZWxlbWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbXFDb21wYXQgZmFjYWRlJywgKCkgPT4ge1xuICAgIC8vIG1hdGgtdG9vbGJhciB1c2VkIHRvIGNhbGwgdGhpcy5pbnB1dC5tYXRoRmllbGQubGF0ZXgoKTsgZXh0ZXJuYWxcbiAgICAvLyBjb25zdW1lcnMgbWF5IHN0aWxsIGRvIHRoZSBzYW1lLlxuICAgIGl0KCdleHBvc2VzIGxhdGV4KCkgYXMgYSBnZXR0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB3aXRoRmllbGQoKTtcblxuICAgICAgaW5wdXQubWF0aEZpZWxkLmdldFZhbHVlID0gKCkgPT4gJ1xcXFxmcmFjezF9ezJ9JztcblxuICAgICAgZXhwZWN0KGlucHV0Lm1xQ29tcGF0LmxhdGV4KCkpLnRvRXF1YWwoJ1xcXFxmcmFjezF9ezJ9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZXhwb3NlcyBsYXRleCh2KSBhcyBhIHNldHRlciBhbmQgZWwoKScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQsIGYgfSA9IHdpdGhGaWVsZCgpO1xuXG4gICAgICBpbnB1dC5tcUNvbXBhdC5sYXRleCgneCsxJyk7XG4gICAgICBleHBlY3QoZi52YWx1ZSkudG9FcXVhbCgneCsxJyk7XG4gICAgICBleHBlY3QoaW5wdXQubXFDb21wYXQuZWwoKSkudG9CZShmKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1HLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFBLEVBQVM7RUFDdEIsSUFBTUMsS0FBSyxHQUFHO0lBQUVDLE1BQU0sRUFBRSxFQUFFO0lBQUVDLGNBQWMsRUFBRSxFQUFFO0lBQUVDLEtBQUssRUFBRTtFQUFFLENBQUM7RUFFMUQsT0FBTztJQUNMSCxLQUFLLEVBQUxBLEtBQUs7SUFDTEksS0FBSyxFQUFFLEVBQUU7SUFDVEMsUUFBUSxFQUFFLFNBQVZBLFFBQVFBLENBQUE7TUFBQSxPQUFRLEVBQUU7SUFBQTtJQUNsQkosTUFBTSxXQUFOQSxNQUFNQSxDQUFDSyxDQUFDLEVBQUU7TUFDUk4sS0FBSyxDQUFDQyxNQUFNLENBQUNNLElBQUksQ0FBQ0QsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDREosY0FBYyxXQUFkQSxjQUFjQSxDQUFDSSxDQUFDLEVBQUU7TUFDaEJOLEtBQUssQ0FBQ0UsY0FBYyxD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
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
5
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
6
|
+
var _latexBridge = require("../latex-bridge");
|
|
7
|
+
/**
|
|
8
|
+
* Keys use empty groups to show a command's shape (`\frac{}{}`, `x^{}`).
|
|
9
|
+
* MathLive renders `{}` as nothing, so labels need a visible stand-in - but the
|
|
10
|
+
* value that gets *inserted* must stay untouched.
|
|
11
|
+
*/
|
|
12
|
+
describe('keypad label display normalisation', function () {
|
|
13
|
+
it('gives empty groups a visible glyph', function () {
|
|
14
|
+
var out = (0, _latexBridge.withVisibleEmptySlots)('\\frac{}{}');
|
|
15
|
+
expect(out).not.toEqual('\\frac{}{}');
|
|
16
|
+
// a \rule, not a glyph: font metrics for a substituted glyph do not match
|
|
17
|
+
// MathLive's, which left stretchy accents narrower than the box
|
|
18
|
+
expect(out).toContain('\\rule');
|
|
19
|
+
expect(out).toContain('pie-empty');
|
|
20
|
+
});
|
|
21
|
+
it('handles every empty-group key shape', function () {
|
|
22
|
+
['\\frac{}{}', '\\overline{}', 'x^{}', 'x_{}', '\\sqrt{}', '\\sqrt[{}]{}', '\\abs{}', '\\log_{}', '\\longdiv{}'].forEach(function (latex) {
|
|
23
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).not.toContain('{}');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it('treats a whitespace-only group as empty', function () {
|
|
27
|
+
// e.g. \frac{x}{ }
|
|
28
|
+
expect((0, _latexBridge.withVisibleEmptySlots)('\\frac{x}{ }')).toContain('pie-empty');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// MathQuill needed a nested \overline{} to draw the empty box. MathLive
|
|
32
|
+
// renders that as a real line, so those labels showed a spurious bar (a line
|
|
33
|
+
// under the arrows, and a straight line instead of the arc).
|
|
34
|
+
it('accent keys do not carry the nested-overline box hack', function () {
|
|
35
|
+
// eslint-disable-next-line global-require
|
|
36
|
+
var geometry = require('../keys/geometry');
|
|
37
|
+
Object.values(geometry).forEach(function (key) {
|
|
38
|
+
if (key && typeof key.latex === 'string') {
|
|
39
|
+
expect(key.latex).not.toContain('\\overline{}}');
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
it('an accent over an empty slot still gets a visible box', function () {
|
|
44
|
+
['\\overleftrightarrow{}', '\\overarc{}'].forEach(function (latex) {
|
|
45
|
+
var out = (0, _latexBridge.withVisibleEmptySlots)(latex);
|
|
46
|
+
expect(out).toContain('pie-empty');
|
|
47
|
+
expect(out).not.toContain('\\overline');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// A glyph's width comes from font metrics; U+25AB is not in the KaTeX fonts,
|
|
52
|
+
// so the browser substituted a wider one and stretchy accents came out
|
|
53
|
+
// narrower than the box. A rule has an explicit width.
|
|
54
|
+
it('the empty slot has an explicit width, not font-dependent metrics', function () {
|
|
55
|
+
var out = (0, _latexBridge.withVisibleEmptySlots)('\\overarc{}');
|
|
56
|
+
expect(out).toContain('\\rule');
|
|
57
|
+
expect(out).toMatch(/rule\{[\d.]+em\}\{[\d.]+em\}/);
|
|
58
|
+
expect(out).not.toContain('unicode');
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Measured in the browser: the accent's immediate wrapper computes to 0px
|
|
62
|
+
// (its .ML__stretchy child is absolutely positioned), so the svg width has to
|
|
63
|
+
// resolve against .ML__base - whose width equals the content. Without pinning
|
|
64
|
+
// that, the arc collapsed to a spike and sat right of the box.
|
|
65
|
+
it('pins the accent containing block and drops the centering shift', function () {
|
|
66
|
+
// eslint-disable-next-line global-require
|
|
67
|
+
var _require = require('../mf/common-styles'),
|
|
68
|
+
placeholderStyles = _require.placeholderStyles;
|
|
69
|
+
expect(placeholderStyles['& .ML__base'].position).toEqual('relative');
|
|
70
|
+
expect(placeholderStyles['& .ML__stretchy']).toEqual({
|
|
71
|
+
position: 'absolute',
|
|
72
|
+
left: 0,
|
|
73
|
+
width: '100%'
|
|
74
|
+
});
|
|
75
|
+
// must be !important: MathLive writes margin-left as an inline style, and a
|
|
76
|
+
// class cannot override that. Leaving it un-important also halved the arc's
|
|
77
|
+
// width, because .ML__center is the stretchy's containing block.
|
|
78
|
+
expect(placeholderStyles['& .ML__center:has(.ML__stretchy)'].marginLeft).toEqual('0 !important');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// MathLive sets the index of \sqrt[n]{x} in scriptscriptstyle - an inline
|
|
82
|
+
// `font-size: 50%` - which is too small to read on the nth-root key and in
|
|
83
|
+
// authored radicals. It is scaled up by half, to 75%.
|
|
84
|
+
describe('radical index size', function () {
|
|
85
|
+
// Real MathLive 0.110 output for `\sqrt[1]{2}`, trimmed to the index. The
|
|
86
|
+
// selector walks this exact chain, so this fixture is what pins it down.
|
|
87
|
+
var INDEX_MARKUP = "\n <span class=\"ML__base\">\n <span class=\"ML__sqrt-index\">\n <span class=\"ML__vlist-t\"><span class=\"ML__vlist-r\"><span class=\"ML__vlist\" style=\"height:0.78em\">\n <span style=\"top:-3.45em\">\n <span class=\"ML__pstrut\" style=\"height:3em\"></span>\n <span id=\"index-size\" style=\"height:0.33em;display:inline-block;font-size: 50%\">\n <span class=\"ML__cmr\">1</span>\n <span id=\"nested-size\" style=\"font-size: 50%\">nested</span>\n </span>\n </span>\n </span></span></span>\n </span>\n <span class=\"ML__sqrt-sign\"><span class=\"ML__delim-size1\">√</span></span>\n </span>";
|
|
88
|
+
var rule = function rule() {
|
|
89
|
+
// eslint-disable-next-line global-require
|
|
90
|
+
var _require2 = require('../mf/common-styles'),
|
|
91
|
+
rootIndexStyles = _require2.rootIndexStyles;
|
|
92
|
+
var selectors = Object.keys(rootIndexStyles);
|
|
93
|
+
expect(selectors).toHaveLength(1);
|
|
94
|
+
return {
|
|
95
|
+
selector: selectors[0],
|
|
96
|
+
value: rootIndexStyles[selectors[0]].fontSize
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
it("scales the index glyph to 75% - half again MathLive's 50%", function () {
|
|
100
|
+
// !important: the 50% is an inline style, which a class cannot override.
|
|
101
|
+
expect(rule().value).toEqual('75% !important');
|
|
102
|
+
});
|
|
103
|
+
it('targets the span MathLive puts the inline font-size on', function () {
|
|
104
|
+
var holder = document.createElement('div');
|
|
105
|
+
holder.innerHTML = INDEX_MARKUP;
|
|
106
|
+
var matched = holder.querySelectorAll(rule().selector.replace(/^&\s*/, ''));
|
|
107
|
+
expect(Array.from(matched).map(function (el) {
|
|
108
|
+
return el.id;
|
|
109
|
+
})).toEqual(['index-size']);
|
|
110
|
+
});
|
|
111
|
+
it('leaves the radical index box itself unscaled', function () {
|
|
112
|
+
// Scaling `.ML__sqrt-index` would scale the em-based top/height offsets
|
|
113
|
+
// that tuck the index into the radical, lifting it clear of the crook.
|
|
114
|
+
var _rule = rule(),
|
|
115
|
+
selector = _rule.selector;
|
|
116
|
+
expect(selector).not.toMatch(/\.ML__sqrt-index\s*\{?$/);
|
|
117
|
+
expect(selector.startsWith('& .ML__sqrt-index >')).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it('applies wherever math renders - keypad labels, static math, mathfield', function () {
|
|
120
|
+
// eslint-disable-next-line global-require
|
|
121
|
+
var cs = require('../mf/common-styles');
|
|
122
|
+
var _rule2 = rule(),
|
|
123
|
+
selector = _rule2.selector;
|
|
124
|
+
['commonKeyboardStyles', 'commonMathLiveStyles', 'supsubStyles'].forEach(function (name) {
|
|
125
|
+
expect(cs[name][selector]).toBeDefined();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// The live mathfield renders in a shadow root, which host styles cannot
|
|
129
|
+
// reach, so the same rule ships as plain CSS for `applyShadowStyles`.
|
|
130
|
+
expect(cs.ROOT_INDEX_CSS).toContain('.ML__sqrt-index >');
|
|
131
|
+
expect(cs.ROOT_INDEX_CSS).toContain('font-size:75% !important');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
it('applies those rules wherever static math renders', function () {
|
|
135
|
+
// eslint-disable-next-line global-require
|
|
136
|
+
var cs = require('../mf/common-styles');
|
|
137
|
+
['commonKeyboardStyles', 'commonMathLiveStyles'].forEach(function (name) {
|
|
138
|
+
expect(cs[name]['& .ML__stretchy']).toBeDefined();
|
|
139
|
+
expect(cs[name]['& .ML__base']).toBeDefined();
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// A bare `& svg` rule re-parents every svg in the subtree; MathLive's own rule
|
|
144
|
+
// is descendant-scoped to .ML__latex .ML__stretchy svg.
|
|
145
|
+
it('does not use a blanket svg rule', function () {
|
|
146
|
+
// eslint-disable-next-line global-require
|
|
147
|
+
var cs = require('../mf/common-styles');
|
|
148
|
+
Object.values(cs).forEach(function (style) {
|
|
149
|
+
if (style && (0, _typeof2["default"])(style) === 'object') {
|
|
150
|
+
expect(Object.keys(style)).not.toContain('& svg');
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// The Percent key showed as a blank button on the Advanced Algebra keypad
|
|
156
|
+
// (row 1, position 6). MathQuill defined `LatexCmds['%']` as a symbol that
|
|
157
|
+
// serialised to `\\%`, so its bare `%` label parsed fine; MathLive parses real
|
|
158
|
+
// LaTeX, where `%` opens a comment - the label rendered nothing, and pressing
|
|
159
|
+
// the key inserted a comment that swallowed the rest of the expression.
|
|
160
|
+
it('the percent key is escaped, not a latex comment', function () {
|
|
161
|
+
// eslint-disable-next-line global-require
|
|
162
|
+
var _require3 = require('../keys/misc'),
|
|
163
|
+
percentage = _require3.percentage;
|
|
164
|
+
expect(percentage.latex).toEqual('\\%');
|
|
165
|
+
expect((0, _latexBridge.keyToAction)(percentage).value).toEqual('\\%');
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Any bare `%` in a key would fail the same way, silently.
|
|
169
|
+
it('no keypad key carries an unescaped %', function () {
|
|
170
|
+
// eslint-disable-next-line global-require
|
|
171
|
+
var _require4 = require('../keys'),
|
|
172
|
+
baseSet = _require4.baseSet;
|
|
173
|
+
// eslint-disable-next-line global-require
|
|
174
|
+
var _require5 = require('../keys/grades'),
|
|
175
|
+
gradeSets = _require5.gradeSets;
|
|
176
|
+
var every = [].concat((0, _toConsumableArray2["default"])(baseSet), (0, _toConsumableArray2["default"])(gradeSets.map(function (g) {
|
|
177
|
+
return g.set;
|
|
178
|
+
})));
|
|
179
|
+
var _walk = function walk(node) {
|
|
180
|
+
if (Array.isArray(node)) {
|
|
181
|
+
node.forEach(_walk);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (!node) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
['latex', 'write', 'command'].forEach(function (field) {
|
|
188
|
+
var value = node[field];
|
|
189
|
+
if (typeof value === 'string') {
|
|
190
|
+
// a `%` is only safe when preceded by an odd run of backslashes
|
|
191
|
+
expect(value.replace(/\\./g, '')).not.toContain('%');
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
_walk(every);
|
|
196
|
+
});
|
|
197
|
+
it('leaves latex without empty groups alone', function () {
|
|
198
|
+
['\\pi', '\\sin', 'x^2', '\\overline{AB}'].forEach(function (latex) {
|
|
199
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(latex)).toEqual(latex);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
it('handles nullish input', function () {
|
|
203
|
+
expect((0, _latexBridge.withVisibleEmptySlots)(undefined)).toEqual('');
|
|
204
|
+
expect((0, _latexBridge.withVisibleEmptySlots)('')).toEqual('');
|
|
205
|
+
});
|
|
206
|
+
it('does NOT affect what gets inserted into the field', function () {
|
|
207
|
+
// the action must use the key's own latex, never the display form
|
|
208
|
+
var key = {
|
|
209
|
+
name: 'frac',
|
|
210
|
+
latex: '\\frac{}{}'
|
|
211
|
+
};
|
|
212
|
+
expect((0, _latexBridge.keyToAction)(key).value).toEqual('\\frac{}{}');
|
|
213
|
+
expect((0, _latexBridge.keyToAction)(key).value).not.toContain('pie-empty');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF0ZXhCcmlkZ2UiLCJyZXF1aXJlIiwiZGVzY3JpYmUiLCJpdCIsIm91dCIsImxhdGV4Rm9yRGlzcGxheSIsImV4cGVjdCIsIm5vdCIsInRvRXF1YWwiLCJ0b0NvbnRhaW4iLCJmb3JFYWNoIiwibGF0ZXgiLCJnZW9tZXRyeSIsIk9iamVjdCIsInZhbHVlcyIsImtleSIsInRvTWF0Y2giLCJfcmVxdWlyZSIsInBsYWNlaG9sZGVyU3R5bGVzIiwicG9zaXRpb24iLCJsZWZ0Iiwid2lkdGgiLCJtYXJnaW5MZWZ0IiwiSU5ERVhfTUFSS1VQIiwicnVsZSIsIl9yZXF1aXJlMiIsInJvb3RJbmRleFN0eWxlcyIsInNlbGVjdG9ycyIsImtleXMiLCJ0b0hhdmVMZW5ndGgiLCJzZWxlY3RvciIsInZhbHVlIiwiZm9udFNpemUiLCJob2xkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJtYXRjaGVkIiwicXVlcnlTZWxlY3RvckFsbCIsInJlcGxhY2UiLCJBcnJheSIsImZyb20iLCJtYXAiLCJlbCIsImlkIiwiX3J1bGUiLCJzdGFydHNXaXRoIiwidG9CZSIsImNzIiwiX3J1bGUyIiwibmFtZSIsInRvQmVEZWZpbmVkIiwiUk9PVF9JTkRFWF9DU1MiLCJzdHlsZSIsIl90eXBlb2YyIiwiX3JlcXVpcmUzIiwicGVyY2VudGFnZSIsImtleVRvQWN0aW9uIiwiX3JlcXVpcmU0IiwiYmFzZVNldCIsIl9yZXF1aXJlNSIsImdyYWRlU2V0cyIsImV2ZXJ5IiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImciLCJzZXQiLCJ3YWxrIiwibm9kZSIsImlzQXJyYXkiLCJmaWVsZCIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18va2V5cGFkLWxhYmVsLnRlc3QuanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhWaXNpYmxlRW1wdHlTbG90cyBhcyBsYXRleEZvckRpc3BsYXkgfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuaW1wb3J0IHsga2V5VG9BY3Rpb24gfSBmcm9tICcuLi9sYXRleC1icmlkZ2UnO1xuXG4vKipcbiAqIEtleXMgdXNlIGVtcHR5IGdyb3VwcyB0byBzaG93IGEgY29tbWFuZCdzIHNoYXBlIChgXFxmcmFje317fWAsIGB4Xnt9YCkuXG4gKiBNYXRoTGl2ZSByZW5kZXJzIGB7fWAgYXMgbm90aGluZywgc28gbGFiZWxzIG5lZWQgYSB2aXNpYmxlIHN0YW5kLWluIC0gYnV0IHRoZVxuICogdmFsdWUgdGhhdCBnZXRzICppbnNlcnRlZCogbXVzdCBzdGF5IHVudG91Y2hlZC5cbiAqL1xuZGVzY3JpYmUoJ2tleXBhZCBsYWJlbCBkaXNwbGF5IG5vcm1hbGlzYXRpb24nLCAoKSA9PiB7XG4gIGl0KCdnaXZlcyBlbXB0eSBncm91cHMgYSB2aXNpYmxlIGdseXBoJywgKCkgPT4ge1xuICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheSgnXFxcXGZyYWN7fXt9Jyk7XG5cbiAgICBleHBlY3Qob3V0KS5ub3QudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgLy8gYSBcXHJ1bGUsIG5vdCBhIGdseXBoOiBmb250IG1ldHJpY3MgZm9yIGEgc3Vic3RpdHV0ZWQgZ2x5cGggZG8gbm90IG1hdGNoXG4gICAgLy8gTWF0aExpdmUncywgd2hpY2ggbGVmdCBzdHJldGNoeSBhY2NlbnRzIG5hcnJvd2VyIHRoYW4gdGhlIGJveFxuICAgIGV4cGVjdChvdXQpLnRvQ29udGFpbignXFxcXHJ1bGUnKTtcbiAgICBleHBlY3Qob3V0KS50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBldmVyeSBlbXB0eS1ncm91cCBrZXkgc2hhcGUnLCAoKSA9PiB7XG4gICAgW1xuICAgICAgJ1xcXFxmcmFje317fScsXG4gICAgICAnXFxcXG92ZXJsaW5le30nLFxuICAgICAgJ3hee30nLFxuICAgICAgJ3hfe30nLFxuICAgICAgJ1xcXFxzcXJ0e30nLFxuICAgICAgJ1xcXFxzcXJ0W3t9XXt9JyxcbiAgICAgICdcXFxcYWJze30nLFxuICAgICAgJ1xcXFxsb2dfe30nLFxuICAgICAgJ1xcXFxsb25nZGl2e30nLFxuICAgIF0uZm9yRWFjaCgobGF0ZXgpID0+IHtcbiAgICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkobGF0ZXgpKS5ub3QudG9Db250YWluKCd7fScpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgndHJlYXRzIGEgd2hpdGVzcGFjZS1vbmx5IGdyb3VwIGFzIGVtcHR5JywgKCkgPT4ge1xuICAgIC8vIGUuZy4gXFxmcmFje3h9eyB9XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnXFxcXGZyYWN7eH17IH0nKSkudG9Db250YWluKCdwaWUtZW1wdHknKTtcbiAgfSk7XG5cbiAgLy8gTWF0aFF1aWxsIG5lZWRlZCBhIG5lc3RlZCBcXG92ZXJsaW5le30gdG8gZHJhdyB0aGUgZW1wdHkgYm94LiBNYXRoTGl2ZVxuICAvLyByZW5kZXJzIHRoYXQgYXMgYSByZWFsIGxpbmUsIHNvIHRob3NlIGxhYmVscyBzaG93ZWQgYSBzcHVyaW91cyBiYXIgKGEgbGluZVxuICAvLyB1bmRlciB0aGUgYXJyb3dzLCBhbmQgYSBzdHJhaWdodCBsaW5lIGluc3RlYWQgb2YgdGhlIGFyYykuXG4gIGl0KCdhY2NlbnQga2V5cyBkbyBub3QgY2FycnkgdGhlIG5lc3RlZC1vdmVybGluZSBib3ggaGFjaycsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCBnZW9tZXRyeSA9IHJlcXVpcmUoJy4uL2tleXMvZ2VvbWV0cnknKTtcblxuICAgIE9iamVjdC52YWx1ZXMoZ2VvbWV0cnkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleSAmJiB0eXBlb2Yga2V5LmxhdGV4ID09PSAnc3RyaW5nJykge1xuICAgICAgICBleHBlY3Qoa2V5LmxhdGV4KS5ub3QudG9Db250YWluKCdcXFxcb3ZlcmxpbmV7fX0nKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FuIGFjY2VudCBvdmVyIGFuIGVtcHR5IHNsb3Qgc3RpbGwgZ2V0cyBhIHZpc2libGUgYm94JywgKCkgPT4ge1xuICAgIFsnXFxcXG92ZXJsZWZ0cmlnaHRhcnJvd3t9JywgJ1xcXFxvdmVyYXJje30nXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgY29uc3Qgb3V0ID0gbGF0ZXhGb3JEaXNwbGF5KGxhdGV4KTtcblxuICAgICAgZXhwZWN0KG91dCkudG9Db250YWluKCdwaWUtZW1wdHknKTtcbiAgICAgIGV4cGVjdChvdXQpLm5vdC50b0NvbnRhaW4oJ1xcXFxvdmVybGluZScpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIGdseXBoJ3Mgd2lkdGggY29tZXMgZnJvbSBmb250IG1ldHJpY3M7IFUrMjVBQiBpcyBub3QgaW4gdGhlIEthVGVYIGZvbnRzLFxuICAvLyBzbyB0aGUgYnJvd3NlciBzdWJzdGl0dXRlZCBhIHdpZGVyIG9uZSBhbmQgc3RyZXRjaHkgYWNjZW50cyBjYW1lIG91dFxuICAvLyBuYXJyb3dlciB0aGFuIHRoZSBib3guIEEgcnVsZSBoYXMgYW4gZXhwbGljaXQgd2lkdGguXG4gIGl0KCd0aGUgZW1wdHkgc2xvdCBoYXMgYW4gZXhwbGljaXQgd2lkdGgsIG5vdCBmb250LWRlcGVuZGVudCBtZXRyaWNzJywgKCkgPT4ge1xuICAgIGNvbnN0IG91dCA9IGxhdGV4Rm9yRGlzcGxheSgnXFxcXG92ZXJhcmN7fScpO1xuXG4gICAgZXhwZWN0KG91dCkudG9Db250YWluKCdcXFxccnVsZScpO1xuICAgIGV4cGVjdChvdXQpLnRvTWF0Y2goL3J1bGVcXHtbXFxkLl0rZW1cXH1cXHtbXFxkLl0rZW1cXH0vKTtcbiAgICBleHBlY3Qob3V0KS5ub3QudG9Db250YWluKCd1bmljb2RlJyk7XG4gIH0pO1xuXG4gIC8vIE1lYXN1cmVkIGluIHRoZSBicm93c2VyOiB0aGUgYWNjZW50J3MgaW1tZWRpYXRlIHdyYXBwZXIgY29tcHV0ZXMgdG8gMHB4XG4gIC8vIChpdHMgLk1MX19zdHJldGNoeSBjaGlsZCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQpLCBzbyB0aGUgc3ZnIHdpZHRoIGhhcyB0b1xuICAvLyByZXNvbHZlIGFnYWluc3QgLk1MX19iYXNlIC0gd2hvc2Ugd2lkdGggZXF1YWxzIHRoZSBjb250ZW50LiBXaXRob3V0IHBpbm5pbmdcbiAgLy8gdGhhdCwgdGhlIGFyYyBjb2xsYXBzZWQgdG8gYSBzcGlrZSBhbmQgc2F0IHJpZ2h0IG9mIHRoZSBib3guXG4gIGl0KCdwaW5zIHRoZSBhY2NlbnQgY29udGFpbmluZyBibG9jayBhbmQgZHJvcHMgdGhlIGNlbnRlcmluZyBzaGlmdCcsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IHBsYWNlaG9sZGVyU3R5bGVzIH0gPSByZXF1aXJlKCcuLi9tZi9jb21tb24tc3R5bGVzJyk7XG5cbiAgICBleHBlY3QocGxhY2Vob2xkZXJTdHlsZXNbJyYgLk1MX19iYXNlJ10ucG9zaXRpb24pLnRvRXF1YWwoJ3JlbGF0aXZlJyk7XG4gICAgZXhwZWN0KHBsYWNlaG9sZGVyU3R5bGVzWycmIC5NTF9fc3RyZXRjaHknXSkudG9FcXVhbCh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBsZWZ0OiAwLCB3aWR0aDogJzEwMCUnIH0pO1xuICAgIC8vIG11c3QgYmUgIWltcG9ydGFudDogTWF0aExpdmUgd3JpdGVzIG1hcmdpbi1sZWZ0IGFzIGFuIGlubGluZSBzdHlsZSwgYW5kIGFcbiAgICAvLyBjbGFzcyBjYW5ub3Qgb3ZlcnJpZGUgdGhhdC4gTGVhdmluZyBpdCB1bi1pbXBvcnRhbnQgYWxzbyBoYWx2ZWQgdGhlIGFyYydzXG4gICAgLy8gd2lkdGgsIGJlY2F1c2UgLk1MX19jZW50ZXIgaXMgdGhlIHN0cmV0Y2h5J3MgY29udGFpbmluZyBibG9jay5cbiAgICBleHBlY3QocGxhY2Vob2xkZXJTdHlsZXNbJyYgLk1MX19jZW50ZXI6aGFzKC5NTF9fc3RyZXRjaHkpJ10ubWFyZ2luTGVmdCkudG9FcXVhbCgnMCAhaW1wb3J0YW50Jyk7XG4gIH0pO1xuXG4gIC8vIE1hdGhMaXZlIHNldHMgdGhlIGluZGV4IG9mIFxcc3FydFtuXXt4fSBpbiBzY3JpcHRzY3JpcHRzdHlsZSAtIGFuIGlubGluZVxuICAvLyBgZm9udC1zaXplOiA1MCVgIC0gd2hpY2ggaXMgdG9vIHNtYWxsIHRvIHJlYWQgb24gdGhlIG50aC1yb290IGtleSBhbmQgaW5cbiAgLy8gYXV0aG9yZWQgcmFkaWNhbHMuIEl0IGlzIHNjYWxlZCB1cCBieSBoYWxmLCB0byA3NSUuXG4gIGRlc2NyaWJlKCdyYWRpY2FsIGluZGV4IHNpemUnLCAoKSA9PiB7XG4gICAgLy8gUmVhbCBNYXRoTGl2ZSAwLjExMCBvdXRwdXQgZm9yIGBcXHNxcnRbMV17Mn1gLCB0cmltbWVkIHRvIHRoZSBpbmRleC4gVGhlXG4gICAgLy8gc2VsZWN0b3Igd2Fsa3MgdGhpcyBleGFjdCBjaGFpbiwgc28gdGhpcyBmaXh0dXJlIGlzIHdoYXQgcGlucyBpdCBkb3duLlxuICAgIGNvbnN0IElOREVYX01BUktVUCA9IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX2Jhc2VcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJNTF9fc3FydC1pbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiTUxfX3ZsaXN0LXRcIj48c3BhbiBjbGFzcz1cIk1MX192bGlzdC1yXCI+PHNwYW4gY2xhc3M9XCJNTF9fdmxpc3RcIiBzdHlsZT1cImhlaWdodDowLjc4ZW1cIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOi0zLjQ1ZW1cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJNTF9fcHN0cnV0XCIgc3R5bGU9XCJoZWlnaHQ6M2VtXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBpZD1cImluZGV4LXNpemVcIiBzdHlsZT1cImhlaWdodDowLjMzZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOiA1MCVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIk1MX19jbXJcIj4xPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwibmVzdGVkLXNpemVcIiBzdHlsZT1cImZvbnQtc2l6ZTogNTAlXCI+bmVzdGVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJNTF9fc3FydC1zaWduXCI+PHNwYW4gY2xhc3M9XCJNTF9fZGVsaW0tc2l6ZTFcIj4mIzg3MzA7PC9zcGFuPjwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5gO1xuXG4gICAgY29uc3QgcnVsZSA9ICgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgICAgY29uc3QgeyByb290SW5kZXhTdHlsZXMgfSA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcbiAgICAgIGNvbnN0IHNlbGVjdG9ycyA9IE9iamVjdC5rZXlzKHJvb3RJbmRleFN0eWxlcyk7XG5cbiAgICAgIGV4cGVjdChzZWxlY3RvcnMpLnRvSGF2ZUxlbmd0aCgxKTtcblxuICAgICAgcmV0dXJuIHsgc2VsZWN0b3I6IHNlbGVjdG9yc1swXSwgdmFsdWU6IHJvb3RJbmRleFN0eWxlc1tzZWxlY3RvcnNbMF1dLmZvbnRTaXplIH07XG4gICAgfTtcblxuICAgIGl0KFwic2NhbGVzIHRoZSBpbmRleCBnbHlwaCB0byA3NSUgLSBoYWxmIGFnYWluIE1hdGhMaXZlJ3MgNTAlXCIsICgpID0+IHtcbiAgICAgIC8vICFpbXBvcnRhbnQ6IHRoZSA1MCUgaXMgYW4gaW5saW5lIHN0eWxlLCB3aGljaCBhIGNsYXNzIGNhbm5vdCBvdmVycmlkZS5cbiAgICAgIGV4cGVjdChydWxlKCkudmFsdWUpLnRvRXF1YWwoJzc1JSAhaW1wb3J0YW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGFyZ2V0cyB0aGUgc3BhbiBNYXRoTGl2ZSBwdXRzIHRoZSBpbmxpbmUgZm9udC1zaXplIG9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGhvbGRlci5pbm5lckhUTUwgPSBJTkRFWF9NQVJLVVA7XG5cbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBob2xkZXIucXVlcnlTZWxlY3RvckFsbChydWxlKCkuc2VsZWN0b3IucmVwbGFjZSgvXiZcXHMqLywgJycpKTtcblxuICAgICAgZXhwZWN0KEFycmF5LmZyb20obWF0Y2hlZCkubWFwKChlbCkgPT4gZWwuaWQpKS50b0VxdWFsKFsnaW5kZXgtc2l6ZSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgdGhlIHJhZGljYWwgaW5kZXggYm94IGl0c2VsZiB1bnNjYWxlZCcsICgpID0+IHtcbiAgICAgIC8vIFNjYWxpbmcgYC5NTF9fc3FydC1pbmRleGAgd291bGQgc2NhbGUgdGhlIGVtLWJhc2VkIHRvcC9oZWlnaHQgb2Zmc2V0c1xuICAgICAgLy8gdGhhdCB0dWNrIHRoZSBpbmRleCBpbnRvIHRoZSByYWRpY2FsLCBsaWZ0aW5nIGl0IGNsZWFyIG9mIHRoZSBjcm9vay5cbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgZXhwZWN0KHNlbGVjdG9yKS5ub3QudG9NYXRjaCgvXFwuTUxfX3NxcnQtaW5kZXhcXHMqXFx7PyQvKTtcbiAgICAgIGV4cGVjdChzZWxlY3Rvci5zdGFydHNXaXRoKCcmIC5NTF9fc3FydC1pbmRleCA+JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYXBwbGllcyB3aGVyZXZlciBtYXRoIHJlbmRlcnMgLSBrZXlwYWQgbGFiZWxzLCBzdGF0aWMgbWF0aCwgbWF0aGZpZWxkJywgKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcbiAgICAgIGNvbnN0IHsgc2VsZWN0b3IgfSA9IHJ1bGUoKTtcblxuICAgICAgWydjb21tb25LZXlib2FyZFN0eWxlcycsICdjb21tb25NYXRoTGl2ZVN0eWxlcycsICdzdXBzdWJTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGV4cGVjdChjc1tuYW1lXVtzZWxlY3Rvcl0pLnRvQmVEZWZpbmVkKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIGxpdmUgbWF0aGZpZWxkIHJlbmRlcnMgaW4gYSBzaGFkb3cgcm9vdCwgd2hpY2ggaG9zdCBzdHlsZXMgY2Fubm90XG4gICAgICAvLyByZWFjaCwgc28gdGhlIHNhbWUgcnVsZSBzaGlwcyBhcyBwbGFpbiBDU1MgZm9yIGBhcHBseVNoYWRvd1N0eWxlc2AuXG4gICAgICBleHBlY3QoY3MuUk9PVF9JTkRFWF9DU1MpLnRvQ29udGFpbignLk1MX19zcXJ0LWluZGV4ID4nKTtcbiAgICAgIGV4cGVjdChjcy5ST09UX0lOREVYX0NTUykudG9Db250YWluKCdmb250LXNpemU6NzUlICFpbXBvcnRhbnQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2FwcGxpZXMgdGhvc2UgcnVsZXMgd2hlcmV2ZXIgc3RhdGljIG1hdGggcmVuZGVycycsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCBjcyA9IHJlcXVpcmUoJy4uL21mL2NvbW1vbi1zdHlsZXMnKTtcblxuICAgIFsnY29tbW9uS2V5Ym9hcmRTdHlsZXMnLCAnY29tbW9uTWF0aExpdmVTdHlsZXMnXS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBleHBlY3QoY3NbbmFtZV1bJyYgLk1MX19zdHJldGNoeSddKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KGNzW25hbWVdWycmIC5NTF9fYmFzZSddKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBIGJhcmUgYCYgc3ZnYCBydWxlIHJlLXBhcmVudHMgZXZlcnkgc3ZnIGluIHRoZSBzdWJ0cmVlOyBNYXRoTGl2ZSdzIG93biBydWxlXG4gIC8vIGlzIGRlc2NlbmRhbnQtc2NvcGVkIHRvIC5NTF9fbGF0ZXggLk1MX19zdHJldGNoeSBzdmcuXG4gIGl0KCdkb2VzIG5vdCB1c2UgYSBibGFua2V0IHN2ZyBydWxlJywgKCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnbG9iYWwtcmVxdWlyZVxuICAgIGNvbnN0IGNzID0gcmVxdWlyZSgnLi4vbWYvY29tbW9uLXN0eWxlcycpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyhjcykuZm9yRWFjaCgoc3R5bGUpID0+IHtcbiAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdHlsZSkpLm5vdC50b0NvbnRhaW4oJyYgc3ZnJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBQZXJjZW50IGtleSBzaG93ZWQgYXMgYSBibGFuayBidXR0b24gb24gdGhlIEFkdmFuY2VkIEFsZ2VicmEga2V5cGFkXG4gIC8vIChyb3cgMSwgcG9zaXRpb24gNikuIE1hdGhRdWlsbCBkZWZpbmVkIGBMYXRleENtZHNbJyUnXWAgYXMgYSBzeW1ib2wgdGhhdFxuICAvLyBzZXJpYWxpc2VkIHRvIGBcXFxcJWAsIHNvIGl0cyBiYXJlIGAlYCBsYWJlbCBwYXJzZWQgZmluZTsgTWF0aExpdmUgcGFyc2VzIHJlYWxcbiAgLy8gTGFUZVgsIHdoZXJlIGAlYCBvcGVucyBhIGNvbW1lbnQgLSB0aGUgbGFiZWwgcmVuZGVyZWQgbm90aGluZywgYW5kIHByZXNzaW5nXG4gIC8vIHRoZSBrZXkgaW5zZXJ0ZWQgYSBjb21tZW50IHRoYXQgc3dhbGxvd2VkIHRoZSByZXN0IG9mIHRoZSBleHByZXNzaW9uLlxuICBpdCgndGhlIHBlcmNlbnQga2V5IGlzIGVzY2FwZWQsIG5vdCBhIGxhdGV4IGNvbW1lbnQnLCAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGdsb2JhbC1yZXF1aXJlXG4gICAgY29uc3QgeyBwZXJjZW50YWdlIH0gPSByZXF1aXJlKCcuLi9rZXlzL21pc2MnKTtcblxuICAgIGV4cGVjdChwZXJjZW50YWdlLmxhdGV4KS50b0VxdWFsKCdcXFxcJScpO1xuICAgIGV4cGVjdChrZXlUb0FjdGlvbihwZXJjZW50YWdlKS52YWx1ZSkudG9FcXVhbCgnXFxcXCUnKTtcbiAgfSk7XG5cbiAgLy8gQW55IGJhcmUgYCVgIGluIGEga2V5IHdvdWxkIGZhaWwgdGhlIHNhbWUgd2F5LCBzaWxlbnRseS5cbiAgaXQoJ25vIGtleXBhZCBrZXkgY2FycmllcyBhbiB1bmVzY2FwZWQgJScsICgpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGJhc2VTZXQgfSA9IHJlcXVpcmUoJy4uL2tleXMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ2xvYmFsLXJlcXVpcmVcbiAgICBjb25zdCB7IGdyYWRlU2V0cyB9ID0gcmVxdWlyZSgnLi4va2V5cy9ncmFkZXMnKTtcblxuICAgIGNvbnN0IGV2ZXJ5ID0gWy4uLmJhc2VTZXQsIC4uLmdyYWRlU2V0cy5tYXAoKGcpID0+IGcuc2V0KV07XG5cbiAgICBjb25zdCB3YWxrID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgIG5vZGUuZm9yRWFjaCh3YWxrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBbJ2xhdGV4JywgJ3dyaXRlJywgJ2NvbW1hbmQnXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGVbZmllbGRdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gYSBgJWAgaXMgb25seSBzYWZlIHdoZW4gcHJlY2VkZWQgYnkgYW4gb2RkIHJ1biBvZiBiYWNrc2xhc2hlc1xuICAgICAgICAgIGV4cGVjdCh2YWx1ZS5yZXBsYWNlKC9cXFxcLi9nLCAnJykpLm5vdC50b0NvbnRhaW4oJyUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdhbGsoZXZlcnkpO1xuICB9KTtcblxuICBpdCgnbGVhdmVzIGxhdGV4IHdpdGhvdXQgZW1wdHkgZ3JvdXBzIGFsb25lJywgKCkgPT4ge1xuICAgIFsnXFxcXHBpJywgJ1xcXFxzaW4nLCAneF4yJywgJ1xcXFxvdmVybGluZXtBQn0nXS5mb3JFYWNoKChsYXRleCkgPT4ge1xuICAgICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheShsYXRleCkpLnRvRXF1YWwobGF0ZXgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnaGFuZGxlcyBudWxsaXNoIGlucHV0JywgKCkgPT4ge1xuICAgIGV4cGVjdChsYXRleEZvckRpc3BsYXkodW5kZWZpbmVkKSkudG9FcXVhbCgnJyk7XG4gICAgZXhwZWN0KGxhdGV4Rm9yRGlzcGxheSgnJykpLnRvRXF1YWwoJycpO1xuICB9KTtcblxuICBpdCgnZG9lcyBOT1QgYWZmZWN0IHdoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBmaWVsZCcsICgpID0+IHtcbiAgICAvLyB0aGUgYWN0aW9uIG11c3QgdXNlIHRoZSBrZXkncyBvd24gbGF0ZXgsIG5ldmVyIHRoZSBkaXNwbGF5IGZvcm1cbiAgICBjb25zdCBrZXkgPSB7IG5hbWU6ICdmcmFjJywgbGF0ZXg6ICdcXFxcZnJhY3t9e30nIH07XG5cbiAgICBleHBlY3Qoa2V5VG9BY3Rpb24oa2V5KS52YWx1ZSkudG9FcXVhbCgnXFxcXGZyYWN7fXt9Jyk7XG4gICAgZXhwZWN0KGtleVRvQWN0aW9uKGtleSkudmFsdWUpLm5vdC50b0NvbnRhaW4oJ3BpZS1lbXB0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUMsUUFBUSxDQUFDLG9DQUFvQyxFQUFFLFlBQU07RUFDbkRDLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxZQUFNO0lBQzdDLElBQU1DLEdBQUcsR0FBRyxJQUFBQyxrQ0FBZSxFQUFDLFlBQVksQ0FBQztJQUV6Q0MsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0csR0FBRyxDQUFDQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3JDO0lBQ0E7SUFDQUYsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUMvQkgsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQ0ssU0FBUyxDQUFDLFdBQVcsQ0FBQztFQUNwQyxDQUFDLENBQUM7RUFFRk4sRUFBRSxDQUFDLHFDQUFxQyxFQUFFLFlBQU07SUFDOUMsQ0FDRSxZQUFZLEVBQ1osY0FBYyxFQUNkLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsQ0FDZCxDQUFDTyxPQUFPLENBQUMsVUFBQ0MsS0FBSyxFQUFLO01BQ25CTCxNQUFNLENBQUMsSUFBQUQsa0NBQWUsRUFBQ00sS0FBSyxDQUFDLENBQUMsQ0FBQ0osR0FBRyxDQUFDRSxTQUFTLENBQUMsSUFBSSxDQUFDO0lBQ3BELENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGTixFQUFFLENBQUMseUNBQXlDLEVBQUUsWUFBTTtJQUNsRDtJQUNBRyxNQUFNLENBQUMsSUFBQUQsa0NBQWUsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDSSxTQUFTLENBQUMsV0FBVyxDQUFDO0VBQ2hFLENBQUMsQ0FBQzs7RUFFRjtF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
|