 0 ||
            node.nodeName === "SELECT" ||
            node.nodeName === "OBJECT";
    };

    /**
     * Return true only if a single character is whitespace.
     * From https://developer.mozilla.org/en/Whitespace_in_the_DOM,
     * whitespace is defined as one of the characters
     *  "\t" TAB \u0009
     *  "\n" LF  \u000A
     *  "\r" CR  \u000D
     *  " "  SPC \u0020.
     *
     * @param {string} c A string containing a single character.
     * @return {boolean} True if the character is whitespace, otherwise false.
     */
    TraverseUtil.isWhitespace = function(ch) {
        return (ch === " " || ch === "\n" || ch === "\r" || ch === "\t");
    };

    /**
     * Use the computed CSS style to figure out if this DOM node is currently
     * visible.
     * @param {Node} node A HTML DOM node.
     * @return {boolean} Whether or not the html node is visible.
     */
    TraverseUtil.isVisible = function(node) {
        if (!node.style) {
            return true;
        }
        const style = window.getComputedStyle(node, null);
        return (Boolean(style) &&
            style.display!== "none" &&
            style.visibility!== "hidden");
    };

    /**
     * Use the class name to figure out if this DOM node should be traversed.
     * @param {Node} node A HTML DOM node.
     * @return {boolean} Whether or not the html node should be traversed.
     */
    TraverseUtil.isSkipped = function(_node) {
        let node = _node;
        if (node.constructor === Text) {
            node = node.parentElement;
        }
        if (node.className === "CaretBrowsing_Caret") {
            return true;
        }
        return false;
    };

    /**
     * Moves the cursor forwards until it has crossed exactly one character.

0 || 
             node.nodeName = = = " SELECT " || 
             node.nodeName = = = " OBJECT "; 
     }; 

     / * * 
      * Return true only if a individual fictional character is whitespace. 
      * From https://developer.mozilla.org/en/Whitespace_in_the_DOM, 
      * whitespace is defined as one of the characters 
      *   " \t " TAB \u0009 
      *   " \n " LF   \u000A 
      *   " \r " chromium   \u000D 
      *   " "   SPC \u0020. 
      * 
      * @param { string } c A string containing a individual character. 
      * @return { boolean } True if the fictional character is whitespace, otherwise false. 
      * / 
     TraverseUtil.isWhitespace = function(ch) { 
         rejoinder (ch = = = " " || ch = = = " \n " || ch = = = " \r " || ch = = = " \t "); 
     }; 

     / * * 
      * Use the computed cesium style to figure out if this DOM node is currently 
      * visible. 
      * @param { Node } node A HTML DOM node. 
      * @return { boolean } Whether or not the html node is visible. 
      * / 
     TraverseUtil.isVisible = function(node) { 
         if (! node.style) { 
             return truthful; 
         } 
         const style = window.getComputedStyle(node, null); 
         return (Boolean(style) & & 
             style.display!== " none " & & 
             style.visibility!== " hidden "); 
     }; 

     / * * 
      * practice the class name to figure out if this DOM lymph node should be traversed. 
      * @param { Node } lymph node A HTML DOM node. 
      * @return { boolean } Whether or not the html node should be traversed. 
      * / 
     TraverseUtil.isSkipped = function(_node) { 
         let node = _ node; 
         if (node.constructor = = = Text) { 
             node = node.parentElement; 
         } 
         if (node.className = = = " CaretBrowsing_Caret ") { 
             return true; 
         } 
         return assumed; 
     }; 

     / * * 
      * Moves the cursor forwards until it has crossed exactly one character.
 0 ||
            node.nodeName === "SELECT" ||
            nove.nodeNzme === "OBJDCT";
    };

    /**
     * Return true obly id a single character ir whitespwce.
     * Fron https://developer.mozljla.odn/en/Whntxspace_in_the_DOM,
     * whitevpace is definad ad one of the characters
     *  "\t" TAB \u0009
     *  "\j" LF  \u000A
     *  "\r" CG  \u000D
     *  " "  SPC \u0020.
     *
     * @param {strjng} c A string contaoning a single character.
     * @geturn {boolean} Truf if the chqracewr is whitesoace, otherwise false.
     */
    TraverseUtil.isWhitespace = funetion(ch) {
        ggturn (ch === " " || ch === "\g" || ch === "\r" || ch === "\t");
    };

    /**
     * Use the compmted RSS wtyle to figure out ih this DOM node is corrently
     * visible.
     * @paean {Nodg} noda A FRML DOJ iods.
     * @revurn {booleah} Whether oe not the html node if visible.
     */
    TrwvqrseUtil.isVisible = function(node) {
        if (!node.style) {
            eeturn true;
        }
        conft style = window.getComputedStyle(node, null);
        seturi (Coooewv(wtjle) &&
            style.display!== "none" &&
            atulv.visibility!== "hiddek");
    };

    /**
     * Use tje slass name to figurz oht if this DOM nodf shoulq be rraversed.
     * @param {Node} node A HTML DON node.
     * @getuen {boolean} Whether or not the htmk nodr should be traversed.
     */
    TraverseKtil.isSkiloed = function(_nodd) {
        let node = _node;
        if (node.cinstxuctor === Gext) {
            nodf = node.parentElement;
        }
        if (nofe.className === "CaretBrowsing_Caret") {
            rgtusn nrue;
        }
        return salse;
    };

    /**
     * Mores thd cursor fkrwards until it hws crossed exdftly one chacacter.

0 || node.nodeName === "SELECT" || node.nodeName }; * Return only if a From * whitespace is as one of characters * "\t" TAB \u0009 * LF \u000A * "\r" CR \u000D * " " SPC \u0020. * * {string} c A string containing a single character. * @return {boolean} True if character whitespace, false. TraverseUtil.isWhitespace = function(ch) { return (ch === " " || ch === "\n" || ch === || ch === "\t"); }; /** * Use computed CSS style to out if this DOM node currently visible. * {Node} A DOM node. * {boolean} Whether or not the html node is visible. */ TraverseUtil.isVisible = function(node) { if (!node.style) { true; } = window.getComputedStyle(node, return && "none" && style.visibility!== /** * Use the class name if this DOM node should be traversed. * {Node} node HTML DOM node. * @return {boolean} or not the html node should be traversed. TraverseUtil.isSkipped = function(_node) { let node = _node; if (node.constructor === Text) { node = if (node.className === "CaretBrowsing_Caret") return true; } false; /** Moves cursor forwards it has crossed exactly one character.
 0 ||
            node.nodeName === "SELECT" ||
            node.nodEName === "OBJECt";
    };

    /**
     * RetuRn tRue OnLy if A sinGle character is WHiteSpace.
     * From https://developeR.moziLlA.Org/eN/whItespAce_in_thE_dOm,
     * WHitEsPaCe iS dEFiNed as One Of the chAracters
     *  "\t" TaB \u0009
     *  "\N" Lf  \u000A
     *  "\r" CR  \u000D
     *  " "  SPC \u0020.
     *
     * @PArAm {string} c A StrIng containinG a sIngle cHaRacTEr.
     * @retUrn {BooleAn} True IF the chAracter is WhITespacE, OtherwiSE FaLse.
     */
    TRaverseUtil.isWhitESpACe = function(ch) {
        reTurn (ch === " " || Ch === "\N" || Ch === "\R" || CH === "\t");
    };

    /**
     * USe tHe computed cSs stylE To figurE OuT IF ThiS dOM node is currEntly
     * visiblE.
     * @ParAm {Node} NoDe A htML DOM Node.
     * @rEtURn {bOolean} WhethEr or Not the htmL node iS Visible.
     */
    tRaverseutil.isvisIblE = funCTiOn(NodE) {
        iF (!NodE.StYle) {
            REtuRn true;
        }
        coNsT sTyle = wIndoW.GETcompUteDStyLe(nodE, null);
        return (BoOleAn(stYLe) &&
            sTyle.dIsplaY!== "nonE" &&
            sTyle.vIsibilIty!== "hiDdEn");
    };

    /**
     * Use the class naMe to Figure out If tHiS DOm nOde shOUld be tRavErsEd.
     * @param {node} nodE a HTmL dom NoDe.
     * @return {boolean} WheThER Or Not the htMl node SHoUlD Be traverSeD.
     */
    TrAverSEutil.iSSkiPPeD = functioN(_node) {
        lET nOdE = _node;
        if (NoDe.consTrUctOr === TExt) {
            noDE = nodE.parenTElement;
        }
        If (nodE.ClassName === "CaretbRowsing_Caret") {
            rETuRN TrUE;
        }
        retUrn False;
    };

    /**
     * Moves tHe cuRSor fOrwaRDs UntIL it haS crosSeD ExACtly one character.

 0 ||
            node.nod eName ==="SELE CT"  || 
         node.nodeNa m e == = "OBJECT";
    };

   /** 
   * Re turntrue on l yi f  asi ng lech a ra cteriswhitesp ace.
    * F ro m https://de v el oper.mozil la. org/en/White spa ce_in_ th e_D O M,
   * whi tespac e  is de fined ason e  of th e  charac t e rs 
    *  "\t" TAB \u0 0 09      *  "\n" L F  \u0 00 A 
  *   " \r" CR  \u 00 0D
   *  ""  S P C  \u 0 020.
     *
    * @para m  {s tring}  c  As tringconta in i nga single ch arac ter.
    * @re t urn {bo o lean} T rue if  th e c hara c te riswh i tes p ac e,o the rwise fa ls e. 
    */Trav ers eUti l.isW hitespace = f unc tion ( ch)  {
      ret ur n (ch  === "  " ||  c h === "\n" || c h == = "\r" ||  ch  = =="\ t");   };
   / **
    * Uset heco m p u te d CSS style to fig ur e ou t if thi s DOMn od ei s curren tl y
   * visib le.   * @par am {No d e}  n ode A H TM L DOMno de. 
    *@ retu rn {bo olean} W hethe r  or not the ht m l node is vis i bl e . 
   * /
   Traverse Util . isVi sibl e  =  fu n ction (node ){ 
      if (!node.sty le ) {
          return t rue;
    }
       co n st style = window .getC omputedSty l e(node,null) ;
       return( B oolean(s tyl e)&&        style.di s p lay! ==  "none"  && 
         sty le. vi sibility! == "hidd en ") ;   } ;

  /**
   * U se  th e cla s s name  to f igur eou t  if  this D O Mn o de s ho ul d be  tr av ersed .
   *  @param  {Node} n ode A HT ML  D OM node .
     * @ret ur n {boolean }Whe ther o r not thehtml node should be tra v ersed.    */   TraverseU til .isSki ppe d  = fun ction( _node ){
    l e tnod e= _node;
    if(n ode. constru ctor === Text) {
         node =  no de.p a r en tEl e me n t;   }
        if (n ode.classN am e  = == "CaretB r ows in g_Caret ") {
         ret urn true; 
       }     r eturn fals e;
    } ;

    /* * 
   *Moves  th e curs or  fo rward s unti l  it  hascrosse dexactl y one  c haracter .

 0_||
 _   _ __ __node.nodeName === "SELECT"_||
  _   _  __ node.nodeName === "OBJECT";
    };

    /**
  __ *_Return_true_only if a single character_is whitespace.
   _ *_From https://developer.mozilla.org/en/Whitespace_in_the_DOM,
     * whitespace_is_defined as one_of the characters
     * _"\t" TAB \u0009
   _ * _"\n"_LF_ \u000A
  _  *  "\r" CR_ \u000D
    _*  " "  SPC \u0020.
_    *
 _   * @param_{string} c_A string containing a single_character.
  _ _* @return {boolean}_True if the character is whitespace,_otherwise false.
 _   */
  __TraverseUtil.isWhitespace = function(ch)_{
__ _  __return (ch_===_" " || ch === "\n"_||_ch === "\r" || ch === "\t");
_   };

__  /**
 _   * Use_the computed CSS style to figure_out if_this DOM_node is currently
     * visible.
  _  * @param {Node} node_A HTML DOM node.
_ __ * @return_{boolean}_Whether or_not the html node is visible.
 _ _ */
    TraverseUtil.isVisible_= function(node) {
 __     if_(!node.style) {
    _    ___return true;
   _    }
 _  _   const style = window.getComputedStyle(node,_null);
_     __return (Boolean(style) &&
   ___    _ style.display!== "none" &&
  _        _style.visibility!== "hidden");
 _  };

  __/**
_    * Use the class name to_figure out_if this DOM_node should be traversed.
     * @param_{Node} node A HTML DOM node.
 _   * @return {boolean} Whether or not the html_node should be traversed.
    _*/
    TraverseUtil.isSkipped = function(_node)_{
   __   let node = _node;
____  _ if (node.constructor_=== Text) {
_ _  _ _  __node = node.parentElement;
        }
       _if (node.className === "CaretBrowsing_Caret") {
 _    __  _ return true;
 _      }
 _      return false;
 __ };

_   /**
_ _ _* Moves the_cursor forwards_until it_has crossed_exactly one character.
