Change:
When I attempt to Run the tests for the code I submitted for Roman Numerals Converter, the page freezes and I cannot solve the issue until I clear the cashe of my browser. Help!
I have the same issue. My browser complains about a long running script and then bails out.
Ok, I figured this one out... if you use the solution in the Gritter chat, that solution will cause a never ending loop, because of the while expression (while numCopy 0 - which is always true btw). This never ending loop will freeze your browser. Moreover, as I lately discovered, the solution there only covers very few of the cases that we need to test to pass the Bonfire. So back to the drawing board, people!
Leaving this open as a bug for someone to fix the solution in the wiki to one that works with the new test cases.

Discussion:
} pairedWith = pairedWith.pop(); <del> //debug('This is paired with', Object.keys(pairedWith)); debug('This is paired with's uncompleted bonfires array', pairedWith.uncompletedBonfires); </del> index = pairedWith.uncompletedBonfires.indexOf(bonfireHash); if (index > -1) { pairedWith.uncompletedBonfires.splice(index,1)

}; exports.returnNextBonfire = function(req, res, next) { <del> // TODO //var tempUser = false; </del> if (!req.user) { <del> res.redirect('bonfires/meet-bonfire'); //tempUser = true; //req.user = new User(); </del> <ins> return res.redirect('bonfires/meet-bonfire'); </ins> } <del> var currentTime = parseInt(+new Date() / 1000) </del> <ins> var currentTime = parseInt(+new Date() / 1000); </ins> if (currentTime - req.user.lastContentSync > 86400) { req.user.lastContentSync = currentTime; <del> var completed = req.user.completedBonfires.map(function(elem) { </del> <ins> var completed = req.user.completedBonfires.map(function (elem) { </ins> return elem._id; }); <del> req.user.uncompletedBonfires = resources.allBonfireIds().filter(function(elem) { if (completed.indexOf(elem) === -1) { return elem; } </del> <ins> req.user.uncompletedBonfires = resources.allBonfireIds().filter(function (elem) { if (completed.indexOf(elem) === -1) { return elem; } </ins> }); req.user.save(); }

completedWith: null, title: bonfire[bonfireNumber].name, name: bonfire[bonfireNumber].name, <del> difficulty: +bonfire[bonfireNumber].difficulty, </del> <ins> difficulty: Math.floor(+bonfire[bonfireNumber].difficulty), </ins> brief: bonfire[bonfireNumber].description[0], details: bonfire[bonfireNumber].description.slice(1), tests: bonfire[bonfireNumber].tests,

res.render('bonfire/show', { completedWith: null, title: bonfireName, <ins> name: bonfireName, </ins> difficulty: +bonfireDifficulty, brief: bonfireDescription[0], details: bonfireDescription.slice(1),

"challengeEntryPoint": "meetBonfire("You can do this!");" }, { <ins> "_id": "a202eed8fc186c8434cb6d61", "name": "Reverse a String", "difficulty": "1.01", "tests": [ "expect(reverseString('hello')).to.be.a('String');", "expect(reverseString('hello')).to.equal('olleh');", "expect(reverseString('Howdy')).to.equal('ydwoH');", "expect(reverseString('Greetings from Earth')).to.equal('htraE morf sgniteerG');" ], "description": [ "Reverse the provided string.", "You may need to turn the string into an array before you can reverse it.", "Your result must be a string." ], "challengeEntryPoint": "reverseString('hello');", "challengeSeed": "function reverseString(str) {n  return str;rn}" }, { "_id": "a302f7aae1aa3152a5b413bc", "name": "Factorialize a Number", "tests": [ "expect(factorialize(5)).to.be.a("Number");", "expect(factorialize(5)).to.equal(120);", "expect(factorialize(10)).to.equal(3628800);", "expect(factorialize(20)).to.equal(2432902008176640000);" ], "difficulty": "1.02", "description": [ "Return the factorial of the provided integer.", "If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.", "Factorials are often represented with the shorthand notation n!", "For example: 5! = 1 * 2 * 3 * 4 * 5 = 120f" ], "challengeSeed": "function factorialize(num) {n  return  num;rn}", "challengeEntryPoint": "factorialize(5);" }, { </ins> "_id" : "aaa48de84e1ecc7c742e1124", "name": "Check for Palindromes", <del> "difficulty": "1", </del> <ins> "difficulty": "1.03", </ins> "description": [ "Return 'true' if a given string is a palindrome.", "A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation and case.",

"challengeEntryPoint": "palindrome("eye");" }, { <ins> "_id": "a26cbbe9ad8655a977e1ceb5", "name": "Find the Longest Word in a String", "difficulty": "1.04", "description": [ "Return the length of the longest word in the provided sentence.", "Your response should be a number." ], "challengeEntryPoint": "findLongestWord('The quick brown fox jumped over the lazy dog');", "challengeSeed": "function findLongestWord(str) {n  return str.length;rn}", "tests": [ "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.be.a('Number');", "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.equal(6);", "expect(findLongestWord('May the force be with you')).to.equal(5);", "expect(findLongestWord('Google do a barrel roll')).to.equal(6);", "expect(findLongestWord('What is the average airspeed velocity of an unladen swallow')).to.equal(8);" ] }, { "_id": "ab6137d4e35944e21037b769", "name": "Title Case a Sentence", "difficulty": "1.05", "description": [ "Return the provided string with the first letter of each word capitalized.", "For the purpose of this exercise, you should also capitalize connecting words like 'the' and 'of'." ], "challengeEntryPoint": "titleCase("I'm a little tea pot")", "challengeSeed": "function titleCase(str) {n  return str;rn}", "tests": [ "expect(titleCase("I'm a little tea pot")).to.be.a('String');", "expect(titleCase("I'm a little tea pot")).to.equal("I'm A Little Tea Pot");", "expect(titleCase("sHoRt AnD sToUt")).to.equal("Short And Stout");", "expect(titleCase("HERE IS MY  HANDLE HERE IS MY SPOUT")).to.equal("Here Is My  Handle Here Is My Spout");" ] }, { "_id": "a789b3483989747d63b0e427", "name": "Return Largest Numbers in Arrays", "difficulty": "1.06", "description": [ "Return an array consisting of the largest numbers in the provided array. The array will contain 4 sub-arrays.", "Remember, you an iterate through an array with a simple for loop, and access each member with array syntax arr[i] .", "If you are writing your own Chai.js tests, be sure to use a deep equal statement instead of an equal statement when comparing arrays." ], "challengeEntryPoint": "largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);", "challengeSeed": "function largestOfFour(arr) {n  // You can do this!rn  return arr;rn}", "tests": [ "expect(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])).to.be.a('array');", "(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])).should.equals([5,27,39,1001]);", "assert(largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) === [9,35,97,1000000]);" ] }, { "_id": "a3566b1109230028080c9345", "name": "Sum All Numbers in a Range", "difficulty": "2.00", "description": [ "We'll pass you an array of two numbers. Return the sum those two numbers and all numbers between them.", "The lowest number will not always come first." ], "challengeEntryPoint": "sumAll([1, 4]);", "challengeSeed": "function sumAll(arr) {n  return(1);rn}", "tests": [ "expect(sumAll([1, 4])).to.be.a('Number');", "expect(sumAll([1, 4])).to.equal(10);", "expect(sumAll([4, 1])).to.equal(10);", "expect(sumAll([5, 10])).to.equal(45);", "expect(sumAll([10, 5])).to.equal(45);" ] }, { "_id": "a5229172f011153519423690", "name": "Sum All Odd Fibonacci Numbers", "difficulty": "2.01", "description": [ "Return the sum of all odd fibonacci numbers up to and including the passed number.", "Starting from 1, the first few numbers of a Fibonacci sequence are 1, 2, 3, 5 and 8, and each subsequent number is the sum of the previous two numbers." ], "challengeEntryPoint": "sumFibs(1000);", "challengeSeed": "function sumFibs(num) {n  return num;rn}", "tests": [ "expect(sumFibs(1)).to.be.a('number');", "expect(sumFibs(1000)).to.equal(3382);", "expect(sumFibs(4000000)).to.equal(10316619);", "expect(sumFibs(4)).to.equal(10);" ] }, { "_id": "a3bfc1673c0526e06d3ac698", "name": "Sum All Primes", "difficulty": "2.10", "description": [ "Sum all the prime numbers up to and including the provided number.", "A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible  by itself.", "The provided number may not be a prime." ], "challengeEntryPoint": "sumPrimes(10);", "challengeSeed": "function sumPrimes(num) {n  return num;rn}", "tests": [ "expect(sumPrimes(10)).to.be.a('number');", "expect(sumPrimes(10)).to.equal(27);", "expect(sumPrimes(977)).to.equal(73156);" ] }, { "_id": "ae9defd7acaf69703ab432ea", "name": "Smallest Common Multiple", "difficulty": "2.11", "description": [ "Find the smallest number that evenly divides all numbers in the provided range.", "The range will be an array of two numbers that will not necessarily be in numerical order." ], "challengeEntryPoint": "smallestCommons([1,5]);", "challengeSeed": "function smallestCommons(arr) {n  return arr;rn}rn", "tests": [ "expect(smallestCommons([1,5])).to.be.a('number');", "expect(smallestCommons([1,5])).to.equal(60);", "expect(smallestCommons([5,1])).to.equal(60);", "(smallestCommons([1,13])).should.equal(360360);" ] }, { </ins> "_id" : "aff0395860f5d3034dc0bfc9", "name": "Validate US Telephone Numbers", <del> "difficulty": "3", </del> <ins> "difficulty": "3.10", </ins> "description": [ "Return true if the passed string is a valid US phone number", "The user may fill out the form field any way they choose as long as it is a valid US number. The following are all valid formats for US numbers:",

"challengeEntryPoint": "telephoneCheck("555-555-5555");" }, { <del> "_id": "a202eed8fc186c8434cb6d61", "name": "Reverse a String", "difficulty": "1", "tests": [ "expect(reverseString('hello')).to.be.a('String');", "expect(reverseString('hello')).to.equal('olleh');", "expect(reverseString('Howdy')).to.equal('ydwoH');", "expect(reverseString('Greetings from Earth')).to.equal('htraE morf sgniteerG');" ], </del> <ins> "_id": "556138aff60341a09ed6c480", "name": "Inventory Update", "difficulty": "3.11", </ins> "description": [ <del> "Reverse the provided string.", "You may need to turn the string into an array before you can reverse it.", "Your result must be a string." </del> <ins> "Compare and update inventory stored in a 2d array against a second 2d array of a fresh delivery. Update current inventory item quantity, and if an item cannot be found, add the new item and quantity into the inventory array in alphabetical order." </ins> ], <del> "challengeEntryPoint": "reverseString('hello');", "challengeSeed": "function reverseString(str) {n  return str;rn}" }, { "_id": "a302f7aae1aa3152a5b413bc", "name": "Factorialize a Number", </del> <ins> "challengeEntryPoint": "// Example inventory listsrnvar curInv = [rn    [21, 'Bowling Ball'],rn    [2, 'Dirty Sock'],rn    [1, 'Hair pin'],rn    [5, 'Microphone']rn];rnrnvar newInv = [rn    [2, 'Hair Pin'],rn    [3, 'Half-Eaten Apple'],rn    [67, 'Bowling Ball'],rn    [7, 'Toothpaste']rn];rnrninventory(curInv, newInv);", "challengeSeed": "function inventory(arr1, arr2) {n    // All inventory must be accounted for or you're fired!rn    return arr1;rn}", </ins> "tests": [ <del> "expect(factorialize(5)).to.be.a("Number");", "expect(factorialize(5)).to.equal(120);", "expect(factorialize(10)).to.equal(3628800);", "expect(factorialize(20)).to.equal(2432902008176640000);" ], "difficulty": "1", "description": [ "Return the factorial of the provided integer.", "If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.", "Factorials are often represented with the shorthand notation n!", "For example: 5! = 1 * 2 * 3 * 4 * 5 = 120f" ], "challengeSeed": "function factorialize(num) {n  return  num;rn}", "challengeEntryPoint": "factorialize(5);" }, { "_id": "a26cbbe9ad8655a977e1ceb5", "name": "Find the Longest Word in a String", "difficulty": "1", "description": [ "Return the length of the longest word in the provided sentence.", "Your response should be a number." ], "challengeEntryPoint": "findLongestWord('The quick brown fox jumped over the lazy dog');", "challengeSeed": "function findLongestWord(str) {n  return str.length;rn}", "tests": [ "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.be.a('Number');", "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.equal(6);", "expect(findLongestWord('May the force be with you')).to.equal(5);", "expect(findLongestWord('Google do a barrel roll')).to.equal(6);", "expect(findLongestWord('What is the average airspeed velocity of an unladen swallow')).to.equal(8);" ] }, { "_id": "a3566b1109230028080c9345", "name": "Sum All Numbers in a Range", "difficulty": "2", "description": [ "We'll pass you an array of two numbers. Return the sum those two numbers and all numbers between them.", "The lowest number will not always come first." ], "challengeEntryPoint": "sumAll([1, 4]);", "challengeSeed": "function sumAll(arr) {n  return(1);rn}", "tests": [ "expect(sumAll([1, 4])).to.be.a('Number');", "expect(sumAll([1, 4])).to.equal(10);", "expect(sumAll([4, 1])).to.equal(10);", "expect(sumAll([5, 10])).to.equal(45);", "expect(sumAll([10, 5])).to.equal(45);" ] }, { "_id": "ab6137d4e35944e21037b769", "name": "Title Case a Sentence", "difficulty": "1", "description": [ "Return the provided string with the first letter of each word capitalized.", "For the purpose of this exercise, you should also capitalize connecting words like 'the' and 'of'." ], "challengeEntryPoint": "titleCase("I'm a little tea pot")", "challengeSeed": "function titleCase(str) {n  return str;rn}", "tests": [ "expect(titleCase("I'm a little tea pot")).to.be.a('String');", "expect(titleCase("I'm a little tea pot")).to.equal("I'm A Little Tea Pot");", "expect(titleCase("sHoRt AnD sToUt")).to.equal("Short And Stout");", "expect(titleCase("HERE IS MY  HANDLE HERE IS MY SPOUT")).to.equal("Here Is My  Handle Here Is My Spout");" </del> <ins> "expect(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']])).to.be.a('array');", "assert.equal(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]).length, 6);", "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[88, 'Bowling Ball'], [2, 'Dirty Sock'], [3, 'Hair pin'], [3, 'Half-Eaten Apple'], [5, 'Microphone'], [7, 'Toothpaste']]);", "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair pin'], [5, 'Microphone']], []), [[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair pin'], [5, 'Microphone']]);", "assert.deepEqual(inventory([], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]);", "assert.deepEqual(inventory([[0, 'Bowling Ball'], [0, 'Dirty Sock'], [0, 'Hair pin'], [0, 'Microphone']], [[1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [1, 'Bowling Ball'], [1, 'Toothpaste']]), [[1, 'Bowling Ball'], [1, 'Dirty Sock'], [1, 'Hair pin'], [1, 'Half-Eaten Apple'], [1, 'Microphone'], [1, 'Toothpaste']]);" </ins> ] } ]

.form-group label.col-sm-2.control-label.wrappable(for='description') description: .col-sm-10 <del> textarea#description.form-control(name="description", placeholder="Separate sentences by exactly one space only. Do not add in line breaks.") </del> <ins> textarea#description.form-control(name="description", rows=5, placeholder="Separate sentences by exactly one space only. Do not add in line breaks.") </ins> .form-group label.col-sm-2.control-label.wrappable(for='challengeSeed') challengeSeed: .col-sm-10