MinesweeperGame.prototype .countMines  =  function ( )  { 
    return  this ._countCellsInDict( this ._mines) ; 
} ; 
 
MinesweeperGame.prototype .countFlags  =  function ( )  { 
    return  this ._countCellsInDict( this ._flags) ; 
} ; 
 
MinesweeperGame.prototype .countOpenCells  =  function ( )  { 
    return  this ._countCellsInDict( this ._openCells) ; 
} ; 
 
MinesweeperGame.prototype .hasMine  =  function ( x,  y)  { 
    return  this ._isCellInDict( x,  y,  this ._mines) ; 
} ; 
 
MinesweeperGame.prototype .hasOpened  =  function ( x,  y)  { 
    return  this ._isCellInDict( x,  y,  this ._openCells) ; 
} ; 
 
MinesweeperGame.prototype .hasFlag  =  function ( x,  y)  { 
    return  this ._isCellInDict( x,  y,  this ._flags) ; 
} ; 
 
MinesweeperGame.prototype ._isCellInDict =  function ( x,  y,  dict)  { 
    if  ( dict[ y] )  { 
        return  dict[ y] [ x] ; 
    } 
    return  false ; 
} ; 
 
MinesweeperGame.prototype ._countCellsInDict =  function ( dict)  { 
    var  counter =  0 ; 
    for  ( var  y in  dict)  { 
        if  ( ! dict.hasOwnProperty ( y) )  continue ; 
        for  ( var  x in  dict[ y] )  { 
            if  ( ! dict[ y] .hasOwnProperty ( x) )  continue ; 
            counter++; 
        } 
    } 
    return  counter; 
 
} ; 
 
				TWluZXN3ZWVwZXJHYW1lLnByb3RvdHlwZS5jb3VudE1pbmVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5fY291bnRDZWxsc0luRGljdCh0aGlzLl9taW5lcyk7Cn07CgpNaW5lc3dlZXBlckdhbWUucHJvdG90eXBlLmNvdW50RmxhZ3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9jb3VudENlbGxzSW5EaWN0KHRoaXMuX2ZsYWdzKTsKfTsKCk1pbmVzd2VlcGVyR2FtZS5wcm90b3R5cGUuY291bnRPcGVuQ2VsbHMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9jb3VudENlbGxzSW5EaWN0KHRoaXMuX29wZW5DZWxscyk7Cn07CgpNaW5lc3dlZXBlckdhbWUucHJvdG90eXBlLmhhc01pbmUgPSBmdW5jdGlvbih4LCB5KSB7CiAgICByZXR1cm4gdGhpcy5faXNDZWxsSW5EaWN0KHgsIHksIHRoaXMuX21pbmVzKTsKfTsKCk1pbmVzd2VlcGVyR2FtZS5wcm90b3R5cGUuaGFzT3BlbmVkID0gZnVuY3Rpb24oeCwgeSkgewogICAgcmV0dXJuIHRoaXMuX2lzQ2VsbEluRGljdCh4LCB5LCB0aGlzLl9vcGVuQ2VsbHMpOwp9OwoKTWluZXN3ZWVwZXJHYW1lLnByb3RvdHlwZS5oYXNGbGFnID0gZnVuY3Rpb24oeCwgeSkgewogICAgcmV0dXJuIHRoaXMuX2lzQ2VsbEluRGljdCh4LCB5LCB0aGlzLl9mbGFncyk7Cn07CgpNaW5lc3dlZXBlckdhbWUucHJvdG90eXBlLl9pc0NlbGxJbkRpY3QgPSBmdW5jdGlvbih4LCB5LCBkaWN0KSB7CiAgICBpZiAoZGljdFt5XSkgewogICAgICAgIHJldHVybiBkaWN0W3ldW3hdOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9OwoKTWluZXN3ZWVwZXJHYW1lLnByb3RvdHlwZS5fY291bnRDZWxsc0luRGljdCA9IGZ1bmN0aW9uKGRpY3QpIHsKICAgIHZhciBjb3VudGVyID0gMDsKICAgIGZvciAodmFyIHkgaW4gZGljdCkgewogICAgICAgIGlmICghZGljdC5oYXNPd25Qcm9wZXJ0eSh5KSkgY29udGludWU7CiAgICAgICAgZm9yICh2YXIgeCBpbiBkaWN0W3ldKSB7CiAgICAgICAgICAgIGlmICghZGljdFt5XS5oYXNPd25Qcm9wZXJ0eSh4KSkgY29udGludWU7CiAgICAgICAgICAgIGNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnRlcjsKCn07