Created
February 7, 2020 17:04
-
-
Save jchandra74/bedbb8778582bcfd7340182c7398484c to your computer and use it in GitHub Desktop.
JS Bin Implementation of Find First Non Repeatable Character in a String // source https://jsbin.com/gomukah
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta name="description" content="Implementation of Find First Non Repeatable Character in a String"> | |
<meta charset="utf-8"> | |
<meta name="viewport" content="width=device-width"> | |
<title>JS Bin</title> | |
</head> | |
<body> | |
<script id="jsbin-javascript"> | |
"use strict"; | |
console.clear(); | |
var sut = findFirstNonRepeatableCharIn; | |
testEqual('', undefined, sut); | |
testEqual('d', 'd', sut); | |
testEqual('dd', undefined, sut); | |
testEqual('dda', 'a', sut); | |
testEqual('ddac', 'a', sut); | |
testEqual('ddacc', 'a', sut); | |
testEqual('ddaacc', undefined, sut); | |
testEqual('aaaabbbcddddeeef', 'c', sut); | |
function findFirstNonRepeatableCharIn(input) { | |
/* | |
Reason of why I am implementing it this way is because | |
I want to stop processing right when the character is found for efficiency. | |
*/ | |
// Handle the special cases | |
if (!input) | |
return undefined; | |
if (input.length === 1) | |
return input[0]; | |
var previous = input[0]; | |
var repeated = false; | |
var current; | |
for (var i = 1; i < input.length; i++) { | |
current = input[i]; | |
if (current === previous && !repeated) { | |
repeated = true; | |
/* | |
We could do the following instruction, | |
but since it's already the same, it's pointless and redundant. | |
Skipping it will safe some execution time. | |
*/ | |
//previous = current; | |
/* | |
I prefer to start the next iteration immediately here. | |
It shows the intent clearly and remove any ambiguity. | |
*/ | |
continue; | |
} | |
// Handle character changes | |
if (current !== previous) { | |
// Found it | |
if (!repeated) | |
return previous; | |
// Handle not found | |
repeated = false; | |
} | |
previous = current; | |
} | |
/* | |
Finally, handle special cases when we have iterated over the | |
entire input string. | |
*/ | |
return !repeated ? current : undefined; | |
} | |
function testEqual(input, expected, sut) { | |
var actual = sut(input); | |
var info = "Input: '" + input + "' Expected: " + expected + " Actual: " + actual; | |
if (actual === expected) | |
console.info("PASS " + info); | |
else | |
console.error("FAIL " + info); | |
} | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNiaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqc2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hCLElBQU0sR0FBRyxHQUFHLDRCQUE0QixDQUFDO0FBQ3pDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFeEMsc0NBQXNDLEtBQUs7SUFDekM7OztNQUdFO0lBRUYsMkJBQTJCO0lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUM3QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLE9BQU8sQ0FBQztJQUVaLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNoQjs7OztjQUlFO1lBRUYscUJBQXFCO1lBRXJCOzs7Y0FHRTtZQUNGLFFBQVEsQ0FBQztRQUNYLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekIsV0FBVztZQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFFL0IsbUJBQW1CO1lBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFXbkIsQ0FBQztRQUVELFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7TUFHRTtJQUNGLE1BQU0sQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxtQkFBbUIsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHO0lBQ3JDLElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixJQUFNLElBQUksR0FBRyxhQUFXLEtBQUssb0JBQWUsUUFBUSxpQkFBWSxNQUFRLENBQUM7SUFFekUsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVEsSUFBTSxDQUFDLENBQUM7SUFDL0IsSUFBSTtRQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBUSxJQUFNLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc29sZS5jbGVhcigpO1xuY29uc3Qgc3V0ID0gZmluZEZpcnN0Tm9uUmVwZWF0YWJsZUNoYXJJbjtcbnRlc3RFcXVhbCgnJywgdW5kZWZpbmVkLCBzdXQpO1xudGVzdEVxdWFsKCdkJywgJ2QnLCBzdXQpO1xudGVzdEVxdWFsKCdkZCcsIHVuZGVmaW5lZCwgc3V0KTtcbnRlc3RFcXVhbCgnZGRhJywgJ2EnLCBzdXQpO1xudGVzdEVxdWFsKCdkZGFjJywgJ2EnLCBzdXQpO1xudGVzdEVxdWFsKCdkZGFjYycsICdhJywgc3V0KTtcbnRlc3RFcXVhbCgnZGRhYWNjJywgdW5kZWZpbmVkLCBzdXQpO1xudGVzdEVxdWFsKCdhYWFhYmJiY2RkZGRlZWVmJywgJ2MnLCBzdXQpO1xuXG5mdW5jdGlvbiBmaW5kRmlyc3ROb25SZXBlYXRhYmxlQ2hhckluKGlucHV0KSB7XG4gIC8qXG4gICAgUmVhc29uIG9mIHdoeSBJIGFtIGltcGxlbWVudGluZyBpdCB0aGlzIHdheSBpcyBiZWNhdXNlXG4gICAgSSB3YW50IHRvIHN0b3AgcHJvY2Vzc2luZyByaWdodCB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgZm91bmQgZm9yIGVmZmljaWVuY3kuXG4gICovXG5cbiAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2VzXG4gIGlmICghaW5wdXQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDEpIHJldHVybiBpbnB1dFswXTtcblxuICB2YXIgcHJldmlvdXMgPSBpbnB1dFswXTtcbiAgdmFyIHJlcGVhdGVkID0gZmFsc2U7XG4gIHZhciBjdXJyZW50O1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjdXJyZW50ID0gaW5wdXRbaV07XG5cbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMgJiYgIXJlcGVhdGVkKSB7XG4gICAgICByZXBlYXRlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICBXZSBjb3VsZCBkbyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLFxuICAgICAgICBidXQgc2luY2UgaXQncyBhbHJlYWR5IHRoZSBzYW1lLCBpdCdzIHBvaW50bGVzcyBhbmQgcmVkdW5kYW50LlxuICAgICAgICBTa2lwcGluZyBpdCB3aWxsIHNhZmUgc29tZSBleGVjdXRpb24gdGltZS5cbiAgICAgICovXG5cbiAgICAgIC8vcHJldmlvdXMgPSBjdXJyZW50O1xuXG4gICAgICAvKlxuICAgICAgICBJIHByZWZlciB0byBzdGFydCB0aGUgbmV4dCBpdGVyYXRpb24gaW1tZWRpYXRlbHkgaGVyZS5cbiAgICAgICAgSXQgc2hvd3MgdGhlIGludGVudCBjbGVhcmx5IGFuZCByZW1vdmUgYW55IGFtYmlndWl0eS5cbiAgICAgICovXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2hhcmFjdGVyIGNoYW5nZXNcbiAgICBpZiAoY3VycmVudCAhPT0gcHJldmlvdXMpIHtcbiAgICAgIC8vIEZvdW5kIGl0XG4gICAgICBpZiAoIXJlcGVhdGVkKSByZXR1cm4gcHJldmlvdXM7XG5cbiAgICAgIC8vIEhhbmRsZSBub3QgZm91bmRcbiAgICAgIHJlcGVhdGVkID0gZmFsc2U7XG5cbiAgICAgIC8qXG4gICAgICAgIEkgd2FzIGNvbnNpZGVyaW5nIHRvIGRvIHRoZSBmb2xsb3dpbmcgaGVyZSxcbiAgICAgICAgYnV0IGRlY2lkZWQgbm90IHRvIGRvIGl0IHNpbmNlIGl0IHZlcnkgY2xvc2UgdG8gdGhlIGVuZCBvZlxuICAgICAgICB0aGUgaXRlcmF0aW9uIGFuZCBub3QgZG9pbmcgaXQgYmFzaWNhbGx5IHNhdmUgc29tZSB2ZXJib3NpdHlcbiAgICAgICAgaW4gdGhlIGNvZGUgc28gSSBhbSBsZXR0aW5nIHRoZSByZWd1bGFyIGZsb3cgdG8gZG8gaXQgZm9yIG1lLlxuICAgICAgKi9cblxuICAgICAgLy8gcHJldmlvdXMgPSBjdXJyZW50O1xuICAgICAgLy8gY29udGludWU7XG4gICAgfVxuXG4gICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICB9XG5cbiAgLypcbiAgICBGaW5hbGx5LCBoYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVuIHdlIGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGVcbiAgICBlbnRpcmUgaW5wdXQgc3RyaW5nLlxuICAqL1xuICByZXR1cm4gIXJlcGVhdGVkID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdGVzdEVxdWFsKGlucHV0LCBleHBlY3RlZCwgc3V0KSB7XG4gIGNvbnN0IGFjdHVhbCA9IHN1dChpbnB1dCk7XG4gIGNvbnN0IGluZm8gPSBgSW5wdXQ6ICcke2lucHV0fScgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9IEFjdHVhbDogJHthY3R1YWx9YDtcblxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZClcbiAgICBjb25zb2xlLmluZm8oYFBBU1MgJHtpbmZvfWApO1xuICBlbHNlXG4gICAgY29uc29sZS5lcnJvcihgRkFJTCAke2luZm99YCk7XG59Il19 | |
</script> | |
<script id="jsbin-source-javascript" type="text/javascript">console.clear(); | |
const sut = findFirstNonRepeatableCharIn; | |
testEqual('', undefined, sut); | |
testEqual('d', 'd', sut); | |
testEqual('dd', undefined, sut); | |
testEqual('dda', 'a', sut); | |
testEqual('ddac', 'a', sut); | |
testEqual('ddacc', 'a', sut); | |
testEqual('ddaacc', undefined, sut); | |
testEqual('aaaabbbcddddeeef', 'c', sut); | |
function findFirstNonRepeatableCharIn(input) { | |
/* | |
Reason of why I am implementing it this way is because | |
I want to stop processing right when the character is found for efficiency. | |
*/ | |
// Handle the special cases | |
if (!input) return undefined; | |
if (input.length === 1) return input[0]; | |
var previous = input[0]; | |
var repeated = false; | |
var current; | |
for (var i = 1; i < input.length; i++) { | |
current = input[i]; | |
if (current === previous && !repeated) { | |
repeated = true; | |
/* | |
We could do the following instruction, | |
but since it's already the same, it's pointless and redundant. | |
Skipping it will safe some execution time. | |
*/ | |
//previous = current; | |
/* | |
I prefer to start the next iteration immediately here. | |
It shows the intent clearly and remove any ambiguity. | |
*/ | |
continue; | |
} | |
// Handle character changes | |
if (current !== previous) { | |
// Found it | |
if (!repeated) return previous; | |
// Handle not found | |
repeated = false; | |
/* | |
I was considering to do the following here, | |
but decided not to do it since it very close to the end of | |
the iteration and not doing it basically save some verbosity | |
in the code so I am letting the regular flow to do it for me. | |
*/ | |
// previous = current; | |
// continue; | |
} | |
previous = current; | |
} | |
/* | |
Finally, handle special cases when we have iterated over the | |
entire input string. | |
*/ | |
return !repeated ? current : undefined; | |
} | |
function testEqual(input, expected, sut) { | |
const actual = sut(input); | |
const info = `Input: '${input}' Expected: ${expected} Actual: ${actual}`; | |
if (actual === expected) | |
console.info(`PASS ${info}`); | |
else | |
console.error(`FAIL ${info}`); | |
}</script></body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
console.clear(); | |
var sut = findFirstNonRepeatableCharIn; | |
testEqual('', undefined, sut); | |
testEqual('d', 'd', sut); | |
testEqual('dd', undefined, sut); | |
testEqual('dda', 'a', sut); | |
testEqual('ddac', 'a', sut); | |
testEqual('ddacc', 'a', sut); | |
testEqual('ddaacc', undefined, sut); | |
testEqual('aaaabbbcddddeeef', 'c', sut); | |
function findFirstNonRepeatableCharIn(input) { | |
/* | |
Reason of why I am implementing it this way is because | |
I want to stop processing right when the character is found for efficiency. | |
*/ | |
// Handle the special cases | |
if (!input) | |
return undefined; | |
if (input.length === 1) | |
return input[0]; | |
var previous = input[0]; | |
var repeated = false; | |
var current; | |
for (var i = 1; i < input.length; i++) { | |
current = input[i]; | |
if (current === previous && !repeated) { | |
repeated = true; | |
/* | |
We could do the following instruction, | |
but since it's already the same, it's pointless and redundant. | |
Skipping it will safe some execution time. | |
*/ | |
//previous = current; | |
/* | |
I prefer to start the next iteration immediately here. | |
It shows the intent clearly and remove any ambiguity. | |
*/ | |
continue; | |
} | |
// Handle character changes | |
if (current !== previous) { | |
// Found it | |
if (!repeated) | |
return previous; | |
// Handle not found | |
repeated = false; | |
} | |
previous = current; | |
} | |
/* | |
Finally, handle special cases when we have iterated over the | |
entire input string. | |
*/ | |
return !repeated ? current : undefined; | |
} | |
function testEqual(input, expected, sut) { | |
var actual = sut(input); | |
var info = "Input: '" + input + "' Expected: " + expected + " Actual: " + actual; | |
if (actual === expected) | |
console.info("PASS " + info); | |
else | |
console.error("FAIL " + info); | |
} | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNiaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqc2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2hCLElBQU0sR0FBRyxHQUFHLDRCQUE0QixDQUFDO0FBQ3pDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFeEMsc0NBQXNDLEtBQUs7SUFDekM7OztNQUdFO0lBRUYsMkJBQTJCO0lBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUM3QixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLE9BQU8sQ0FBQztJQUVaLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkIsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDdEMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNoQjs7OztjQUlFO1lBRUYscUJBQXFCO1lBRXJCOzs7Y0FHRTtZQUNGLFFBQVEsQ0FBQztRQUNYLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDekIsV0FBVztZQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFFL0IsbUJBQW1CO1lBQ25CLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFXbkIsQ0FBQztRQUVELFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7TUFHRTtJQUNGLE1BQU0sQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxtQkFBbUIsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHO0lBQ3JDLElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixJQUFNLElBQUksR0FBRyxhQUFXLEtBQUssb0JBQWUsUUFBUSxpQkFBWSxNQUFRLENBQUM7SUFFekUsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQztRQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVEsSUFBTSxDQUFDLENBQUM7SUFDL0IsSUFBSTtRQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBUSxJQUFNLENBQUMsQ0FBQztBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc29sZS5jbGVhcigpO1xuY29uc3Qgc3V0ID0gZmluZEZpcnN0Tm9uUmVwZWF0YWJsZUNoYXJJbjtcbnRlc3RFcXVhbCgnJywgdW5kZWZpbmVkLCBzdXQpO1xudGVzdEVxdWFsKCdkJywgJ2QnLCBzdXQpO1xudGVzdEVxdWFsKCdkZCcsIHVuZGVmaW5lZCwgc3V0KTtcbnRlc3RFcXVhbCgnZGRhJywgJ2EnLCBzdXQpO1xudGVzdEVxdWFsKCdkZGFjJywgJ2EnLCBzdXQpO1xudGVzdEVxdWFsKCdkZGFjYycsICdhJywgc3V0KTtcbnRlc3RFcXVhbCgnZGRhYWNjJywgdW5kZWZpbmVkLCBzdXQpO1xudGVzdEVxdWFsKCdhYWFhYmJiY2RkZGRlZWVmJywgJ2MnLCBzdXQpO1xuXG5mdW5jdGlvbiBmaW5kRmlyc3ROb25SZXBlYXRhYmxlQ2hhckluKGlucHV0KSB7XG4gIC8qXG4gICAgUmVhc29uIG9mIHdoeSBJIGFtIGltcGxlbWVudGluZyBpdCB0aGlzIHdheSBpcyBiZWNhdXNlXG4gICAgSSB3YW50IHRvIHN0b3AgcHJvY2Vzc2luZyByaWdodCB3aGVuIHRoZSBjaGFyYWN0ZXIgaXMgZm91bmQgZm9yIGVmZmljaWVuY3kuXG4gICovXG5cbiAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2VzXG4gIGlmICghaW5wdXQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDEpIHJldHVybiBpbnB1dFswXTtcblxuICB2YXIgcHJldmlvdXMgPSBpbnB1dFswXTtcbiAgdmFyIHJlcGVhdGVkID0gZmFsc2U7XG4gIHZhciBjdXJyZW50O1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjdXJyZW50ID0gaW5wdXRbaV07XG5cbiAgICBpZiAoY3VycmVudCA9PT0gcHJldmlvdXMgJiYgIXJlcGVhdGVkKSB7XG4gICAgICByZXBlYXRlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICBXZSBjb3VsZCBkbyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLFxuICAgICAgICBidXQgc2luY2UgaXQncyBhbHJlYWR5IHRoZSBzYW1lLCBpdCdzIHBvaW50bGVzcyBhbmQgcmVkdW5kYW50LlxuICAgICAgICBTa2lwcGluZyBpdCB3aWxsIHNhZmUgc29tZSBleGVjdXRpb24gdGltZS5cbiAgICAgICovXG5cbiAgICAgIC8vcHJldmlvdXMgPSBjdXJyZW50O1xuXG4gICAgICAvKlxuICAgICAgICBJIHByZWZlciB0byBzdGFydCB0aGUgbmV4dCBpdGVyYXRpb24gaW1tZWRpYXRlbHkgaGVyZS5cbiAgICAgICAgSXQgc2hvd3MgdGhlIGludGVudCBjbGVhcmx5IGFuZCByZW1vdmUgYW55IGFtYmlndWl0eS5cbiAgICAgICovXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2hhcmFjdGVyIGNoYW5nZXNcbiAgICBpZiAoY3VycmVudCAhPT0gcHJldmlvdXMpIHtcbiAgICAgIC8vIEZvdW5kIGl0XG4gICAgICBpZiAoIXJlcGVhdGVkKSByZXR1cm4gcHJldmlvdXM7XG5cbiAgICAgIC8vIEhhbmRsZSBub3QgZm91bmRcbiAgICAgIHJlcGVhdGVkID0gZmFsc2U7XG5cbiAgICAgIC8qXG4gICAgICAgIEkgd2FzIGNvbnNpZGVyaW5nIHRvIGRvIHRoZSBmb2xsb3dpbmcgaGVyZSxcbiAgICAgICAgYnV0IGRlY2lkZWQgbm90IHRvIGRvIGl0IHNpbmNlIGl0IHZlcnkgY2xvc2UgdG8gdGhlIGVuZCBvZlxuICAgICAgICB0aGUgaXRlcmF0aW9uIGFuZCBub3QgZG9pbmcgaXQgYmFzaWNhbGx5IHNhdmUgc29tZSB2ZXJib3NpdHlcbiAgICAgICAgaW4gdGhlIGNvZGUgc28gSSBhbSBsZXR0aW5nIHRoZSByZWd1bGFyIGZsb3cgdG8gZG8gaXQgZm9yIG1lLlxuICAgICAgKi9cblxuICAgICAgLy8gcHJldmlvdXMgPSBjdXJyZW50O1xuICAgICAgLy8gY29udGludWU7XG4gICAgfVxuXG4gICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICB9XG5cbiAgLypcbiAgICBGaW5hbGx5LCBoYW5kbGUgc3BlY2lhbCBjYXNlcyB3aGVuIHdlIGhhdmUgaXRlcmF0ZWQgb3ZlciB0aGVcbiAgICBlbnRpcmUgaW5wdXQgc3RyaW5nLlxuICAqL1xuICByZXR1cm4gIXJlcGVhdGVkID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdGVzdEVxdWFsKGlucHV0LCBleHBlY3RlZCwgc3V0KSB7XG4gIGNvbnN0IGFjdHVhbCA9IHN1dChpbnB1dCk7XG4gIGNvbnN0IGluZm8gPSBgSW5wdXQ6ICcke2lucHV0fScgRXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9IEFjdHVhbDogJHthY3R1YWx9YDtcblxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZClcbiAgICBjb25zb2xlLmluZm8oYFBBU1MgJHtpbmZvfWApO1xuICBlbHNlXG4gICAgY29uc29sZS5lcnJvcihgRkFJTCAke2luZm99YCk7XG59Il19 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment