docs: function route_(element, newURL, alreadyShown) {
      let lastMatch = null;
      let newHash = newURL.split('#')[1] || '';
      let lastHash = newHash.split('/').reverse()[0];
      let match = lastHash.match(
        new RegExp(element.getAttribute('hash')));
      let parents = [element];
  
      // if match...
      if (match && match[0] === lastHash &&
        (match.length === 1 ||
        !document.querySelector(`[hash="${lastHash}"]`))) {
  
        // match_ newHash pushing all matched elements to parents
        lastMatch = match_(newHash, parents, []);
  
        // if default route do not match
        if ((lastMatch !== newHash) && (element.getAttribute('hash') === '')) {
          lastMatch = null;
        } else {
          match = newHash.match(new RegExp(parents.reduce((acc, curr) => {
            curr && (acc = curr.getAttribute('hash') + (acc ? '/' : '') + acc);
            return acc;
          }, '')));
          (!match) && (lastMatch = null);
  
          // unhide all matched elements
          match && parents.forEach(element => element && unhide_(element));
  
          // hide_ last elements. I mean, if go
          // from /page1/page2/page3
          // to   /page1/page2/page5
          // then hide only page3
          match &&
            (alreadyShown instanceof Array) &&
            alreadyShown.reduce((acc, curr) => {
              curr && !parents.includes(curr) && acc.push(curr);
              return acc;
            }, []).reverse().forEach(item => hide_(item));
  
          // if match, and no stateRevert then update lastMatch and dispatch show
          match && !stateRevert && (lastMatch = parents) &&
            dispatchShow_(element, match.slice(1)
            .reduce((detail, hash, i) => {
              detail[`param${i + 1}`] = hash;
              return detail;
            }, { router: element }));
        }
      } else {
        // do not hide elements unnecessarily
        if (!(alreadyShown.find &&
            alreadyShown.find(show => show === element))) {
          hide_(element);
        }
      }
      return lastMatch;
    }