Hex Artifact Content
Not logged in

Artifact 7abb676fc9641b690ac1f0ee41840c4ccffcafa0:

Unrecognized artifact
0000: 69 6d 70 6f 72 74 20 7b 20 72 65 6d 6f 74 65 2c  import { remote,
0010: 20 69 70 63 52 65 6e 64 65 72 65 72 20 7d 20 66   ipcRenderer } f
0020: 72 6f 6d 20 27 65 6c 65 63 74 72 6f 6e 27 0a 69  rom 'electron'.i
0030: 6d 70 6f 72 74 20 70 61 74 68 20 66 72 6f 6d 20  mport path from 
0040: 27 70 61 74 68 27 0a 69 6d 70 6f 72 74 20 2a 20  'path'.import * 
0050: 61 73 20 70 61 67 65 73 20 66 72 6f 6d 20 27 2e  as pages from '.
0060: 2e 2f 70 61 67 65 73 27 0a 69 6d 70 6f 72 74 20  ./pages'.import 
0070: 2a 20 61 73 20 7a 6f 6f 6d 20 66 72 6f 6d 20 27  * as zoom from '
0080: 2e 2e 2f 70 61 67 65 73 2f 7a 6f 6f 6d 27 0a 69  ../pages/zoom'.i
0090: 6d 70 6f 72 74 20 2a 20 61 73 20 79 6f 20 66 72  mport * as yo fr
00a0: 6f 6d 20 27 79 6f 2d 79 6f 27 0a 69 6d 70 6f 72  om 'yo-yo'.impor
00b0: 74 20 65 6d 69 74 53 74 72 65 61 6d 20 66 72 6f  t emitStream fro
00c0: 6d 20 27 65 6d 69 74 2d 73 74 72 65 61 6d 27 0a  m 'emit-stream'.
00d0: 69 6d 70 6f 72 74 20 7b 20 55 70 64 61 74 65 73  import { Updates
00e0: 4e 61 76 62 61 72 42 74 6e 20 7d 20 66 72 6f 6d  NavbarBtn } from
00f0: 20 27 2e 2f 6e 61 76 62 61 72 2f 75 70 64 61 74   './navbar/updat
0100: 65 73 27 0a 69 6d 70 6f 72 74 20 7b 20 44 6f 77  es'.import { Dow
0110: 6e 6c 6f 61 64 73 4e 61 76 62 61 72 42 74 6e 20  nloadsNavbarBtn 
0120: 7d 20 66 72 6f 6d 20 27 2e 2f 6e 61 76 62 61 72  } from './navbar
0130: 2f 64 6f 77 6e 6c 6f 61 64 73 27 0a 69 6d 70 6f  /downloads'.impo
0140: 72 74 20 7b 20 53 69 74 65 50 65 72 6d 73 4e 61  rt { SitePermsNa
0150: 76 62 61 72 42 74 6e 20 7d 20 66 72 6f 6d 20 27  vbarBtn } from '
0160: 2e 2f 6e 61 76 62 61 72 2f 73 69 74 65 2d 70 65  ./navbar/site-pe
0170: 72 6d 73 27 0a 69 6d 70 6f 72 74 20 7b 0a 20 20  rms'.import {.  
0180: 73 61 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 4d 65  safeConnectionMe
0190: 73 73 61 67 65 2c 0a 20 20 73 74 61 72 74 53 61  ssage,.  startSa
01a0: 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  feConnectionCoun
01b0: 74 64 6f 77 6e 2c 0a 20 20 73 65 74 75 70 53 61  tdown,.  setupSa
01c0: 66 65 52 65 63 6f 6e 6e 65 63 74 69 6f 6e 48 61  feReconnectionHa
01d0: 6e 64 6c 65 72 73 2c 0a 20 20 67 65 74 53 61 66  ndlers,.  getSaf
01e0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 74 65 72  eConnectionInter
01f0: 76 61 6c 49 64 0a 7d 20 66 72 6f 6d 20 27 2e 2f  valId.} from './
0200: 73 61 66 65 2d 72 65 63 6f 6e 6e 65 63 74 27 0a  safe-reconnect'.
0210: 0a 63 6f 6e 73 74 20 4b 45 59 43 4f 44 45 5f 44  .const KEYCODE_D
0220: 4f 57 4e 20 3d 20 34 30 0a 63 6f 6e 73 74 20 4b  OWN = 40.const K
0230: 45 59 43 4f 44 45 5f 55 50 20 3d 20 33 38 0a 63  EYCODE_UP = 38.c
0240: 6f 6e 73 74 20 4b 45 59 43 4f 44 45 5f 45 53 43  onst KEYCODE_ESC
0250: 20 3d 20 32 37 0a 63 6f 6e 73 74 20 4b 45 59 43   = 27.const KEYC
0260: 4f 44 45 5f 45 4e 54 45 52 20 3d 20 31 33 0a 63  ODE_ENTER = 13.c
0270: 6f 6e 73 74 20 4b 45 59 43 4f 44 45 5f 4e 20 3d  onst KEYCODE_N =
0280: 20 37 38 0a 63 6f 6e 73 74 20 4b 45 59 43 4f 44   78.const KEYCOD
0290: 45 5f 50 20 3d 20 38 30 0a 0a 63 6f 6e 73 74 20  E_P = 80..const 
02a0: 43 4c 49 45 4e 54 5f 54 59 50 45 53 20 3d 20 7b  CLIENT_TYPES = {
02b0: 0a 20 20 44 45 53 4b 54 4f 50 3a 20 27 44 45 53  .  DESKTOP: 'DES
02c0: 4b 54 4f 50 27 2c 0a 20 20 57 45 42 3a 20 27 57  KTOP',.  WEB: 'W
02d0: 45 42 27 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 52 45  EB'.};..const RE
02e0: 51 5f 54 59 50 45 53 20 3d 20 7b 0a 20 20 41 55  Q_TYPES = {.  AU
02f0: 54 48 3a 20 27 41 55 54 48 27 2c 0a 20 20 43 4f  TH: 'AUTH',.  CO
0300: 4e 54 41 49 4e 45 52 3a 20 27 43 4f 4e 54 41 49  NTAINER: 'CONTAI
0310: 4e 45 52 27 2c 0a 20 20 4d 44 41 54 41 3a 20 27  NER',.  MDATA: '
0320: 4d 44 41 54 41 27 0a 7d 3b 0a 0a 2f 2f 20 67 6c  MDATA'.};..// gl
0330: 6f 62 61 6c 73 0a 2f 2f 20 3d 0a 0a 76 61 72 20  obals.// =..var 
0340: 74 6f 6f 6c 62 61 72 4e 61 76 44 69 76 20 3d 20  toolbarNavDiv = 
0350: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
0360: 65 6e 74 42 79 49 64 28 27 74 6f 6f 6c 62 61 72  entById('toolbar
0370: 2d 6e 61 76 27 29 0a 76 61 72 20 75 70 64 61 74  -nav').var updat
0380: 65 73 4e 61 76 62 61 72 42 74 6e 20 3d 20 6e 75  esNavbarBtn = nu
0390: 6c 6c 0a 76 61 72 20 64 6f 77 6e 6c 6f 61 64 73  ll.var downloads
03a0: 4e 61 76 62 61 72 42 74 6e 20 3d 20 6e 75 6c 6c  NavbarBtn = null
03b0: 0a 76 61 72 20 73 69 74 65 50 65 72 6d 73 4e 61  .var sitePermsNa
03c0: 76 62 61 72 42 74 6e 20 3d 20 6e 75 6c 6c 0a 0a  vbarBtn = null..
03d0: 2f 2f 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 20  // autocomplete 
03e0: 64 61 74 61 0a 76 61 72 20 61 75 74 6f 63 6f 6d  data.var autocom
03f0: 70 6c 65 74 65 43 75 72 72 65 6e 74 56 61 6c 75  pleteCurrentValu
0400: 65 20 3d 20 6e 75 6c 6c 0a 76 61 72 20 61 75 74  e = null.var aut
0410: 6f 63 6f 6d 70 6c 65 74 65 43 75 72 72 65 6e 74  ocompleteCurrent
0420: 53 65 6c 65 63 74 69 6f 6e 20 3d 20 30 0a 76 61  Selection = 0.va
0430: 72 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 52 65  r autocompleteRe
0440: 73 75 6c 74 73 20 3d 20 6e 75 6c 6c 20 2f 2f 20  sults = null // 
0450: 69 66 20 73 65 74 20 74 6f 20 61 6e 20 61 72 72  if set to an arr
0460: 61 79 2c 20 77 69 6c 6c 20 72 65 6e 64 65 72 20  ay, will render 
0470: 64 72 6f 70 64 6f 77 6e 0a 0a 76 61 72 20 69 73  dropdown..var is
0480: 53 61 66 65 41 70 70 41 75 74 68 65 6e 74 69 63  SafeAppAuthentic
0490: 61 74 69 6e 67 20 3d 20 66 61 6c 73 65 0a 76 61  ating = false.va
04a0: 72 20 73 61 66 65 41 75 74 68 4e 65 74 77 6f 72  r safeAuthNetwor
04b0: 6b 53 74 61 74 65 20 3d 20 2d 31 0a 76 61 72 20  kState = -1.var 
04c0: 73 61 66 65 41 75 74 68 44 61 74 61 20 3d 20 6e  safeAuthData = n
04d0: 75 6c 6c 0a 76 61 72 20 73 61 66 65 41 75 74 68  ull.var safeAuth
04e0: 50 6f 70 75 70 44 69 76 20 3d 20 79 6f 60 3c 64  PopupDiv = yo`<d
04f0: 69 76 3e 3c 2f 64 69 76 3e 60 0a 0a 0a 0a 2f 2f  iv></div>`....//
0500: 20 73 61 66 65 20 61 70 70 20 70 6c 75 67 69 6e   safe app plugin
0510: 0a 69 70 63 52 65 6e 64 65 72 65 72 2e 73 65 6e  .ipcRenderer.sen
0520: 64 28 27 72 65 67 69 73 74 65 72 53 61 66 65 41  d('registerSafeA
0530: 70 70 27 29 3b 0a 73 65 74 75 70 53 61 66 65 52  pp');.setupSafeR
0540: 65 63 6f 6e 6e 65 63 74 69 6f 6e 48 61 6e 64 6c  econnectionHandl
0550: 65 72 73 28 20 75 70 64 61 74 65 20 29 0a 69 70  ers( update ).ip
0560: 63 52 65 6e 64 65 72 65 72 2e 6f 6e 28 27 77 65  cRenderer.on('we
0570: 62 43 6c 69 65 6e 74 41 75 74 68 52 65 71 27 2c  bClientAuthReq',
0580: 20 66 75 6e 63 74 69 6f 6e 28 65 76 65 6e 74 2c   function(event,
0590: 20 72 65 71 29 20 7b 0a 20 20 68 61 6e 64 6c 65   req) {.  handle
05a0: 53 61 66 65 41 75 74 68 41 75 74 68 65 6e 74 69  SafeAuthAuthenti
05b0: 63 61 74 69 6f 6e 28 72 65 71 2c 20 43 4c 49 45  cation(req, CLIE
05c0: 4e 54 5f 54 59 50 45 53 2e 57 45 42 29 3b 0a 7d  NT_TYPES.WEB);.}
05d0: 29 0a 0a 0a 2f 2f 20 73 61 66 65 20 61 75 74 68  )...// safe auth
05e0: 65 6e 74 69 63 61 74 6f 72 20 70 6c 75 67 69 6e  enticator plugin
05f0: 0a 69 70 63 52 65 6e 64 65 72 65 72 2e 73 65 6e  .ipcRenderer.sen
0600: 64 28 27 72 65 67 69 73 74 65 72 53 61 66 65 4e  d('registerSafeN
0610: 65 74 77 6f 72 6b 4c 69 73 74 65 6e 65 72 27 29  etworkListener')
0620: 3b 0a 69 70 63 52 65 6e 64 65 72 65 72 2e 73 65  ;.ipcRenderer.se
0630: 6e 64 28 27 72 65 67 69 73 74 65 72 4f 6e 41 75  nd('registerOnAu
0640: 74 68 52 65 71 27 29 3b 0a 69 70 63 52 65 6e 64  thReq');.ipcRend
0650: 65 72 65 72 2e 73 65 6e 64 28 27 72 65 67 69 73  erer.send('regis
0660: 74 65 72 4f 6e 43 6f 6e 74 61 69 6e 65 72 52 65  terOnContainerRe
0670: 71 27 29 3b 0a 69 70 63 52 65 6e 64 65 72 65 72  q');.ipcRenderer
0680: 2e 73 65 6e 64 28 27 72 65 67 69 73 74 65 72 4f  .send('registerO
0690: 6e 53 68 61 72 65 64 4d 44 61 74 61 52 65 71 27  nSharedMDataReq'
06a0: 29 3b 0a 69 70 63 52 65 6e 64 65 72 65 72 2e 73  );.ipcRenderer.s
06b0: 65 6e 64 28 27 72 65 67 69 73 74 65 72 4f 6e 52  end('registerOnR
06c0: 65 71 45 72 72 6f 72 27 29 3b 0a 0a 69 70 63 52  eqError');..ipcR
06d0: 65 6e 64 65 72 65 72 2e 6f 6e 28 27 6f 6e 4e 65  enderer.on('onNe
06e0: 74 77 6f 72 6b 53 74 61 74 75 73 27 2c 20 66 75  tworkStatus', fu
06f0: 6e 63 74 69 6f 6e 28 65 76 65 6e 74 2c 20 73 74  nction(event, st
0700: 61 74 75 73 29 20 7b 0a 20 20 73 61 66 65 41 75  atus) {.  safeAu
0710: 74 68 4e 65 74 77 6f 72 6b 53 74 61 74 65 20 3d  thNetworkState =
0720: 20 73 74 61 74 75 73 0a 20 20 69 66 20 28 73 74   status.  if (st
0730: 61 74 75 73 20 3d 3d 3d 20 2d 31 29 20 7b 0a 20  atus === -1) {. 
0740: 20 20 20 68 69 64 65 53 61 66 65 41 75 74 68 50     hideSafeAuthP
0750: 6f 70 75 70 28 29 3b 0a 20 20 20 20 73 74 61 72  opup();.    star
0760: 74 53 61 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 43  tSafeConnectionC
0770: 6f 75 6e 74 64 6f 77 6e 28 29 3b 0a 20 20 7d 0a  ountdown();.  }.
0780: 20 20 65 6c 73 65 7b 0a 20 20 20 20 6c 65 74 20    else{.    let 
0790: 73 61 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  safeConnectionIn
07a0: 74 65 72 76 61 6c 49 64 20 3d 20 67 65 74 53 61  tervalId = getSa
07b0: 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 74 65  feConnectionInte
07c0: 72 76 61 6c 49 64 28 29 3b 0a 20 20 20 20 63 6c  rvalId();.    cl
07d0: 65 61 72 49 6e 74 65 72 76 61 6c 28 20 73 61 66  earInterval( saf
07e0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 74 65 72  eConnectionInter
07f0: 76 61 6c 49 64 20 29 0a 20 20 7d 0a 0a 20 20 75  valId ).  }..  u
0800: 70 64 61 74 65 28 29 0a 7d 29 0a 0a 69 70 63 52  pdate().})..ipcR
0810: 65 6e 64 65 72 65 72 2e 6f 6e 28 27 6f 6e 41 75  enderer.on('onAu
0820: 74 68 52 65 71 27 2c 20 66 75 6e 63 74 69 6f 6e  thReq', function
0830: 28 65 76 65 6e 74 2c 20 64 61 74 61 29 20 7b 0a  (event, data) {.
0840: 20 20 69 66 20 28 64 61 74 61 29 20 7b 0a 20 20    if (data) {.  
0850: 20 20 73 61 66 65 41 75 74 68 44 61 74 61 20 3d    safeAuthData =
0860: 20 64 61 74 61 0a 20 20 20 20 73 68 6f 77 53 61   data.    showSa
0870: 66 65 41 75 74 68 50 6f 70 75 70 28 52 45 51 5f  feAuthPopup(REQ_
0880: 54 59 50 45 53 2e 41 55 54 48 29 0a 20 20 7d 0a  TYPES.AUTH).  }.
0890: 7d 29 3b 0a 0a 69 70 63 52 65 6e 64 65 72 65 72  });..ipcRenderer
08a0: 2e 6f 6e 28 27 6f 6e 43 6f 6e 74 61 69 6e 65 72  .on('onContainer
08b0: 52 65 71 27 2c 20 66 75 6e 63 74 69 6f 6e 28 65  Req', function(e
08c0: 76 65 6e 74 2c 20 64 61 74 61 29 20 7b 0a 20 20  vent, data) {.  
08d0: 69 66 20 28 64 61 74 61 29 20 7b 0a 20 20 20 20  if (data) {.    
08e0: 73 61 66 65 41 75 74 68 44 61 74 61 20 3d 20 64  safeAuthData = d
08f0: 61 74 61 0a 20 20 20 20 73 68 6f 77 53 61 66 65  ata.    showSafe
0900: 41 75 74 68 50 6f 70 75 70 28 52 45 51 5f 54 59  AuthPopup(REQ_TY
0910: 50 45 53 2e 43 4f 4e 54 41 49 4e 45 52 29 0a 20  PES.CONTAINER). 
0920: 20 7d 0a 7d 29 3b 0a 0a 69 70 63 52 65 6e 64 65   }.});..ipcRende
0930: 72 65 72 2e 6f 6e 28 27 6f 6e 53 68 61 72 65 64  rer.on('onShared
0940: 4d 44 61 74 61 52 65 71 27 2c 20 66 75 6e 63 74  MDataReq', funct
0950: 69 6f 6e 28 65 76 65 6e 74 2c 20 64 61 74 61 29  ion(event, data)
0960: 20 7b 0a 20 20 69 66 20 28 64 61 74 61 29 20 7b   {.  if (data) {
0970: 0a 20 20 20 20 73 61 66 65 41 75 74 68 44 61 74  .    safeAuthDat
0980: 61 20 3d 20 64 61 74 61 0a 20 20 20 20 73 68 6f  a = data.    sho
0990: 77 53 61 66 65 41 75 74 68 50 6f 70 75 70 28 52  wSafeAuthPopup(R
09a0: 45 51 5f 54 59 50 45 53 2e 4d 44 41 54 41 29 0a  EQ_TYPES.MDATA).
09b0: 20 20 7d 0a 7d 29 3b 0a 0a 69 70 63 52 65 6e 64    }.});..ipcRend
09c0: 65 72 65 72 2e 6f 6e 28 27 6f 6e 41 75 74 68 44  erer.on('onAuthD
09d0: 65 63 69 73 69 6f 6e 52 65 73 27 2c 20 66 75 6e  ecisionRes', fun
09e0: 63 74 69 6f 6e 28 65 76 65 6e 74 2c 20 72 65 73  ction(event, res
09f0: 29 20 7b 0a 20 20 69 73 53 61 66 65 41 70 70 41  ) {.  isSafeAppA
0a00: 75 74 68 65 6e 74 69 63 61 74 69 6e 67 20 3d 20  uthenticating = 
0a10: 66 61 6c 73 65 0a 20 20 69 66 20 28 72 65 73 2e  false.  if (res.
0a20: 74 79 70 65 20 3d 3d 3d 20 43 4c 49 45 4e 54 5f  type === CLIENT_
0a30: 54 59 50 45 53 2e 57 45 42 29 20 7b 0a 20 20 20  TYPES.WEB) {.   
0a40: 20 69 70 63 52 65 6e 64 65 72 65 72 2e 73 65 6e   ipcRenderer.sen
0a50: 64 28 27 77 65 62 43 6c 69 65 6e 74 41 75 74 68  d('webClientAuth
0a60: 52 65 73 27 2c 20 72 65 73 29 3b 0a 20 20 7d 0a  Res', res);.  }.
0a70: 20 20 75 70 64 61 74 65 28 29 0a 7d 29 3b 0a 0a    update().});..
0a80: 69 70 63 52 65 6e 64 65 72 65 72 2e 6f 6e 28 27  ipcRenderer.on('
0a90: 6f 6e 43 6f 6e 74 44 65 63 69 73 69 6f 6e 52 65  onContDecisionRe
0aa0: 73 27 2c 20 66 75 6e 63 74 69 6f 6e 28 65 76 65  s', function(eve
0ab0: 6e 74 2c 20 72 65 73 29 20 7b 0a 20 20 69 73 53  nt, res) {.  isS
0ac0: 61 66 65 41 70 70 41 75 74 68 65 6e 74 69 63 61  afeAppAuthentica
0ad0: 74 69 6e 67 20 3d 20 66 61 6c 73 65 0a 20 20 69  ting = false.  i
0ae0: 66 20 28 72 65 73 2e 74 79 70 65 20 3d 3d 3d 20  f (res.type === 
0af0: 43 4c 49 45 4e 54 5f 54 59 50 45 53 2e 57 45 42  CLIENT_TYPES.WEB
0b00: 29 20 7b 0a 20 20 20 20 69 70 63 52 65 6e 64 65  ) {.    ipcRende
0b10: 72 65 72 2e 73 65 6e 64 28 27 77 65 62 43 6c 69  rer.send('webCli
0b20: 65 6e 74 43 6f 6e 74 61 69 6e 65 72 52 65 73 27  entContainerRes'
0b30: 2c 20 72 65 73 29 3b 0a 20 20 7d 0a 20 20 75 70  , res);.  }.  up
0b40: 64 61 74 65 28 29 0a 7d 29 3b 0a 0a 69 70 63 52  date().});..ipcR
0b50: 65 6e 64 65 72 65 72 2e 6f 6e 28 27 6f 6e 55 6e  enderer.on('onUn
0b60: 41 75 74 68 44 65 63 69 73 69 6f 6e 52 65 73 27  AuthDecisionRes'
0b70: 2c 20 66 75 6e 63 74 69 6f 6e 20 28 65 76 65 6e  , function (even
0b80: 74 2c 20 72 65 73 29 20 7b 0a 20 20 69 66 20 28  t, res) {.  if (
0b90: 72 65 73 2e 74 79 70 65 20 3d 3d 3d 20 43 4c 49  res.type === CLI
0ba0: 45 4e 54 5f 54 59 50 45 53 2e 57 45 42 29 20 7b  ENT_TYPES.WEB) {
0bb0: 0a 20 20 20 20 69 70 63 52 65 6e 64 65 72 65 72  .    ipcRenderer
0bc0: 2e 73 65 6e 64 28 27 77 65 62 43 6c 69 65 6e 74  .send('webClient
0bd0: 41 75 74 68 52 65 73 27 2c 20 72 65 73 29 3b 0a  AuthRes', res);.
0be0: 20 20 7d 0a 7d 29 3b 0a 0a 69 70 63 52 65 6e 64    }.});..ipcRend
0bf0: 65 72 65 72 2e 6f 6e 28 27 6f 6e 53 68 61 72 65  erer.on('onShare
0c00: 64 4d 44 61 74 61 52 65 73 27 2c 20 66 75 6e 63  dMDataRes', func
0c10: 74 69 6f 6e 28 65 76 65 6e 74 2c 20 72 65 73 29  tion(event, res)
0c20: 20 7b 0a 20 20 69 73 53 61 66 65 41 70 70 41 75   {.  isSafeAppAu
0c30: 74 68 65 6e 74 69 63 61 74 69 6e 67 20 3d 20 66  thenticating = f
0c40: 61 6c 73 65 0a 20 20 69 66 20 28 72 65 73 2e 74  alse.  if (res.t
0c50: 79 70 65 20 3d 3d 3d 20 43 4c 49 45 4e 54 5f 54  ype === CLIENT_T
0c60: 59 50 45 53 2e 57 45 42 29 20 7b 0a 20 20 20 20  YPES.WEB) {.    
0c70: 69 70 63 52 65 6e 64 65 72 65 72 2e 73 65 6e 64  ipcRenderer.send
0c80: 28 27 77 65 62 43 6c 69 65 6e 74 53 68 61 72 65  ('webClientShare
0c90: 64 4d 44 61 74 61 52 65 73 27 2c 20 72 65 73 29  dMDataRes', res)
0ca0: 3b 0a 20 20 7d 0a 20 20 75 70 64 61 74 65 28 29  ;.  }.  update()
0cb0: 0a 7d 29 3b 0a 0a 69 70 63 52 65 6e 64 65 72 65  .});..ipcRendere
0cc0: 72 2e 6f 6e 28 27 6f 6e 41 75 74 68 52 65 73 45  r.on('onAuthResE
0cd0: 72 72 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e 28  rror', function(
0ce0: 65 76 65 6e 74 2c 20 72 65 73 29 20 7b 0a 20 20  event, res) {.  
0cf0: 69 73 53 61 66 65 41 70 70 41 75 74 68 65 6e 74  isSafeAppAuthent
0d00: 69 63 61 74 69 6e 67 20 3d 20 66 61 6c 73 65 0a  icating = false.
0d10: 20 20 69 66 20 28 72 65 73 20 26 26 20 72 65 73    if (res && res
0d20: 2e 65 72 72 6f 72 20 26 26 20 28 72 65 73 2e 65  .error && (res.e
0d30: 72 72 6f 72 2e 74 6f 4c 6f 77 65 72 43 61 73 65  rror.toLowerCase
0d40: 28 29 20 3d 3d 3d 20 27 75 6e 61 75 74 68 6f 72  () === 'unauthor
0d50: 69 73 65 64 27 29 29 20 7b 0a 20 20 20 20 6f 6e  ised')) {.    on
0d60: 43 6c 69 63 6b 4f 70 65 6e 53 61 66 65 41 75 74  ClickOpenSafeAut
0d70: 68 48 6f 6d 65 28 29 0a 20 20 7d 0a 20 20 69 66  hHome().  }.  if
0d80: 20 28 72 65 73 2e 74 79 70 65 20 3d 3d 3d 20 43   (res.type === C
0d90: 4c 49 45 4e 54 5f 54 59 50 45 53 2e 57 45 42 29  LIENT_TYPES.WEB)
0da0: 20 7b 0a 20 20 20 20 69 70 63 52 65 6e 64 65 72   {.    ipcRender
0db0: 65 72 2e 73 65 6e 64 28 27 77 65 62 43 6c 69 65  er.send('webClie
0dc0: 6e 74 45 72 72 6f 72 52 65 73 27 2c 20 72 65 73  ntErrorRes', res
0dd0: 29 3b 0a 20 20 7d 0a 20 20 75 70 64 61 74 65 28  );.  }.  update(
0de0: 29 0a 7d 29 3b 0a 0a 69 70 63 52 65 6e 64 65 72  ).});..ipcRender
0df0: 65 72 2e 6f 6e 28 27 6f 6e 55 6e 41 75 74 68 52  er.on('onUnAuthR
0e00: 65 73 45 72 72 6f 72 27 2c 20 66 75 6e 63 74 69  esError', functi
0e10: 6f 6e 20 28 65 76 65 6e 74 2c 20 72 65 73 29 20  on (event, res) 
0e20: 7b 0a 20 20 69 66 20 28 72 65 73 2e 74 79 70 65  {.  if (res.type
0e30: 20 3d 3d 3d 20 43 4c 49 45 4e 54 5f 54 59 50 45   === CLIENT_TYPE
0e40: 53 2e 57 45 42 29 20 7b 0a 20 20 20 20 69 70 63  S.WEB) {.    ipc
0e50: 52 65 6e 64 65 72 65 72 2e 73 65 6e 64 28 27 77  Renderer.send('w
0e60: 65 62 43 6c 69 65 6e 74 45 72 72 6f 72 52 65 73  ebClientErrorRes
0e70: 27 2c 20 72 65 73 29 3b 0a 20 20 7d 0a 7d 29 3b  ', res);.  }.});
0e80: 0a 0a 2f 2f 20 65 78 70 6f 72 74 65 64 20 66 75  ..// exported fu
0e90: 6e 63 74 69 6f 6e 73 0a 2f 2f 20 3d 0a 0a 65 78  nctions.// =..ex
0ea0: 70 6f 72 74 20 66 75 6e 63 74 69 6f 6e 20 73 65  port function se
0eb0: 74 75 70 20 28 29 20 7b 0a 20 20 2f 2f 20 63 72  tup () {.  // cr
0ec0: 65 61 74 65 20 74 68 65 20 62 75 74 74 6f 6e 20  eate the button 
0ed0: 6d 61 6e 61 67 65 72 73 0a 20 20 75 70 64 61 74  managers.  updat
0ee0: 65 73 4e 61 76 62 61 72 42 74 6e 20 3d 20 6e 65  esNavbarBtn = ne
0ef0: 77 20 55 70 64 61 74 65 73 4e 61 76 62 61 72 42  w UpdatesNavbarB
0f00: 74 6e 28 29 0a 20 20 64 6f 77 6e 6c 6f 61 64 73  tn().  downloads
0f10: 4e 61 76 62 61 72 42 74 6e 20 3d 20 6e 65 77 20  NavbarBtn = new 
0f20: 44 6f 77 6e 6c 6f 61 64 73 4e 61 76 62 61 72 42  DownloadsNavbarB
0f30: 74 6e 28 29 0a 20 20 73 69 74 65 50 65 72 6d 73  tn().  sitePerms
0f40: 4e 61 76 62 61 72 42 74 6e 20 3d 20 6e 65 77 20  NavbarBtn = new 
0f50: 53 69 74 65 50 65 72 6d 73 4e 61 76 62 61 72 42  SitePermsNavbarB
0f60: 74 6e 28 29 0a 7d 0a 0a 65 78 70 6f 72 74 20 66  tn().}..export f
0f70: 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 45 6c  unction createEl
0f80: 20 28 69 64 29 20 7b 0a 20 20 2f 2f 20 72 65 6e   (id) {.  // ren
0f90: 64 65 72 0a 20 20 76 61 72 20 65 6c 20 3d 20 72  der.  var el = r
0fa0: 65 6e 64 65 72 28 69 64 2c 20 6e 75 6c 6c 29 0a  ender(id, null).
0fb0: 20 20 74 6f 6f 6c 62 61 72 4e 61 76 44 69 76 2e    toolbarNavDiv.
0fc0: 61 70 70 65 6e 64 43 68 69 6c 64 28 65 6c 29 0a  appendChild(el).
0fd0: 20 20 72 65 74 75 72 6e 20 65 6c 0a 7d 0a 0a 65    return el.}..e
0fe0: 78 70 6f 72 74 20 66 75 6e 63 74 69 6f 6e 20 66  xport function f
0ff0: 6f 63 75 73 4c 6f 63 61 74 69 6f 6e 20 28 70 61  ocusLocation (pa
1000: 67 65 29 20 7b 0a 20 20 76 61 72 20 65 6c 20 3d  ge) {.  var el =
1010: 20 70 61 67 65 2e 6e 61 76 62 61 72 45 6c 2e 71   page.navbarEl.q
1020: 75 65 72 79 53 65 6c 65 63 74 6f 72 28 27 2e 6e  uerySelector('.n
1030: 61 76 2d 6c 6f 63 61 74 69 6f 6e 2d 69 6e 70 75  av-location-inpu
1040: 74 27 29 0a 20 20 65 6c 2e 66 6f 63 75 73 28 29  t').  el.focus()
1050: 0a 7d 0a 0a 65 78 70 6f 72 74 20 66 75 6e 63 74  .}..export funct
1060: 69 6f 6e 20 73 68 6f 77 49 6e 70 61 67 65 46 69  ion showInpageFi
1070: 6e 64 20 28 70 61 67 65 29 20 7b 0a 20 20 2f 2f  nd (page) {.  //
1080: 20 73 68 6f 77 20 63 6f 6e 74 72 6f 6c 20 61 6e   show control an
1090: 64 20 68 69 67 68 6c 69 67 68 74 20 74 65 78 74  d highlight text
10a0: 0a 20 20 70 61 67 65 2e 69 73 49 6e 70 61 67 65  .  page.isInpage
10b0: 46 69 6e 64 69 6e 67 20 3d 20 74 72 75 65 0a 20  Finding = true. 
10c0: 20 75 70 64 61 74 65 28 70 61 67 65 29 0a 20 20   update(page).  
10d0: 76 61 72 20 65 6c 20 3d 20 70 61 67 65 2e 6e 61  var el = page.na
10e0: 76 62 61 72 45 6c 2e 71 75 65 72 79 53 65 6c 65  vbarEl.querySele
10f0: 63 74 6f 72 28 27 2e 6e 61 76 2d 66 69 6e 64 2d  ctor('.nav-find-
1100: 69 6e 70 75 74 27 29 0a 20 20 65 6c 2e 66 6f 63  input').  el.foc
1110: 75 73 28 29 0a 20 20 65 6c 2e 73 65 6c 65 63 74  us().  el.select
1120: 28 29 0a 0a 20 20 2f 2f 20 69 6e 69 74 20 73 65  ()..  // init se
1130: 61 72 63 68 20 69 66 20 74 68 65 72 65 27 73 20  arch if there's 
1140: 61 20 76 61 6c 75 65 20 6c 65 66 74 6f 76 65 72  a value leftover
1150: 0a 20 20 2f 2f 20 46 49 58 4d 45 0a 20 20 2f 2f  .  // FIXME.  //
1160: 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 67   this behavior g
1170: 6f 74 20 6c 6f 73 74 20 69 6e 20 74 68 65 20 73  ot lost in the s
1180: 77 69 74 63 68 20 6f 76 65 72 20 74 6f 20 75 73  witch over to us
1190: 69 6e 67 20 79 6f 2d 79 6f 0a 20 20 2f 2f 20 64  ing yo-yo.  // d
11a0: 6f 20 77 65 20 77 61 6e 74 20 69 74 20 62 61 63  o we want it bac
11b0: 6b 3f 0a 20 20 2f 2f 20 2d 70 72 66 0a 20 20 2f  k?.  // -prf.  /
11c0: 2f 20 69 66 20 28 65 6c 2e 76 61 6c 75 65 29 0a  / if (el.value).
11d0: 20 20 2f 2f 20 70 61 67 65 2e 66 69 6e 64 49 6e    // page.findIn
11e0: 50 61 67 65 28 65 6c 2e 76 61 6c 75 65 29 0a 7d  Page(el.value).}
11f0: 0a 0a 65 78 70 6f 72 74 20 66 75 6e 63 74 69 6f  ..export functio
1200: 6e 20 68 69 64 65 49 6e 70 61 67 65 46 69 6e 64  n hideInpageFind
1210: 20 28 70 61 67 65 29 20 7b 0a 20 20 70 61 67 65   (page) {.  page
1220: 2e 73 74 6f 70 46 69 6e 64 49 6e 50 61 67 65 28  .stopFindInPage(
1230: 27 63 6c 65 61 72 53 65 6c 65 63 74 69 6f 6e 27  'clearSelection'
1240: 29 0a 20 20 70 61 67 65 2e 69 73 49 6e 70 61 67  ).  page.isInpag
1250: 65 46 69 6e 64 69 6e 67 20 3d 20 66 61 6c 73 65  eFinding = false
1260: 0a 20 20 75 70 64 61 74 65 28 70 61 67 65 29 0a  .  update(page).
1270: 7d 0a 0a 65 78 70 6f 72 74 20 66 75 6e 63 74 69  }..export functi
1280: 6f 6e 20 63 6c 65 61 72 41 75 74 6f 63 6f 6d 70  on clearAutocomp
1290: 6c 65 74 65 20 28 29 20 7b 0a 20 20 69 66 20 28  lete () {.  if (
12a0: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 52 65 73 75  autocompleteResu
12b0: 6c 74 73 29 20 7b 0a 20 20 20 20 61 75 74 6f 63  lts) {.    autoc
12c0: 6f 6d 70 6c 65 74 65 43 75 72 72 65 6e 74 56 61  ompleteCurrentVa
12d0: 6c 75 65 20 3d 20 6e 75 6c 6c 0a 20 20 20 20 61  lue = null.    a
12e0: 75 74 6f 63 6f 6d 70 6c 65 74 65 43 75 72 72 65  utocompleteCurre
12f0: 6e 74 53 65 6c 65 63 74 69 6f 6e 20 3d 20 30 0a  ntSelection = 0.
1300: 20 20 20 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65      autocomplete
1310: 52 65 73 75 6c 74 73 20 3d 20 6e 75 6c 6c 0a 20  Results = null. 
1320: 20 20 20 75 70 64 61 74 65 28 29 0a 20 20 7d 0a     update().  }.
1330: 7d 0a 0a 65 78 70 6f 72 74 20 66 75 6e 63 74 69  }..export functi
1340: 6f 6e 20 75 70 64 61 74 65 20 28 70 61 67 65 29  on update (page)
1350: 20 7b 0a 20 20 2f 2f 20 66 65 74 63 68 20 63 75   {.  // fetch cu
1360: 72 72 65 6e 74 20 70 61 67 65 2c 20 69 66 20 6e  rrent page, if n
1370: 6f 74 20 67 69 76 65 6e 0a 20 20 70 61 67 65 20  ot given.  page 
1380: 3d 20 70 61 67 65 73 2e 67 65 74 41 63 74 69 76  = pages.getActiv
1390: 65 28 29 0a 0a 20 20 2f 2f 20 72 65 6e 64 65 72  e()..  // render
13a0: 0a 20 20 79 6f 2e 75 70 64 61 74 65 28 70 61 67  .  yo.update(pag
13b0: 65 2e 6e 61 76 62 61 72 45 6c 2c 20 72 65 6e 64  e.navbarEl, rend
13c0: 65 72 28 70 61 67 65 2e 69 64 2c 20 70 61 67 65  er(page.id, page
13d0: 29 29 0a 7d 0a 0a 65 78 70 6f 72 74 20 66 75 6e  )).}..export fun
13e0: 63 74 69 6f 6e 20 75 70 64 61 74 65 4c 6f 63 61  ction updateLoca
13f0: 74 69 6f 6e 20 28 70 61 67 65 29 20 7b 0a 20 20  tion (page) {.  
1400: 2f 2f 20 66 65 74 63 68 20 63 75 72 72 65 6e 74  // fetch current
1410: 20 70 61 67 65 2c 20 69 66 20 6e 6f 74 20 67 69   page, if not gi
1420: 76 65 6e 0a 20 20 70 61 67 65 20 3d 20 70 61 67  ven.  page = pag
1430: 65 20 7c 7c 20 70 61 67 65 73 2e 67 65 74 41 63  e || pages.getAc
1440: 74 69 76 65 28 29 0a 0a 20 20 2f 2f 20 75 70 64  tive()..  // upd
1450: 61 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 20 20 76  ate location.  v
1460: 61 72 20 61 64 64 72 45 6c 20 3d 20 70 61 67 65  ar addrEl = page
1470: 2e 6e 61 76 62 61 72 45 6c 2e 71 75 65 72 79 53  .navbarEl.queryS
1480: 65 6c 65 63 74 6f 72 28 27 2e 6e 61 76 2d 6c 6f  elector('.nav-lo
1490: 63 61 74 69 6f 6e 2d 69 6e 70 75 74 27 29 0a 20  cation-input'). 
14a0: 20 76 61 72 20 69 73 41 64 64 72 45 6c 46 6f 63   var isAddrElFoc
14b0: 75 73 65 64 20 3d 20 61 64 64 72 45 6c 2e 6d 61  used = addrEl.ma
14c0: 74 63 68 65 73 28 27 3a 66 6f 63 75 73 27 29 0a  tches(':focus').
14d0: 20 20 69 66 20 28 21 69 73 41 64 64 72 45 6c 46    if (!isAddrElF
14e0: 6f 63 75 73 65 64 20 7c 7c 20 21 61 64 64 72 45  ocused || !addrE
14f0: 6c 2e 76 61 6c 75 65 29 20 7b 20 2f 2f 20 6f 6e  l.value) { // on
1500: 6c 79 20 75 70 64 61 74 65 20 69 66 20 6e 6f 74  ly update if not
1510: 20 66 6f 63 75 73 65 64 20 6f 72 20 65 6d 70 74   focused or empt
1520: 79 2c 20 73 6f 20 77 65 20 64 6f 6e 74 20 6d 65  y, so we dont me
1530: 73 73 20 75 70 20 77 68 61 74 20 74 68 65 20 75  ss up what the u
1540: 73 65 72 20 69 73 20 64 6f 69 6e 67 0a 20 20 20  ser is doing.   
1550: 20 61 64 64 72 45 6c 2e 76 61 6c 75 65 20 3d 20   addrEl.value = 
1560: 70 61 67 65 2e 67 65 74 49 6e 74 65 6e 64 65 64  page.getIntended
1570: 55 52 4c 28 29 0a 20 20 20 20 69 66 20 28 69 73  URL().    if (is
1580: 41 64 64 72 45 6c 46 6f 63 75 73 65 64 29 20 2f  AddrElFocused) /
1590: 2f 20 69 66 20 77 61 73 20 66 6f 63 75 73 65 64  / if was focused
15a0: 2c 20 74 68 65 6e 20 73 65 6c 65 63 74 20 77 68  , then select wh
15b0: 61 74 20 77 65 20 70 75 74 20 69 6e 0a 20 20 20  at we put in.   
15c0: 20 20 20 61 64 64 72 45 6c 2e 73 65 6c 65 63 74     addrEl.select
15d0: 28 29 0a 20 20 7d 0a 7d 0a 0a 65 78 70 6f 72 74  ().  }.}..export
15e0: 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e 64 6c 65   function handle
15f0: 53 61 66 65 41 75 74 68 41 75 74 68 65 6e 74 69  SafeAuthAuthenti
1600: 63 61 74 69 6f 6e 28 72 65 71 2c 20 74 79 70 65  cation(req, type
1610: 29 20 7b 0a 20 20 69 70 63 52 65 6e 64 65 72 65  ) {.  ipcRendere
1620: 72 2e 73 65 6e 64 28 27 64 65 63 72 79 70 74 52  r.send('decryptR
1630: 65 71 75 65 73 74 27 2c 20 72 65 71 2c 20 74 79  equest', req, ty
1640: 70 65 20 7c 7c 20 43 4c 49 45 4e 54 5f 54 59 50  pe || CLIENT_TYP
1650: 45 53 2e 44 45 53 4b 54 4f 50 29 0a 20 20 63 6c  ES.DESKTOP).  cl
1660: 65 61 72 41 75 74 6f 63 6f 6d 70 6c 65 74 65 28  earAutocomplete(
1670: 29 0a 20 20 2f 2f 20 46 49 58 4d 45 20 63 68 61  ).  // FIXME cha
1680: 6e 67 65 20 74 6f 20 63 6f 6e 73 74 61 6e 74 20  nge to constant 
1690: 69 6e 73 74 61 6e 64 20 6f 66 20 2d 31 0a 20 20  instand of -1.  
16a0: 2f 2f 20 69 66 20 28 73 61 66 65 41 75 74 68 4e  // if (safeAuthN
16b0: 65 74 77 6f 72 6b 53 74 61 74 65 20 3d 3d 3d 20  etworkState === 
16c0: 2d 31 29 20 7b 0a 20 20 2f 2f 20 20 20 6f 6e 43  -1) {.  //   onC
16d0: 6c 69 63 6b 4f 70 65 6e 53 61 66 65 41 75 74 68  lickOpenSafeAuth
16e0: 48 6f 6d 65 28 29 0a 20 20 2f 2f 20 7d 0a 7d 0a  Home().  // }.}.
16f0: 0a 66 75 6e 63 74 69 6f 6e 20 61 75 74 68 44 65  .function authDe
1700: 63 69 73 69 6f 6e 28 69 73 41 6c 6c 6f 77 65 64  cision(isAllowed
1710: 2c 20 72 65 71 54 79 70 65 29 20 7b 0a 20 20 69  , reqType) {.  i
1720: 73 53 61 66 65 41 70 70 41 75 74 68 65 6e 74 69  sSafeAppAuthenti
1730: 63 61 74 69 6e 67 20 3d 20 74 72 75 65 0a 20 20  cating = true.  
1740: 75 70 64 61 74 65 28 29 0a 20 20 69 66 20 28 72  update().  if (r
1750: 65 71 54 79 70 65 20 3d 3d 3d 20 52 45 51 5f 54  eqType === REQ_T
1760: 59 50 45 53 2e 41 55 54 48 29 20 7b 0a 20 20 20  YPES.AUTH) {.   
1770: 20 72 65 74 75 72 6e 20 69 70 63 52 65 6e 64 65   return ipcRende
1780: 72 65 72 2e 73 65 6e 64 28 27 72 65 67 69 73 74  rer.send('regist
1790: 65 72 41 75 74 68 44 65 63 69 73 69 6f 6e 27 2c  erAuthDecision',
17a0: 20 73 61 66 65 41 75 74 68 44 61 74 61 2c 20 69   safeAuthData, i
17b0: 73 41 6c 6c 6f 77 65 64 29 3b 0a 20 20 7d 20 65  sAllowed);.  } e
17c0: 6c 73 65 20 69 66 20 28 72 65 71 54 79 70 65 20  lse if (reqType 
17d0: 3d 3d 3d 20 52 45 51 5f 54 59 50 45 53 2e 43 4f  === REQ_TYPES.CO
17e0: 4e 54 41 49 4e 45 52 29 20 7b 0a 20 20 20 20 72  NTAINER) {.    r
17f0: 65 74 75 72 6e 20 69 70 63 52 65 6e 64 65 72 65  eturn ipcRendere
1800: 72 2e 73 65 6e 64 28 27 72 65 67 69 73 74 65 72  r.send('register
1810: 43 6f 6e 74 61 69 6e 65 72 44 65 63 69 73 69 6f  ContainerDecisio
1820: 6e 27 2c 20 73 61 66 65 41 75 74 68 44 61 74 61  n', safeAuthData
1830: 2c 20 69 73 41 6c 6c 6f 77 65 64 29 3b 0a 20 20  , isAllowed);.  
1840: 7d 0a 20 20 69 70 63 52 65 6e 64 65 72 65 72 2e  }.  ipcRenderer.
1850: 73 65 6e 64 28 27 72 65 67 69 73 74 65 72 53 68  send('registerSh
1860: 61 72 65 64 4d 44 61 74 61 44 65 63 69 73 69 6f  aredMDataDecisio
1870: 6e 27 2c 20 73 61 66 65 41 75 74 68 44 61 74 61  n', safeAuthData
1880: 2c 20 69 73 41 6c 6c 6f 77 65 64 29 3b 0a 7d 0a  , isAllowed);.}.
1890: 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c 69 63  .function onClic
18a0: 6b 41 6c 6c 6f 77 42 74 6e 28 65 29 20 7b 0a 20  kAllowBtn(e) {. 
18b0: 20 68 69 64 65 53 61 66 65 41 75 74 68 50 6f 70   hideSafeAuthPop
18c0: 75 70 28 29 0a 20 20 61 75 74 68 44 65 63 69 73  up().  authDecis
18d0: 69 6f 6e 28 74 72 75 65 2c 20 65 2e 74 61 72 67  ion(true, e.targ
18e0: 65 74 2e 64 61 74 61 73 65 74 2e 74 79 70 65 29  et.dataset.type)
18f0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 43  .}..function onC
1900: 6c 69 63 6b 44 65 6e 79 42 74 6e 28 65 29 20 7b  lickDenyBtn(e) {
1910: 0a 20 20 68 69 64 65 53 61 66 65 41 75 74 68 50  .  hideSafeAuthP
1920: 6f 70 75 70 28 29 0a 20 20 61 75 74 68 44 65 63  opup().  authDec
1930: 69 73 69 6f 6e 28 66 61 6c 73 65 2c 20 65 2e 74  ision(false, e.t
1940: 61 72 67 65 74 2e 64 61 74 61 73 65 74 2e 74 79  arget.dataset.ty
1950: 70 65 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  pe).}..function 
1960: 6f 6e 43 6c 69 63 6b 53 6b 69 70 42 74 6e 28 65  onClickSkipBtn(e
1970: 29 20 7b 0a 20 20 68 69 64 65 53 61 66 65 41 75  ) {.  hideSafeAu
1980: 74 68 50 6f 70 75 70 28 29 0a 20 20 69 70 63 52  thPopup().  ipcR
1990: 65 6e 64 65 72 65 72 2e 73 65 6e 64 28 27 73 6b  enderer.send('sk
19a0: 69 70 41 75 74 68 52 65 71 75 65 73 74 27 2c 20  ipAuthRequest', 
19b0: 74 72 75 65 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69  true);.}..functi
19c0: 6f 6e 20 68 69 64 65 53 61 66 65 41 75 74 68 50  on hideSafeAuthP
19d0: 6f 70 75 70 28 29 20 7b 0a 20 20 79 6f 2e 75 70  opup() {.  yo.up
19e0: 64 61 74 65 28 73 61 66 65 41 75 74 68 50 6f 70  date(safeAuthPop
19f0: 75 70 44 69 76 2c 20 79 6f 60 3c 64 69 76 3e 3c  upDiv, yo`<div><
1a00: 2f 64 69 76 3e 60 29 0a 7d 0a 0a 66 75 6e 63 74  /div>`).}..funct
1a10: 69 6f 6e 20 73 68 6f 77 53 61 66 65 41 75 74 68  ion showSafeAuth
1a20: 50 6f 70 75 70 28 72 65 71 54 79 70 65 29 20 7b  Popup(reqType) {
1a30: 0a 20 20 76 61 72 20 63 61 70 69 74 61 6c 69 7a  .  var capitaliz
1a40: 65 4e 61 6d 65 20 3d 20 66 75 6e 63 74 69 6f 6e  eName = function
1a50: 28 6e 61 6d 65 29 20 7b 0a 20 20 20 20 72 65 74  (name) {.    ret
1a60: 75 72 6e 20 6e 61 6d 65 5b 30 5d 2e 74 6f 55 70  urn name[0].toUp
1a70: 70 65 72 43 61 73 65 28 29 20 2b 20 6e 61 6d 65  perCase() + name
1a80: 2e 73 75 62 73 74 72 28 31 29 0a 20 20 7d 0a 20  .substr(1).  }. 
1a90: 20 76 61 72 20 70 61 72 73 65 4e 61 6d 65 20 3d   var parseName =
1aa0: 20 66 75 6e 63 74 69 6f 6e 28 6e 61 6d 65 29 20   function(name) 
1ab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 61 70  {.    return cap
1ac0: 69 74 61 6c 69 7a 65 4e 61 6d 65 28 6e 61 6d 65  italizeName(name
1ad0: 2e 72 65 70 6c 61 63 65 28 2f 2d 7c 5f 2f 67 2c  .replace(/-|_/g,
1ae0: 20 27 20 27 29 29 3b 0a 20 20 7d 0a 20 20 76 61   ' '));.  }.  va
1af0: 72 20 61 72 72 54 6f 59 6f 20 3d 20 66 75 6e 63  r arrToYo = func
1b00: 74 69 6f 6e 28 61 72 72 29 20 7b 0a 20 20 20 20  tion(arr) {.    
1b10: 76 61 72 20 67 65 74 50 65 72 6d 69 73 73 69 6f  var getPermissio
1b20: 6e 50 68 72 61 73 65 20 3d 20 66 75 6e 63 74 69  nPhrase = functi
1b30: 6f 6e 28 70 65 72 6d 29 20 7b 0a 20 20 20 20 20  on(perm) {.     
1b40: 20 73 77 69 74 63 68 20 28 70 65 72 6d 29 20 7b   switch (perm) {
1b50: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 72  .        case 'r
1b60: 65 61 64 27 3a 0a 20 20 20 20 20 20 20 20 20 20  ead':.          
1b70: 72 65 74 75 72 6e 20 79 6f 60 3c 73 70 61 6e 3e  return yo`<span>
1b80: 3c 62 3e 52 65 61 64 3c 2f 62 3e 20 64 61 74 61  <b>Read</b> data
1b90: 3c 2f 73 70 61 6e 3e 60 3b 0a 20 20 20 20 20 20  </span>`;.      
1ba0: 20 20 63 61 73 65 20 27 69 6e 73 65 72 74 27 3a    case 'insert':
1bb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bc0: 6e 20 79 6f 60 3c 73 70 61 6e 3e 3c 62 3e 53 74  n yo`<span><b>St
1bd0: 6f 72 65 3c 2f 62 3e 20 64 61 74 61 3c 2f 73 70  ore</b> data</sp
1be0: 61 6e 3e 60 3b 0a 20 20 20 20 20 20 20 20 63 61  an>`;.        ca
1bf0: 73 65 20 27 75 70 64 61 74 65 27 3a 0a 20 20 20  se 'update':.   
1c00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 79 6f         return yo
1c10: 60 3c 73 70 61 6e 3e 3c 62 3e 55 70 64 61 74 65  `<span><b>Update
1c20: 3c 2f 62 3e 20 65 78 69 73 74 69 6e 67 20 64 61  </b> existing da
1c30: 74 61 3c 2f 73 70 61 6e 3e 60 3b 0a 20 20 20 20  ta</span>`;.    
1c40: 20 20 20 20 63 61 73 65 20 27 64 65 6c 65 74 65      case 'delete
1c50: 27 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ':.          ret
1c60: 75 72 6e 20 79 6f 60 3c 73 70 61 6e 3e 3c 62 3e  urn yo`<span><b>
1c70: 44 65 6c 65 74 65 3c 2f 62 3e 20 64 61 74 61 3c  Delete</b> data<
1c80: 2f 73 70 61 6e 3e 60 3b 0a 20 20 20 20 20 20 20  /span>`;.       
1c90: 20 63 61 73 65 20 27 6d 61 6e 61 67 65 70 65 72   case 'manageper
1ca0: 6d 69 73 73 69 6f 6e 73 27 3a 0a 20 20 20 20 20  missions':.     
1cb0: 20 20 20 20 20 72 65 74 75 72 6e 20 79 6f 60 3c       return yo`<
1cc0: 73 70 61 6e 3e 3c 62 3e 4d 61 6e 61 67 65 20 50  span><b>Manage P
1cd0: 65 72 6d 69 73 73 69 6f 6e 73 3c 2f 62 3e 3c 2f  ermissions</b></
1ce0: 73 70 61 6e 3e 60 3b 0a 20 20 20 20 20 20 20 20  span>`;.        
1cf0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
1d00: 20 20 20 72 65 74 75 72 6e 20 79 6f 60 3c 73 70     return yo`<sp
1d10: 61 6e 3e 24 7b 70 61 72 73 65 4e 61 6d 65 28 70  an>${parseName(p
1d20: 65 72 6d 29 7d 3c 2f 73 70 61 6e 3e 60 3b 0a 20  erm)}</span>`;. 
1d30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a 0a 20       }.    };.. 
1d40: 20 20 20 72 65 74 75 72 6e 20 4f 62 6a 65 63 74     return Object
1d50: 2e 6b 65 79 73 28 61 72 72 29 2e 6d 61 70 28 66  .keys(arr).map(f
1d60: 75 6e 63 74 69 6f 6e 28 69 74 65 6d 29 20 7b 0a  unction(item) {.
1d70: 20 20 20 20 20 20 69 66 20 28 21 61 72 72 5b 69        if (!arr[i
1d80: 74 65 6d 5d 29 20 7b 0a 20 20 20 20 20 20 20 20  tem]) {.        
1d90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1da0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 79 6f 60        return yo`
1db0: 3c 6c 69 3e 24 7b 67 65 74 50 65 72 6d 69 73 73  <li>${getPermiss
1dc0: 69 6f 6e 50 68 72 61 73 65 28 69 74 65 6d 2e 74  ionPhrase(item.t
1dd0: 6f 4c 6f 77 65 72 43 61 73 65 28 29 29 7d 3c 2f  oLowerCase())}</
1de0: 6c 69 3e 60 3b 0a 20 20 20 20 7d 29 0a 20 20 7d  li>`;.    }).  }
1df0: 0a 0a 20 20 63 6f 6e 73 74 20 67 65 74 43 6f 6e  ..  const getCon
1e00: 74 20 3d 20 66 75 6e 63 74 69 6f 6e 28 63 6f 6e  t = function(con
1e10: 74 4e 61 6d 65 29 20 7b 0a 20 20 20 20 63 6f 6e  tName) {.    con
1e20: 73 74 20 6f 62 6a 20 3d 20 7b 7d 3b 0a 20 20 20  st obj = {};.   
1e30: 20 73 77 69 74 63 68 20 28 63 6f 6e 74 4e 61 6d   switch (contNam
1e40: 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e) {.      case 
1e50: 27 5f 64 6f 63 75 6d 65 6e 74 73 27 3a 0a 20 20  '_documents':.  
1e60: 20 20 20 20 20 20 6f 62 6a 5b 27 6e 61 6d 65 27        obj['name'
1e70: 5d 20 3d 20 27 44 6f 63 75 6d 65 6e 74 20 63 6f  ] = 'Document co
1e80: 6e 74 61 69 6e 65 72 27 0a 20 20 20 20 20 20 20  ntainer'.       
1e90: 20 6f 62 6a 5b 27 64 65 73 63 27 5d 20 3d 20 27   obj['desc'] = '
1ea0: 43 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 73 74  Container for st
1eb0: 6f 72 69 6e 67 20 67 65 6e 65 72 61 6c 20 64 6f  oring general do
1ec0: 63 75 6d 65 6e 74 73 27 0a 20 20 20 20 20 20 20  cuments'.       
1ed0: 20 6f 62 6a 5b 27 73 74 79 6c 65 27 5d 20 3d 20   obj['style'] = 
1ee0: 27 64 6f 63 75 6d 65 6e 74 27 0a 20 20 20 20 20  'document'.     
1ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1f00: 63 61 73 65 20 27 5f 64 6f 77 6e 6c 6f 61 64 73  case '_downloads
1f10: 27 3a 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27  ':.        obj['
1f20: 6e 61 6d 65 27 5d 20 3d 20 27 44 6f 77 6e 6c 6f  name'] = 'Downlo
1f30: 61 64 20 63 6f 6e 74 61 69 6e 65 72 27 0a 20 20  ad container'.  
1f40: 20 20 20 20 20 20 6f 62 6a 5b 27 64 65 73 63 27        obj['desc'
1f50: 5d 20 3d 20 27 43 6f 6e 74 61 69 6e 65 72 20 66  ] = 'Container f
1f60: 6f 72 20 64 6f 77 6e 6c 6f 61 64 65 64 20 66 69  or downloaded fi
1f70: 6c 65 73 27 0a 20 20 20 20 20 20 20 20 6f 62 6a  les'.        obj
1f80: 5b 27 73 74 79 6c 65 27 5d 20 3d 20 27 64 6f 77  ['style'] = 'dow
1f90: 6e 6c 6f 61 64 27 0a 20 20 20 20 20 20 20 20 62  nload'.        b
1fa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
1fb0: 20 27 5f 6d 75 73 69 63 27 3a 0a 20 20 20 20 20   '_music':.     
1fc0: 20 20 20 6f 62 6a 5b 27 6e 61 6d 65 27 5d 20 3d     obj['name'] =
1fd0: 20 27 4d 75 73 69 63 20 63 6f 6e 74 61 69 6e 65   'Music containe
1fe0: 72 27 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27  r'.        obj['
1ff0: 64 65 73 63 27 5d 20 3d 20 27 43 6f 6e 74 61 69  desc'] = 'Contai
2000: 6e 65 72 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ner for storing 
2010: 6d 75 73 69 63 20 66 69 6c 65 73 27 0a 20 20 20  music files'.   
2020: 20 20 20 20 20 6f 62 6a 5b 27 73 74 79 6c 65 27       obj['style'
2030: 5d 20 3d 20 27 6d 75 73 69 63 27 0a 20 20 20 20  ] = 'music'.    
2040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2050: 20 63 61 73 65 20 27 5f 70 69 63 74 75 72 65 73   case '_pictures
2060: 27 3a 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27  ':.        obj['
2070: 6e 61 6d 65 27 5d 20 3d 20 27 50 69 63 74 75 72  name'] = 'Pictur
2080: 65 73 20 63 6f 6e 74 61 69 6e 65 72 27 0a 20 20  es container'.  
2090: 20 20 20 20 20 20 6f 62 6a 5b 27 64 65 73 63 27        obj['desc'
20a0: 5d 20 3d 20 27 43 6f 6e 74 61 69 6e 65 72 20 66  ] = 'Container f
20b0: 6f 72 20 73 74 6f 72 69 6e 67 20 70 69 63 74 75  or storing pictu
20c0: 72 65 20 66 69 6c 65 73 27 0a 20 20 20 20 20 20  re files'.      
20d0: 20 20 6f 62 6a 5b 27 73 74 79 6c 65 27 5d 20 3d    obj['style'] =
20e0: 20 27 70 69 63 74 75 72 65 73 27 0a 20 20 20 20   'pictures'.    
20f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2100: 20 63 61 73 65 20 27 5f 76 69 64 65 6f 73 27 3a   case '_videos':
2110: 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27 6e 61  .        obj['na
2120: 6d 65 27 5d 20 3d 20 27 56 69 64 65 6f 73 20 63  me'] = 'Videos c
2130: 6f 6e 74 61 69 6e 65 72 27 0a 20 20 20 20 20 20  ontainer'.      
2140: 20 20 6f 62 6a 5b 27 64 65 73 63 27 5d 20 3d 20    obj['desc'] = 
2150: 27 43 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 73  'Container for s
2160: 74 6f 72 69 6e 67 20 76 69 64 65 6f 20 66 69 6c  toring video fil
2170: 65 73 27 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b  es'.        obj[
2180: 27 73 74 79 6c 65 27 5d 20 3d 20 27 76 69 64 65  'style'] = 'vide
2190: 6f 73 27 0a 20 20 20 20 20 20 20 20 62 72 65 61  os'.        brea
21a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 5f  k;.      case '_
21b0: 70 75 62 6c 69 63 27 3a 0a 20 20 20 20 20 20 20  public':.       
21c0: 20 6f 62 6a 5b 27 6e 61 6d 65 27 5d 20 3d 20 27   obj['name'] = '
21d0: 50 75 62 6c 69 63 20 63 6f 6e 74 61 69 6e 65 72  Public container
21e0: 27 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27 64  '.        obj['d
21f0: 65 73 63 27 5d 20 3d 20 27 43 6f 6e 74 61 69 6e  esc'] = 'Contain
2200: 65 72 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 75  er for storing u
2210: 6e 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 27  nencrypted data'
2220: 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27 73 74  .        obj['st
2230: 79 6c 65 27 5d 20 3d 20 27 70 75 62 6c 69 63 27  yle'] = 'public'
2240: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2250: 20 20 20 20 20 20 63 61 73 65 20 27 5f 70 75 62        case '_pub
2260: 6c 69 63 4e 61 6d 65 73 27 3a 0a 20 20 20 20 20  licNames':.     
2270: 20 20 20 6f 62 6a 5b 27 6e 61 6d 65 27 5d 20 3d     obj['name'] =
2280: 20 27 50 75 62 6c 69 63 20 6e 61 6d 65 73 20 63   'Public names c
2290: 6f 6e 74 61 69 6e 65 72 27 0a 20 20 20 20 20 20  ontainer'.      
22a0: 20 20 6f 62 6a 5b 27 64 65 73 63 27 5d 20 3d 20    obj['desc'] = 
22b0: 27 43 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 73  'Container for s
22c0: 74 6f 72 69 6e 67 20 70 75 62 6c 69 63 20 70 72  toring public pr
22d0: 6f 66 69 6c 65 20 72 65 6c 61 74 65 64 20 69 6e  ofile related in
22e0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 50 75 62 6c 69  formation. Publi
22f0: 63 20 6e 61 6d 65 73 20 61 6e 64 20 61 73 73 6f  c names and asso
2300: 63 69 61 74 65 64 20 73 65 72 76 69 63 65 73 20  ciated services 
2310: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
2320: 69 73 20 63 6f 6e 74 61 69 6e 65 72 27 0a 20 20  is container'.  
2330: 20 20 20 20 20 20 6f 62 6a 5b 27 73 74 79 6c 65        obj['style
2340: 27 5d 20 3d 20 27 70 75 62 6c 69 63 4e 61 6d 65  '] = 'publicName
2350: 73 27 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  s'.        break
2360: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
2370: 0a 20 20 20 20 20 20 20 20 6f 62 6a 5b 27 6e 61  .        obj['na
2380: 6d 65 27 5d 20 3d 20 63 6f 6e 74 4e 61 6d 65 0a  me'] = contName.
2390: 20 20 20 20 20 20 20 20 6f 62 6a 5b 27 64 65 73          obj['des
23a0: 63 27 5d 20 3d 20 27 27 0a 20 20 20 20 20 20 20  c'] = ''.       
23b0: 20 6f 62 6a 5b 27 73 74 79 6c 65 27 5d 20 3d 20   obj['style'] = 
23c0: 27 64 65 66 61 75 6c 74 27 0a 20 20 20 20 20 20  'default'.      
23d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23e0: 20 20 20 72 65 74 75 72 6e 20 6f 62 6a 3b 0a 20     return obj;. 
23f0: 20 7d 0a 0a 20 20 76 61 72 20 72 65 71 4b 65 79   }..  var reqKey
2400: 20 3d 20 27 61 75 74 68 52 65 71 27 3b 0a 20 20   = 'authReq';.  
2410: 69 66 20 28 72 65 71 54 79 70 65 20 3d 3d 3d 20  if (reqType === 
2420: 52 45 51 5f 54 59 50 45 53 2e 43 4f 4e 54 41 49  REQ_TYPES.CONTAI
2430: 4e 45 52 29 20 7b 0a 20 20 20 20 72 65 71 4b 65  NER) {.    reqKe
2440: 79 20 3d 20 27 63 6f 6e 74 52 65 71 27 0a 20 20  y = 'contReq'.  
2450: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 71 54 79  } else if (reqTy
2460: 70 65 20 3d 3d 3d 20 52 45 51 5f 54 59 50 45 53  pe === REQ_TYPES
2470: 2e 4d 44 41 54 41 29 20 7b 0a 20 20 20 20 72 65  .MDATA) {.    re
2480: 71 4b 65 79 20 3d 20 27 6d 44 61 74 61 52 65 71  qKey = 'mDataReq
2490: 27 0a 20 20 7d 0a 0a 20 20 76 61 72 20 63 6f 6e  '.  }..  var con
24a0: 74 4f 72 50 65 72 6d 4c 65 6e 20 3d 20 28 72 65  tOrPermLen = (re
24b0: 71 54 79 70 65 20 3d 3d 3d 20 52 45 51 5f 54 59  qType === REQ_TY
24c0: 50 45 53 2e 4d 44 41 54 41 29 20 3f 20 73 61 66  PES.MDATA) ? saf
24d0: 65 41 75 74 68 44 61 74 61 5b 72 65 71 4b 65 79  eAuthData[reqKey
24e0: 5d 2e 6d 64 61 74 61 2e 6c 65 6e 67 74 68 20 3a  ].mdata.length :
24f0: 20 73 61 66 65 41 75 74 68 44 61 74 61 5b 72 65   safeAuthData[re
2500: 71 4b 65 79 5d 2e 63 6f 6e 74 61 69 6e 65 72 73  qKey].containers
2510: 2e 6c 65 6e 67 74 68 3b 0a 20 20 76 61 72 20 61  .length;.  var a
2520: 6c 6c 6f 77 42 74 6e 20 3d 20 79 6f 60 3c 62 75  llowBtn = yo`<bu
2530: 74 74 6f 6e 20 63 6c 61 73 73 3d 22 61 6c 6c 6f  tton class="allo
2540: 77 2d 62 74 6e 22 20 6f 6e 63 6c 69 63 6b 3d 24  w-btn" onclick=$
2550: 7b 6f 6e 43 6c 69 63 6b 41 6c 6c 6f 77 42 74 6e  {onClickAllowBtn
2560: 7d 20 64 61 74 61 2d 74 79 70 65 3d 22 24 7b 72  } data-type="${r
2570: 65 71 54 79 70 65 7d 22 3e 41 6c 6c 6f 77 3c 2f  eqType}">Allow</
2580: 62 75 74 74 6f 6e 3e 60 0a 20 20 76 61 72 20 64  button>`.  var d
2590: 65 6e 79 42 74 6e 20 3d 20 79 6f 60 3c 62 75 74  enyBtn = yo`<but
25a0: 74 6f 6e 20 63 6c 61 73 73 3d 22 64 65 6e 79 2d  ton class="deny-
25b0: 62 74 6e 22 20 6f 6e 63 6c 69 63 6b 3d 24 7b 6f  btn" onclick=${o
25c0: 6e 43 6c 69 63 6b 44 65 6e 79 42 74 6e 7d 20 64  nClickDenyBtn} d
25d0: 61 74 61 2d 74 79 70 65 3d 22 24 7b 72 65 71 54  ata-type="${reqT
25e0: 79 70 65 7d 22 3e 44 65 6e 79 3c 2f 62 75 74 74  ype}">Deny</butt
25f0: 6f 6e 3e 60 0a 20 20 76 61 72 20 63 6f 6e 74 50  on>`.  var contP
2600: 61 72 61 20 3d 20 28 63 6f 6e 74 4f 72 50 65 72  ara = (contOrPer
2610: 6d 4c 65 6e 20 3d 3d 3d 20 30 29 20 3f 20 27 69  mLen === 0) ? 'i
2620: 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 75 74  s requesting aut
2630: 68 6f 72 69 73 61 74 69 6f 6e 2e 27 20 3a 20 27  horisation.' : '
2640: 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61 63  is requesting ac
2650: 63 65 73 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c  cess to the foll
2660: 6f 77 69 6e 67 20 63 6f 6e 74 61 69 6e 65 72 73  owing containers
2670: 27 3b 0a 20 20 69 66 20 28 72 65 71 54 79 70 65  ';.  if (reqType
2680: 20 3d 3d 3d 20 52 45 51 5f 54 59 50 45 53 2e 4d   === REQ_TYPES.M
2690: 44 41 54 41 29 20 7b 0a 20 20 20 20 63 6f 6e 74  DATA) {.    cont
26a0: 50 61 72 61 20 3d 20 63 6f 6e 74 50 61 72 61 2e  Para = contPara.
26b0: 72 65 70 6c 61 63 65 28 27 63 6f 6e 74 61 69 6e  replace('contain
26c0: 65 72 73 27 2c 20 27 4d 75 74 61 62 6c 65 20 44  ers', 'Mutable D
26d0: 61 74 61 27 29 3b 0a 20 20 7d 0a 20 20 76 61 72  ata');.  }.  var
26e0: 20 73 6b 69 70 42 74 6e 20 3d 20 79 6f 60 3c 62   skipBtn = yo`<b
26f0: 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74  utton type="butt
2700: 6f 6e 22 20 6f 6e 63 6c 69 63 6b 3d 24 7b 6f 6e  on" onclick=${on
2710: 43 6c 69 63 6b 53 6b 69 70 42 74 6e 7d 3e 53 6b  ClickSkipBtn}>Sk
2720: 69 70 3c 2f 62 75 74 74 6f 6e 3e 60 0a 0a 20 20  ip</button>`..  
2730: 76 61 72 20 6c 69 73 74 43 6f 6e 74 20 3d 20 6e  var listCont = n
2740: 75 6c 6c 3b 0a 20 20 76 61 72 20 69 73 41 75 74  ull;.  var isAut
2750: 68 6f 72 69 73 65 64 20 3d 20 28 73 61 66 65 41  horised = (safeA
2760: 75 74 68 44 61 74 61 2e 68 61 73 4f 77 6e 50 72  uthData.hasOwnPr
2770: 6f 70 65 72 74 79 28 27 69 73 41 75 74 68 6f 72  operty('isAuthor
2780: 69 7a 65 64 27 29 20 26 26 20 73 61 66 65 41 75  ized') && safeAu
2790: 74 68 44 61 74 61 2e 69 73 41 75 74 68 6f 72 69  thData.isAuthori
27a0: 7a 65 64 29 3b 0a 20 20 76 61 72 20 6e 6f 43 6f  zed);.  var noCo
27b0: 6e 74 61 69 6e 65 72 44 65 73 63 20 3d 20 27 41  ntainerDesc = 'A
27c0: 70 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 72 65  pplication is re
27d0: 71 75 65 73 74 69 6e 67 20 66 6f 72 20 72 65 61  questing for rea
27e0: 64 69 6e 67 20 70 75 62 6c 69 63 20 75 6e 65 6e  ding public unen
27f0: 63 72 79 70 74 65 64 20 64 61 74 61 20 6f 6e 20  crypted data on 
2800: 79 6f 75 72 20 62 65 68 61 6c 66 2e 27 3b 0a 20  your behalf.';. 
2810: 20 76 61 72 20 69 73 41 75 74 68 6f 72 69 73 65   var isAuthorise
2820: 64 44 65 73 63 20 3d 20 27 54 68 69 73 20 61 70  dDesc = 'This ap
2830: 70 20 69 73 20 6f 6e 65 20 74 68 61 74 20 79 6f  p is one that yo
2840: 75 20 68 61 76 65 20 70 72 65 76 69 6f 75 73 6c  u have previousl
2850: 79 20 61 75 74 68 6f 72 69 73 65 64 2e 20 50 6c  y authorised. Pl
2860: 65 61 73 65 20 6e 6f 74 65 20 69 74 20 69 73 20  ease note it is 
2870: 6e 6f 74 20 72 65 71 75 65 73 74 69 6e 67 20 61  not requesting a
2880: 6e 79 20 6e 65 77 20 70 65 72 6d 69 73 73 69 6f  ny new permissio
2890: 6e 73 2c 20 69 74 20 72 65 71 75 69 72 65 73 20  ns, it requires 
28a0: 72 65 2d 61 75 74 68 6f 72 69 73 61 74 69 6f 6e  re-authorisation
28b0: 20 61 73 20 69 74 20 69 73 20 73 74 61 72 74 69   as it is starti
28c0: 6e 67 20 61 20 6e 65 77 20 53 41 46 45 20 4e 65  ng a new SAFE Ne
28d0: 74 77 6f 72 6b 20 73 65 73 73 69 6f 6e 2e 27 3b  twork session.';
28e0: 0a 20 20 76 61 72 20 6f 77 6e 43 6f 6e 74 61 69  .  var ownContai
28f0: 6e 65 72 49 6e 66 6f 20 3d 20 7b 0a 20 20 20 20  nerInfo = {.    
2900: 6e 61 6d 65 3a 20 27 41 70 70 5c 27 73 20 6f 77  name: 'App\'s ow
2910: 6e 20 63 6f 6e 74 61 69 6e 65 72 27 2c 0a 20 20  n container',.  
2920: 20 20 64 65 73 63 3a 20 27 43 6f 6e 74 61 69 6e    desc: 'Contain
2930: 65 72 20 75 73 65 64 20 62 79 20 74 68 65 20 61  er used by the a
2940: 70 70 6c 69 63 61 74 69 6f 6e 20 74 6f 20 73 74  pplication to st
2950: 6f 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ore application 
2960: 73 70 65 63 69 66 69 63 20 69 6e 66 6f 72 6d 61  specific informa
2970: 74 69 6f 6e 20 73 75 63 68 20 61 73 20 63 6f 6e  tion such as con
2980: 66 69 67 20 66 69 6c 65 73 20 65 74 63 27 2c 0a  fig files etc',.
2990: 20 20 20 20 61 63 63 65 73 73 3a 20 7b 27 52 65      access: {'Re
29a0: 61 64 27 3a 20 74 72 75 65 2c 20 27 49 6e 73 65  ad': true, 'Inse
29b0: 72 74 27 3a 20 74 72 75 65 2c 20 27 55 70 64 61  rt': true, 'Upda
29c0: 74 65 27 3a 20 74 72 75 65 2c 20 27 44 65 6c 65  te': true, 'Dele
29d0: 74 65 27 3a 20 74 72 75 65 2c 20 27 4d 61 6e 61  te': true, 'Mana
29e0: 67 65 50 65 72 6d 69 73 73 69 6f 6e 73 27 3a 20  gePermissions': 
29f0: 74 72 75 65 7d 0a 20 20 7d 0a 20 20 76 61 72 20  true}.  }.  var 
2a00: 6f 77 6e 43 6f 6e 74 61 69 6e 65 72 20 3d 20 28  ownContainer = (
2a10: 73 61 66 65 41 75 74 68 44 61 74 61 5b 72 65 71  safeAuthData[req
2a20: 4b 65 79 5d 2e 61 70 70 5f 63 6f 6e 74 61 69 6e  Key].app_contain
2a30: 65 72 20 26 26 20 21 69 73 41 75 74 68 6f 72 69  er && !isAuthori
2a40: 73 65 64 29 20 3f 20 79 6f 60 3c 64 69 76 20 63  sed) ? yo`<div c
2a50: 6c 61 73 73 3d 22 6c 69 73 74 2d 69 22 20 6f 6e  lass="list-i" on
2a60: 63 6c 69 63 6b 3d 24 7b 74 6f 67 67 6c 65 50 65  click=${togglePe
2a70: 72 6d 69 73 73 69 6f 6e 73 7d 3e 0a 20 20 20 20  rmissions}>.    
2a80: 20 20 3c 68 33 20 63 6c 61 73 73 3d 22 64 65 66    <h3 class="def
2a90: 61 75 6c 74 22 20 74 69 74 6c 65 3d 24 7b 6f 77  ault" title=${ow
2aa0: 6e 43 6f 6e 74 61 69 6e 65 72 49 6e 66 6f 2e 6e  nContainerInfo.n
2ab0: 61 6d 65 7d 3e 3c 73 70 61 6e 20 63 6c 61 73 73  ame}><span class
2ac0: 3d 22 69 63 6f 6e 22 3e 3c 2f 73 70 61 6e 3e 24  ="icon"></span>$
2ad0: 7b 6f 77 6e 43 6f 6e 74 61 69 6e 65 72 49 6e 66  {ownContainerInf
2ae0: 6f 2e 6e 61 6d 65 7d 3c 2f 68 33 3e 0a 20 20 20  o.name}</h3>.   
2af0: 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 6c     <div class="l
2b00: 69 73 74 2d 69 2d 62 22 3e 0a 20 20 20 20 20 20  ist-i-b">.      
2b10: 20 20 3c 70 3e 24 7b 6f 77 6e 43 6f 6e 74 61 69    <p>${ownContai
2b20: 6e 65 72 49 6e 66 6f 2e 64 65 73 63 7d 3c 2f 70  nerInfo.desc}</p
2b30: 3e 0a 20 20 20 20 20 20 20 20 3c 75 6c 3e 24 7b  >.        <ul>${
2b40: 61 72 72 54 6f 59 6f 28 6f 77 6e 43 6f 6e 74 61  arrToYo(ownConta
2b50: 69 6e 65 72 49 6e 66 6f 2e 61 63 63 65 73 73 29  inerInfo.access)
2b60: 7d 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 3c 2f 64  }</ul>.      </d
2b70: 69 76 3e 0a 20 20 20 20 3c 2f 64 69 76 3e 60 3a  iv>.    </div>`:
2b80: 20 6e 75 6c 6c 3b 0a 0a 20 20 69 66 20 28 72 65   null;..  if (re
2b90: 71 54 79 70 65 20 21 3d 3d 20 52 45 51 5f 54 59  qType !== REQ_TY
2ba0: 50 45 53 2e 4d 44 41 54 41 29 20 7b 0a 20 20 20  PES.MDATA) {.   
2bb0: 20 69 66 20 28 69 73 41 75 74 68 6f 72 69 73 65   if (isAuthorise
2bc0: 64 29 20 7b 0a 20 20 20 20 20 20 6c 69 73 74 43  d) {.      listC
2bd0: 6f 6e 74 20 3d 20 79 6f 60 3c 64 69 76 20 63 6c  ont = yo`<div cl
2be0: 61 73 73 3d 22 6c 69 73 74 2d 69 20 64 65 66 61  ass="list-i defa
2bf0: 75 6c 74 22 3e 24 7b 69 73 41 75 74 68 6f 72 69  ult">${isAuthori
2c00: 73 65 64 44 65 73 63 7d 3c 2f 64 69 76 3e 60 0a  sedDesc}</div>`.
2c10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21      } else if (!
2c20: 73 61 66 65 41 75 74 68 44 61 74 61 5b 72 65 71  safeAuthData[req
2c30: 4b 65 79 5d 2e 61 70 70 5f 63 6f 6e 74 61 69 6e  Key].app_contain
2c40: 65 72 20 26 26 20 28 73 61 66 65 41 75 74 68 44  er && (safeAuthD
2c50: 61 74 61 5b 72 65 71 4b 65 79 5d 2e 63 6f 6e 74  ata[reqKey].cont
2c60: 61 69 6e 65 72 73 2e 6c 65 6e 67 74 68 20 3d 3d  ainers.length ==
2c70: 3d 20 30 29 29 20 7b 0a 20 20 20 20 20 20 6c 69  = 0)) {.      li
2c80: 73 74 43 6f 6e 74 20 3d 20 79 6f 60 3c 64 69 76  stCont = yo`<div
2c90: 20 63 6c 61 73 73 3d 22 6c 69 73 74 2d 69 20 64   class="list-i d
2ca0: 65 66 61 75 6c 74 22 3e 24 7b 6e 6f 43 6f 6e 74  efault">${noCont
2cb0: 61 69 6e 65 72 44 65 73 63 7d 3c 2f 64 69 76 3e  ainerDesc}</div>
2cc0: 60 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  `.    } else {. 
2cd0: 20 20 20 20 20 6c 69 73 74 43 6f 6e 74 20 3d 20       listCont = 
2ce0: 79 6f 60 24 7b 0a 20 20 20 20 20 20 20 20 73 61  yo`${.        sa
2cf0: 66 65 41 75 74 68 44 61 74 61 5b 72 65 71 4b 65  feAuthData[reqKe
2d00: 79 5d 2e 63 6f 6e 74 61 69 6e 65 72 73 2e 6d 61  y].containers.ma
2d10: 70 28 66 75 6e 63 74 69 6f 6e 28 63 6f 6e 74 61  p(function(conta
2d20: 69 6e 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  iner) {.        
2d30: 20 20 69 66 20 28 74 79 70 65 6f 66 20 63 6f 6e    if (typeof con
2d40: 74 61 69 6e 65 72 2e 61 63 63 65 73 73 20 3d 3d  tainer.access ==
2d50: 3d 20 27 6f 62 6a 65 63 74 27 29 20 7b 0a 20 20  = 'object') {.  
2d60: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2d70: 63 6f 6e 74 4f 62 6a 20 3d 20 67 65 74 43 6f 6e  contObj = getCon
2d80: 74 28 63 6f 6e 74 61 69 6e 65 72 2e 63 6f 6e 74  t(container.cont
2d90: 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  _name);.        
2da0: 20 20 20 20 72 65 74 75 72 6e 20 79 6f 60 3c 64      return yo`<d
2db0: 69 76 20 63 6c 61 73 73 3d 22 6c 69 73 74 2d 69  iv class="list-i
2dc0: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ">.             
2dd0: 20 3c 68 33 20 63 6c 61 73 73 3d 24 7b 63 6f 6e   <h3 class=${con
2de0: 74 4f 62 6a 2e 73 74 79 6c 65 7d 20 74 69 74 6c  tObj.style} titl
2df0: 65 3d 24 7b 63 6f 6e 74 4f 62 6a 2e 6e 61 6d 65  e=${contObj.name
2e00: 7d 20 6f 6e 63 6c 69 63 6b 3d 24 7b 74 6f 67 67  } onclick=${togg
2e10: 6c 65 50 65 72 6d 69 73 73 69 6f 6e 73 7d 3e 3c  lePermissions}><
2e20: 73 70 61 6e 20 63 6c 61 73 73 3d 22 69 63 6f 6e  span class="icon
2e30: 22 3e 3c 2f 73 70 61 6e 3e 24 7b 63 6f 6e 74 4f  "></span>${contO
2e40: 62 6a 2e 6e 61 6d 65 7d 3c 2f 68 33 3e 0a 20 20  bj.name}</h3>.  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 3c 64 69 76              <div
2e60: 20 63 6c 61 73 73 3d 22 6c 69 73 74 2d 69 2d 62   class="list-i-b
2e70: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ">.             
2e80: 20 20 20 3c 70 3e 24 7b 63 6f 6e 74 4f 62 6a 2e     <p>${contObj.
2e90: 64 65 73 63 7d 3c 2f 70 3e 0a 20 20 20 20 20 20  desc}</p>.      
2ea0: 20 20 20 20 20 20 20 20 20 20 3c 75 6c 3e 24 7b            <ul>${
2eb0: 61 72 72 54 6f 59 6f 28 63 6f 6e 74 61 69 6e 65  arrToYo(containe
2ec0: 72 2e 61 63 63 65 73 73 29 7d 3c 2f 75 6c 3e 0a  r.access)}</ul>.
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f                </
2ee0: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20  div>.           
2ef0: 20 3c 2f 64 69 76 3e 60 3b 0a 20 20 20 20 20 20   </div>`;.      
2f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f10: 72 65 74 75 72 6e 20 79 6f 60 3c 64 69 76 20 63  return yo`<div c
2f20: 6c 61 73 73 3d 22 6c 69 73 74 2d 69 22 3e 3c 68  lass="list-i"><h
2f30: 33 3e 24 7b 63 6f 6e 74 61 69 6e 65 72 2e 63 6f  3>${container.co
2f40: 6e 74 5f 6e 61 6d 65 7d 3c 2f 68 33 3e 3c 2f 64  nt_name}</h3></d
2f50: 69 76 3e 60 3b 0a 20 20 20 20 20 20 20 20 7d 29  iv>`;.        })
2f60: 0a 20 20 20 20 20 20 20 20 7d 60 3b 0a 20 20 20  .        }`;.   
2f70: 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
2f80: 20 20 76 61 72 20 67 65 74 50 65 72 6d 73 20 3d    var getPerms =
2f90: 20 28 64 61 74 61 29 20 3d 3e 20 7b 0a 20 20 20   (data) => {.   
2fa0: 20 20 20 76 61 72 20 70 65 72 6d 73 20 3d 20 5b     var perms = [
2fb0: 5d 3b 0a 20 20 20 20 20 20 4f 62 6a 65 63 74 2e  ];.      Object.
2fc0: 6b 65 79 73 28 64 61 74 61 29 2e 6d 61 70 28 66  keys(data).map(f
2fd0: 75 6e 63 74 69 6f 6e 20 28 6b 65 79 29 20 7b 0a  unction (key) {.
2fe0: 20 20 20 20 20 20 20 20 69 66 20 28 64 61 74 61          if (data
2ff0: 5b 6b 65 79 5d 29 20 7b 0a 20 20 20 20 20 20 20  [key]) {.       
3000: 20 20 20 70 65 72 6d 73 2e 70 75 73 68 28 6b 65     perms.push(ke
3010: 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
3020: 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 72 65      });.      re
3030: 74 75 72 6e 20 70 65 72 6d 73 3b 0a 20 20 20 20  turn perms;.    
3040: 7d 0a 20 20 20 20 76 61 72 20 6d 65 74 61 41 72  }.    var metaAr
3050: 72 20 3d 20 73 61 66 65 41 75 74 68 44 61 74 61  r = safeAuthData
3060: 5b 27 6d 65 74 61 44 61 74 61 27 5d 20 7c 7c 20  ['metaData'] || 
3070: 5b 5d 3b 0a 20 20 20 20 76 61 72 20 61 70 70 41  [];.    var appA
3080: 63 63 65 73 73 41 72 72 20 3d 20 73 61 66 65 41  ccessArr = safeA
3090: 75 74 68 44 61 74 61 5b 27 61 70 70 41 63 63 65  uthData['appAcce
30a0: 73 73 27 5d 20 7c 7c 20 5b 5d 3b 0a 20 20 20 20  ss'] || [];.    
30b0: 76 61 72 20 74 6f 67 67 6c 65 41 70 70 42 74 6e  var toggleAppBtn
30c0: 20 3d 20 79 6f 60 3c 62 75 74 74 6f 6e 20 6f 6e   = yo`<button on
30d0: 63 6c 69 63 6b 3d 24 7b 74 6f 67 67 6c 65 41 70  click=${toggleAp
30e0: 70 7d 3e 3c 2f 62 75 74 74 6f 6e 3e 60 0a 20 20  p}></button>`.  
30f0: 20 20 6c 69 73 74 43 6f 6e 74 20 3d 20 79 6f 60    listCont = yo`
3100: 24 7b 0a 20 20 20 20 20 20 73 61 66 65 41 75 74  ${.      safeAut
3110: 68 44 61 74 61 5b 72 65 71 4b 65 79 5d 2e 6d 64  hData[reqKey].md
3120: 61 74 61 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e  ata.map(function
3130: 20 28 6d 64 61 74 61 2c 20 69 29 20 7b 0a 20 20   (mdata, i) {.  
3140: 20 20 20 20 20 20 76 61 72 20 70 65 72 6d 73 20        var perms 
3150: 3d 20 67 65 74 50 65 72 6d 73 28 6d 64 61 74 61  = getPerms(mdata
3160: 2e 70 65 72 6d 73 29 3b 0a 20 20 20 20 20 20 20  .perms);.       
3170: 20 76 61 72 20 61 70 70 41 63 63 65 73 73 20 3d   var appAccess =
3180: 20 61 70 70 41 63 63 65 73 73 41 72 72 5b 69 5d   appAccessArr[i]
3190: 0a 20 20 20 20 20 20 20 20 76 61 72 20 6d 65 74  .        var met
31a0: 61 20 3d 20 6d 65 74 61 41 72 72 5b 69 5d 0a 20  a = metaArr[i]. 
31b0: 20 20 20 20 20 20 20 76 61 72 20 6e 61 6d 65 20         var name 
31c0: 3d 20 6d 65 74 61 2e 6e 61 6d 65 20 7c 7c 20 6d  = meta.name || m
31d0: 64 61 74 61 2e 6e 61 6d 65 0a 20 20 20 20 20 20  data.name.      
31e0: 20 20 72 65 74 75 72 6e 20 79 6f 60 3c 64 69 76    return yo`<div
31f0: 20 63 6c 61 73 73 3d 22 6c 69 73 74 2d 69 22 3e   class="list-i">
3200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 68 33  .            <h3
3210: 20 63 6c 61 73 73 3d 22 64 65 66 61 75 6c 74 22   class="default"
3220: 20 74 69 74 6c 65 3d 24 7b 6e 61 6d 65 7d 20 6f   title=${name} o
3230: 6e 63 6c 69 63 6b 3d 24 7b 74 6f 67 67 6c 65 50  nclick=${toggleP
3240: 65 72 6d 69 73 73 69 6f 6e 73 7d 3e 3c 73 70 61  ermissions}><spa
3250: 6e 20 63 6c 61 73 73 3d 22 69 63 6f 6e 22 3e 3c  n class="icon"><
3260: 2f 73 70 61 6e 3e 24 7b 6e 61 6d 65 7d 3c 2f 68  /span>${name}</h
3270: 33 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  3>.            <
3280: 64 69 76 20 63 6c 61 73 73 3d 22 6c 69 73 74 2d  div class="list-
3290: 69 2d 62 22 3e 0a 20 20 20 20 20 20 20 20 20 20  i-b">.          
32a0: 20 20 20 20 3c 70 3e 24 7b 6d 65 74 61 2e 64 65      <p>${meta.de
32b0: 73 63 72 69 70 74 69 6f 6e 7d 3c 2f 70 3e 0a 20  scription}</p>. 
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 75 6c               <ul
32d0: 20 63 6c 61 73 73 3d 22 70 65 72 6d 73 22 3e 24   class="perms">$
32e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32f0: 20 20 70 65 72 6d 73 2e 6d 61 70 28 66 75 6e 63    perms.map(func
3300: 74 69 6f 6e 20 28 70 29 20 7b 0a 20 20 20 20 20  tion (p) {.     
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
3320: 75 72 6e 20 79 6f 60 3c 6c 69 3e 3c 73 70 61 6e  urn yo`<li><span
3330: 3e 24 7b 63 61 70 69 74 61 6c 69 7a 65 4e 61 6d  >${capitalizeNam
3340: 65 28 70 29 7d 3c 2f 73 70 61 6e 3e 3c 2f 6c 69  e(p)}</span></li
3350: 3e 60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >`;.            
3360: 20 20 20 20 7d 29 0a 20 20 20 20 20 20 20 20 20      }).         
3370: 20 20 20 20 20 7d 3c 2f 75 6c 3e 0a 20 20 20 20       }</ul>.    
3380: 20 20 20 20 20 20 20 20 20 20 3c 75 6c 20 63 6c            <ul cl
3390: 61 73 73 3d 22 61 70 70 73 22 3e 24 7b 0a 20 20  ass="apps">${.  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
33b0: 70 41 63 63 65 73 73 2e 6d 61 70 28 66 75 6e 63  pAccess.map(func
33c0: 74 69 6f 6e 28 61 63 63 29 20 7b 0a 20 20 20 20  tion(acc) {.    
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
33e0: 74 75 72 6e 20 79 6f 60 3c 6c 69 3e 3c 73 70 61  turn yo`<li><spa
33f0: 6e 3e 24 7b 70 61 72 73 65 4e 61 6d 65 28 61 63  n>${parseName(ac
3400: 63 2e 61 70 70 5f 6e 61 6d 65 29 7d 3c 2f 73 70  c.app_name)}</sp
3410: 61 6e 3e 3c 2f 6c 69 3e 60 3b 0a 20 20 20 20 20  an></li>`;.     
3420: 20 20 20 20 20 20 20 20 20 20 20 7d 29 0a 20 20             }).  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 7d 3c 2f 75              }</u
3440: 6c 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l>.             
3450: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 61 70 70   <div class="app
3460: 2d 74 6f 67 67 6c 65 22 3e 24 7b 74 6f 67 67 6c  -toggle">${toggl
3470: 65 41 70 70 42 74 6e 7d 3c 2f 64 69 76 3e 0a 20  eAppBtn}</div>. 
3480: 20 20 20 20 20 20 20 20 20 20 20 3c 2f 64 69 76             </div
3490: 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 2f 64 69  >.          </di
34a0: 76 3e 60 3b 0a 20 20 20 20 20 20 7d 29 0a 20 20  v>`;.      }).  
34b0: 20 20 20 20 7d 60 3b 0a 20 20 7d 0a 20 20 76 61      }`;.  }.  va
34c0: 72 20 6d 64 61 74 61 57 61 72 6e 20 3d 20 28 72  r mdataWarn = (r
34d0: 65 71 54 79 70 65 20 3d 3d 3d 20 52 45 51 5f 54  eqType === REQ_T
34e0: 59 50 45 53 2e 4d 44 41 54 41 29 20 3f 20 79 6f  YPES.MDATA) ? yo
34f0: 60 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d 64 61  `<div class="mda
3500: 74 61 2d 77 61 72 6e 22 3e 4e 6f 74 65 3a 20 41  ta-warn">Note: A
3510: 75 74 68 65 6e 74 69 63 61 74 6f 72 20 64 6f 65  uthenticator doe
3520: 73 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 20  s not guarantee 
3530: 74 68 61 74 20 74 68 65 20 4d 75 74 61 62 6c 65  that the Mutable
3540: 20 44 61 74 61 20 72 65 71 75 65 73 74 65 64 20   Data requested 
3550: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 6d  is the same as m
3560: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3570: 64 65 73 63 72 69 70 74 69 6f 6e 2e 20 47 72 61  description. Gra
3580: 6e 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  nt the permissio
3590: 6e 20 6f 6e 6c 79 20 69 66 20 79 6f 75 20 74 72  n only if you tr
35a0: 75 73 74 20 74 68 65 20 61 70 70 6c 69 63 61 74  ust the applicat
35b0: 69 6f 6e 3c 2f 64 69 76 3e 60 20 3a 20 6e 75 6c  ion</div>` : nul
35c0: 6c 3b 0a 0a 20 20 76 61 72 20 70 6f 70 75 70 42  l;..  var popupB
35d0: 61 73 65 20 3d 20 79 6f 60 3c 64 69 76 20 63 6c  ase = yo`<div cl
35e0: 61 73 73 3d 22 70 6f 70 75 70 22 3e 0a 20 20 20  ass="popup">.   
35f0: 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 70     <div class="p
3600: 6f 70 75 70 2d 62 61 73 65 22 3e 0a 20 20 20 20  opup-base">.    
3610: 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22      <div class="
3620: 70 6f 70 75 70 2d 69 22 3e 0a 20 20 20 20 20 20  popup-i">.      
3630: 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22      <div class="
3640: 70 6f 70 75 70 2d 63 6e 74 22 3e 0a 20 20 20 20  popup-cnt">.    
3650: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
3660: 73 73 3d 22 70 6f 70 75 70 2d 73 6b 69 70 22 3e  ss="popup-skip">
3670: 24 7b 73 6b 69 70 42 74 6e 7d 3c 2f 64 69 76 3e  ${skipBtn}</div>
3680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 64 69  .            <di
3690: 76 20 63 6c 61 73 73 3d 22 70 6f 70 75 70 2d 63  v class="popup-c
36a0: 6e 74 2d 6d 61 69 6e 22 3e 0a 20 20 20 20 20 20  nt-main">.      
36b0: 20 20 20 20 20 20 20 20 3c 68 33 3e 24 7b 73 61          <h3>${sa
36c0: 66 65 41 75 74 68 44 61 74 61 5b 72 65 71 4b 65  feAuthData[reqKe
36d0: 79 5d 2e 61 70 70 2e 6e 61 6d 65 2e 73 6c 69 63  y].app.name.slic
36e0: 65 28 30 2c 20 32 29 7d 3c 2f 68 33 3e 0a 20 20  e(0, 2)}</h3>.  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 68 34 3e              <h4>
3700: 3c 62 3e 24 7b 73 61 66 65 41 75 74 68 44 61 74  <b>${safeAuthDat
3710: 61 5b 72 65 71 4b 65 79 5d 2e 61 70 70 2e 6e 61  a[reqKey].app.na
3720: 6d 65 7d 3c 2f 62 3e 20 62 79 20 3c 62 3e 24 7b  me}</b> by <b>${
3730: 73 61 66 65 41 75 74 68 44 61 74 61 5b 72 65 71  safeAuthData[req
3740: 4b 65 79 5d 2e 61 70 70 2e 76 65 6e 64 6f 72 7d  Key].app.vendor}
3750: 3c 2f 62 3e 3c 2f 68 34 3e 0a 20 20 20 20 20 20  </b></h4>.      
3760: 20 20 20 20 20 20 20 20 3c 68 34 3e 24 7b 63 6f          <h4>${co
3770: 6e 74 50 61 72 61 7d 3c 2f 68 34 3e 0a 20 20 20  ntPara}</h4>.   
3780: 20 20 20 20 20 20 20 20 20 20 20 3c 68 35 3e 24             <h5>$
3790: 7b 73 61 66 65 41 75 74 68 44 61 74 61 5b 72 65  {safeAuthData[re
37a0: 71 4b 65 79 5d 2e 61 70 70 2e 69 64 7d 3c 2f 68  qKey].app.id}</h
37b0: 35 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  5>.            <
37c0: 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20  /div>.          
37d0: 20 20 24 7b 6d 64 61 74 61 57 61 72 6e 7d 0a 20    ${mdataWarn}. 
37e0: 20 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20             <div 
37f0: 63 6c 61 73 73 3d 22 70 6f 70 75 70 2d 63 6e 74  class="popup-cnt
3800: 2d 6c 73 22 3e 0a 20 20 20 20 20 20 20 20 20 20  -ls">.          
3810: 20 20 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d      <span class=
3820: 22 6c 69 73 74 22 3e 0a 20 20 20 20 20 20 20 20  "list">.        
3830: 20 20 20 20 20 20 20 20 24 7b 6f 77 6e 43 6f 6e          ${ownCon
3840: 74 61 69 6e 65 72 7d 0a 20 20 20 20 20 20 20 20  tainer}.        
3850: 20 20 20 20 20 20 20 20 24 7b 6c 69 73 74 43 6f          ${listCo
3860: 6e 74 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt}.            
3870: 20 20 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20    </span>.      
3880: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20        </div>.   
3890: 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20         </div>.  
38a0: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
38b0: 73 73 3d 22 70 6f 70 75 70 2d 66 6f 6f 74 22 3e  ss="popup-foot">
38c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 7b 64  .            ${d
38d0: 65 6e 79 42 74 6e 7d 0a 20 20 20 20 20 20 20 20  enyBtn}.        
38e0: 20 20 20 20 24 7b 61 6c 6c 6f 77 42 74 6e 7d 0a      ${allowBtn}.
38f0: 20 20 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e            </div>
3900: 0a 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a  .        </div>.
3910: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 3c        </div>.  <
3920: 2f 64 69 76 3e 60 0a 0a 20 20 79 6f 2e 75 70 64  /div>`..  yo.upd
3930: 61 74 65 28 73 61 66 65 41 75 74 68 50 6f 70 75  ate(safeAuthPopu
3940: 70 44 69 76 2c 20 70 6f 70 75 70 42 61 73 65 29  pDiv, popupBase)
3950: 0a 20 20 73 65 74 41 75 74 68 50 6f 70 75 70 41  .  setAuthPopupA
3960: 73 53 63 72 6f 6c 6c 61 62 6c 65 28 29 0a 7d 0a  sScrollable().}.
3970: 0a 2f 2f 20 69 6e 74 65 72 6e 61 6c 20 68 65 6c  .// internal hel
3980: 70 65 72 73 0a 2f 2f 20 3d 0a 0a 66 75 6e 63 74  pers.// =..funct
3990: 69 6f 6e 20 72 65 6e 64 65 72 20 28 69 64 2c 20  ion render (id, 
39a0: 70 61 67 65 29 20 7b 0a 20 20 76 61 72 20 69 73  page) {.  var is
39b0: 4c 6f 61 64 69 6e 67 20 3d 20 70 61 67 65 20 26  Loading = page &
39c0: 26 20 70 61 67 65 2e 69 73 4c 6f 61 64 69 6e 67  & page.isLoading
39d0: 28 29 0a 0a 20 20 76 61 72 20 77 65 62 43 6f 6e  ()..  var webCon
39e0: 74 65 6e 74 73 20 3d 20 72 65 6d 6f 74 65 2e 67  tents = remote.g
39f0: 65 74 43 75 72 72 65 6e 74 57 69 6e 64 6f 77 28  etCurrentWindow(
3a00: 29 2e 77 65 62 43 6f 6e 74 65 6e 74 73 3b 0a 0a  ).webContents;..
3a10: 20 20 2f 2f 20 76 61 72 20 69 73 53 61 66 65 20    // var isSafe 
3a20: 3d 20 77 65 62 43 6f 6e 74 65 6e 74 73 2e 69 73  = webContents.is
3a30: 53 61 66 65 3b 0a 0a 20 20 2f 2f 20 69 66 28 20  Safe;..  // if( 
3a40: 74 79 70 65 6f 66 20 69 73 53 61 66 65 20 3d 3d  typeof isSafe ==
3a50: 3d 20 27 75 6e 64 65 66 69 6e 65 64 27 20 29 0a  = 'undefined' ).
3a60: 20 20 2f 2f 20 7b 0a 20 20 2f 2f 20 20 20 20 20    // {.  //     
3a70: 69 73 53 61 66 65 20 3d 20 74 72 75 65 3b 0a 20  isSafe = true;. 
3a80: 20 2f 2f 20 7d 0a 0a 20 20 2f 2f 20 62 61 63 6b   // }..  // back
3a90: 2f 66 6f 72 77 61 72 64 20 73 68 6f 75 6c 64 20  /forward should 
3aa0: 62 65 20 64 69 73 61 62 6c 65 64 20 69 66 20 69  be disabled if i
3ab0: 74 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  ts not possible 
3ac0: 67 6f 20 62 61 63 6b 2f 66 6f 72 77 61 72 64 0a  go back/forward.
3ad0: 20 20 76 61 72 20 62 61 63 6b 44 69 73 61 62 6c    var backDisabl
3ae0: 65 64 20 3d 20 28 70 61 67 65 20 26 26 20 70 61  ed = (page && pa
3af0: 67 65 2e 63 61 6e 47 6f 42 61 63 6b 28 29 29 20  ge.canGoBack()) 
3b00: 3f 20 27 27 20 3a 20 27 64 69 73 61 62 6c 65 64  ? '' : 'disabled
3b10: 27 0a 20 20 76 61 72 20 66 6f 72 77 61 72 64 44  '.  var forwardD
3b20: 69 73 61 62 6c 65 64 20 3d 20 28 70 61 67 65 20  isabled = (page 
3b30: 26 26 20 70 61 67 65 2e 63 61 6e 47 6f 46 6f 72  && page.canGoFor
3b40: 77 61 72 64 28 29 29 20 3f 20 27 27 20 3a 20 27  ward()) ? '' : '
3b50: 64 69 73 61 62 6c 65 64 27 0a 0a 20 20 2f 2f 20  disabled'..  // 
3b60: 72 65 6e 64 65 72 20 72 65 6c 6f 61 64 2f 63 61  render reload/ca
3b70: 6e 63 65 6c 20 62 74 6e 0a 20 20 76 61 72 20 72  ncel btn.  var r
3b80: 65 6c 6f 61 64 42 74 6e 20 3d 20 28 69 73 4c 6f  eloadBtn = (isLo
3b90: 61 64 69 6e 67 29 0a 20 20 20 20 3f 20 79 6f 60  ading).    ? yo`
3ba0: 3c 62 75 74 74 6f 6e 20 63 6c 61 73 73 3d 22 74  <button class="t
3bb0: 6f 6f 6c 62 61 72 2d 62 74 6e 20 6e 61 76 2d 63  oolbar-btn nav-c
3bc0: 61 6e 63 65 6c 2d 62 74 6e 22 20 6f 6e 63 6c 69  ancel-btn" oncli
3bd0: 63 6b 3d 24 7b 6f 6e 43 6c 69 63 6b 43 61 6e 63  ck=${onClickCanc
3be0: 65 6c 7d 3e 0a 20 20 20 20 20 20 20 20 3c 73 70  el}>.        <sp
3bf0: 61 6e 20 63 6c 61 73 73 3d 22 69 63 6f 6e 20 69  an class="icon i
3c00: 63 6f 6e 2d 63 61 6e 63 65 6c 22 3e 3c 2f 73 70  con-cancel"></sp
3c10: 61 6e 3e 0a 20 20 20 20 20 20 3c 2f 62 75 74 74  an>.      </butt
3c20: 6f 6e 3e 60 0a 20 20 20 20 3a 20 79 6f 60 3c 62  on>`.    : yo`<b
3c30: 75 74 74 6f 6e 20 63 6c 61 73 73 3d 22 74 6f 6f  utton class="too
3c40: 6c 62 61 72 2d 62 74 6e 20 6e 61 76 2d 72 65 6c  lbar-btn nav-rel
3c50: 6f 61 64 2d 62 74 6e 22 20 6f 6e 63 6c 69 63 6b  oad-btn" onclick
3c60: 3d 24 7b 6f 6e 43 6c 69 63 6b 52 65 6c 6f 61 64  =${onClickReload
3c70: 7d 3e 0a 20 20 20 20 20 20 20 20 3c 73 70 61 6e  }>.        <span
3c80: 20 63 6c 61 73 73 3d 22 69 63 6f 6e 20 69 63 6f   class="icon ico
3c90: 6e 2d 63 63 77 22 3e 3c 2f 73 70 61 6e 3e 0a 20  n-ccw"></span>. 
3ca0: 20 20 20 20 20 3c 2f 62 75 74 74 6f 6e 3e 60 0a       </button>`.
3cb0: 0a 20 20 76 61 72 20 73 61 66 65 4e 65 74 77 6f  .  var safeNetwo
3cc0: 72 6b 53 74 61 74 75 73 42 74 6e 20 3d 20 28 69  rkStatusBtn = (i
3cd0: 73 53 61 66 65 41 70 70 41 75 74 68 65 6e 74 69  sSafeAppAuthenti
3ce0: 63 61 74 69 6e 67 29 0a 20 20 20 20 3f 20 79 6f  cating).    ? yo
3cf0: 60 3c 62 75 74 74 6f 6e 20 63 6c 61 73 73 3d 22  `<button class="
3d00: 74 6f 6f 6c 62 61 72 2d 62 74 6e 20 63 6f 6e 6e  toolbar-btn conn
3d10: 65 63 74 69 6e 67 22 20 6f 6e 63 6c 69 63 6b 3d  ecting" onclick=
3d20: 24 7b 6f 6e 43 6c 69 63 6b 4f 70 65 6e 53 61 66  ${onClickOpenSaf
3d30: 65 41 75 74 68 48 6f 6d 65 7d 3e 0a 20 20 20 20  eAuthHome}>.    
3d40: 20 20 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d      <span class=
3d50: 22 69 63 6f 6e 22 3e 3c 2f 73 70 61 6e 3e 0a 20  "icon"></span>. 
3d60: 20 20 20 20 20 3c 2f 62 75 74 74 6f 6e 3e 60 0a       </button>`.
3d70: 20 20 20 20 3a 20 79 6f 60 3c 62 75 74 74 6f 6e      : yo`<button
3d80: 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72 2d   class="toolbar-
3d90: 62 74 6e 20 24 7b 28 66 75 6e 63 74 69 6f 6e 28  btn ${(function(
3da0: 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 73 61  ) {.      if (sa
3db0: 66 65 41 75 74 68 4e 65 74 77 6f 72 6b 53 74 61  feAuthNetworkSta
3dc0: 74 65 20 3d 3d 3d 20 30 29 20 7b 0a 20 20 20 20  te === 0) {.    
3dd0: 20 20 20 20 72 65 74 75 72 6e 20 27 63 6f 6e 6e      return 'conn
3de0: 65 63 74 65 64 27 0a 20 20 20 20 20 20 7d 20 65  ected'.      } e
3df0: 6c 73 65 20 69 66 20 28 73 61 66 65 41 75 74 68  lse if (safeAuth
3e00: 4e 65 74 77 6f 72 6b 53 74 61 74 65 20 3d 3d 3d  NetworkState ===
3e10: 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20 72   -1) {.        r
3e20: 65 74 75 72 6e 20 27 74 65 72 6d 69 6e 61 74 65  eturn 'terminate
3e30: 64 27 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d'.      }.    }
3e40: 29 28 29 7d 22 20 6f 6e 63 6c 69 63 6b 3d 24 7b  )()}" onclick=${
3e50: 6f 6e 43 6c 69 63 6b 4f 70 65 6e 53 61 66 65 41  onClickOpenSafeA
3e60: 75 74 68 48 6f 6d 65 7d 3e 0a 20 20 20 20 20 20  uthHome}>.      
3e70: 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 69    <span class="i
3e80: 63 6f 6e 22 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20  con"></span>.   
3e90: 20 20 20 3c 2f 62 75 74 74 6f 6e 3e 60 0a 0a 0a     </button>`...
3ea0: 20 20 2f 2f 20 72 65 6e 64 65 72 20 73 61 66 65    // render safe
3eb0: 20 62 74 6e 0a 20 20 76 61 72 20 73 61 66 65 42   btn.  var safeB
3ec0: 74 6e 20 3d 20 79 6f 60 3c 73 70 61 6e 20 63 6c  tn = yo`<span cl
3ed0: 61 73 73 3d 22 73 61 66 65 2d 62 74 6e 2d 73 61  ass="safe-btn-sa
3ee0: 66 65 22 3e 0a 20 20 20 20 20 20 24 7b 73 61 66  fe">.      ${saf
3ef0: 65 4e 65 74 77 6f 72 6b 53 74 61 74 75 73 42 74  eNetworkStatusBt
3f00: 6e 7d 0a 20 20 20 20 20 20 24 7b 73 61 66 65 41  n}.      ${safeA
3f10: 75 74 68 50 6f 70 75 70 44 69 76 7d 0a 20 20 20  uthPopupDiv}.   
3f20: 20 20 20 3c 2f 73 70 61 6e 3e 60 0a 0a 20 20 2f     </span>`..  /
3f30: 2f 20 53 41 46 45 20 61 64 64 20 6d 65 73 73 61  / SAFE add messa
3f40: 67 65 73 20 61 73 20 6e 65 65 64 65 64 0a 20 20  ges as needed.  
3f50: 76 61 72 20 73 61 66 65 4d 65 73 73 61 67 65 42  var safeMessageB
3f60: 6f 78 20 3d 20 79 6f 60 3c 64 69 76 20 63 6c 61  ox = yo`<div cla
3f70: 73 73 3d 22 73 61 66 65 2d 6d 65 73 73 61 67 65  ss="safe-message
3f80: 2d 62 6f 78 22 3e 0a 20 20 20 20 20 20 24 7b 73  -box">.      ${s
3f90: 61 66 65 43 6f 6e 6e 65 63 74 69 6f 6e 4d 65 73  afeConnectionMes
3fa0: 73 61 67 65 28 29 7d 0a 20 20 20 20 3c 2f 64 69  sage()}.    </di
3fb0: 76 3e 60 0a 0a 20 20 2f 2f 20 60 70 61 67 65 60  v>`..  // `page`
3fc0: 20 69 73 20 6e 75 6c 6c 20 6f 6e 20 69 6e 69 74   is null on init
3fd0: 69 61 6c 20 72 65 6e 64 65 72 0a 20 20 2f 2f 20  ial render.  // 
3fe0: 61 6e 64 20 74 68 65 20 74 6f 6f 6c 62 61 72 20  and the toolbar 
3ff0: 73 68 6f 75 6c 64 20 62 65 20 68 69 64 64 65 6e  should be hidden
4000: 20 6f 6e 20 69 6e 69 74 69 61 6c 20 72 65 6e 64   on initial rend
4010: 65 72 0a 20 20 2f 2f 20 61 6e 64 20 69 74 20 73  er.  // and it s
4020: 68 6f 75 6c 64 20 62 65 20 68 69 64 64 65 6e 20  hould be hidden 
4030: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 6e 74  if the page isnt
4040: 20 61 63 74 69 76 65 0a 20 20 76 61 72 20 74 6f   active.  var to
4050: 6f 6c 62 61 72 48 69 64 64 65 6e 20 3d 20 28 21  olbarHidden = (!
4060: 70 61 67 65 20 7c 7c 20 21 70 61 67 65 2e 69 73  page || !page.is
4070: 41 63 74 69 76 65 29 20 3f 20 27 20 68 69 64 64  Active) ? ' hidd
4080: 65 6e 27 20 3a 20 27 27 0a 0a 20 20 2f 2f 20 70  en' : ''..  // p
4090: 72 65 73 65 72 76 65 20 74 68 65 20 63 75 72 72  reserve the curr
40a0: 65 6e 74 20 66 69 6e 64 65 72 20 76 61 6c 75 65  ent finder value
40b0: 20 61 6e 64 20 66 6f 63 75 73 0a 20 20 76 61 72   and focus.  var
40c0: 20 66 69 6e 64 45 6c 20 3d 20 70 61 67 65 20 26   findEl = page &
40d0: 26 20 70 61 67 65 2e 6e 61 76 62 61 72 45 6c 2e  & page.navbarEl.
40e0: 71 75 65 72 79 53 65 6c 65 63 74 6f 72 28 27 2e  querySelector('.
40f0: 6e 61 76 2d 66 69 6e 64 2d 69 6e 70 75 74 27 29  nav-find-input')
4100: 0a 20 20 76 61 72 20 66 69 6e 64 56 61 6c 75 65  .  var findValue
4110: 20 3d 20 66 69 6e 64 45 6c 20 3f 20 66 69 6e 64   = findEl ? find
4120: 45 6c 2e 76 61 6c 75 65 20 3a 20 27 27 0a 0a 20  El.value : ''.. 
4130: 20 2f 2f 20 69 6e 70 61 67 65 20 66 69 6e 64 65   // inpage finde
4140: 72 20 63 74 72 6c 0a 20 20 76 61 72 20 69 6e 70  r ctrl.  var inp
4150: 61 67 65 46 69 6e 64 65 72 20 3d 20 28 70 61 67  ageFinder = (pag
4160: 65 20 26 26 20 70 61 67 65 2e 69 73 49 6e 70 61  e && page.isInpa
4170: 67 65 46 69 6e 64 69 6e 67 29 0a 20 20 20 20 3f  geFinding).    ?
4180: 20 79 6f 60 3c 69 6e 70 75 74 0a 20 20 20 20 20   yo`<input.     
4190: 20 20 20 20 20 20 20 74 79 70 65 3d 22 74 65 78         type="tex
41a0: 74 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t".            c
41b0: 6c 61 73 73 3d 22 6e 61 76 2d 66 69 6e 64 2d 69  lass="nav-find-i
41c0: 6e 70 75 74 22 0a 20 20 20 20 20 20 20 20 20 20  nput".          
41d0: 20 20 70 6c 61 63 65 68 6f 6c 64 65 72 3d 22 46    placeholder="F
41e0: 69 6e 64 20 69 6e 20 70 61 67 65 2e 2e 2e 22 0a  ind in page...".
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 69 6e              onin
4200: 70 75 74 3d 24 7b 6f 6e 49 6e 70 75 74 46 69 6e  put=${onInputFin
4210: 64 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  d}.            o
4220: 6e 6b 65 79 64 6f 77 6e 3d 24 7b 6f 6e 4b 65 79  nkeydown=${onKey
4230: 64 6f 77 6e 46 69 6e 64 7d 0a 20 20 20 20 20 20  downFind}.      
4240: 20 20 20 20 20 20 76 61 6c 75 65 3d 24 7b 66 69        value=${fi
4250: 6e 64 56 61 6c 75 65 7d 20 2f 3e 60 0a 20 20 20  ndValue} />`.   
4260: 20 3a 20 27 27 0a 0a 0a 20 20 2f 2f 20 62 6f 6f   : ''...  // boo
4270: 6b 6d 61 72 6b 20 74 6f 67 67 6c 65 20 73 74 61  kmark toggle sta
4280: 74 65 0a 20 20 76 61 72 20 62 6f 6f 6b 6d 61 72  te.  var bookmar
4290: 6b 43 6c 61 73 73 20 3d 20 27 6e 61 76 2d 62 6f  kClass = 'nav-bo
42a0: 6f 6b 6d 61 72 6b 2d 62 74 6e 27 2b 28 28 70 61  okmark-btn'+((pa
42b0: 67 65 20 26 26 20 21 21 70 61 67 65 2e 62 6f 6f  ge && !!page.boo
42c0: 6b 6d 61 72 6b 29 20 3f 20 27 20 61 63 74 69 76  kmark) ? ' activ
42d0: 65 27 20 3a 20 27 27 29 0a 0a 20 20 2f 2f 20 76  e' : '')..  // v
42e0: 69 65 77 20 64 61 74 0a 20 20 76 61 72 20 76 69  iew dat.  var vi
42f0: 65 77 44 61 74 42 74 6e 0a 20 20 69 66 20 28 70  ewDatBtn.  if (p
4300: 61 67 65 20 26 26 20 70 61 67 65 2e 70 72 6f 74  age && page.prot
4310: 6f 63 6f 6c 44 65 73 63 72 69 70 74 69 6f 6e 20  ocolDescription 
4320: 26 26 20 70 61 67 65 2e 70 72 6f 74 6f 63 6f 6c  && page.protocol
4330: 44 65 73 63 72 69 70 74 69 6f 6e 2e 73 63 68 65  Description.sche
4340: 6d 65 20 3d 3d 20 27 64 61 74 27 29 20 7b 0a 20  me == 'dat') {. 
4350: 20 20 20 76 69 65 77 44 61 74 42 74 6e 20 3d 20     viewDatBtn = 
4360: 79 6f 60 3c 62 75 74 74 6f 6e 20 63 6c 61 73 73  yo`<button class
4370: 3d 22 6e 61 76 2d 76 69 65 77 2d 66 69 6c 65 73  ="nav-view-files
4380: 2d 62 74 6e 22 20 6f 6e 63 6c 69 63 6b 3d 24 7b  -btn" onclick=${
4390: 6f 6e 43 6c 69 63 6b 56 69 65 77 46 69 6c 65 73  onClickViewFiles
43a0: 7d 3e 0a 20 20 20 20 20 20 3c 73 70 61 6e 20 63  }>.      <span c
43b0: 6c 61 73 73 3d 22 69 63 6f 6e 20 69 63 6f 6e 2d  lass="icon icon-
43c0: 64 6f 63 73 22 3e 3c 2f 73 70 61 6e 3e 20 3c 73  docs"></span> <s
43d0: 6d 61 6c 6c 3e 56 69 65 77 20 53 69 74 65 20 46  mall>View Site F
43e0: 69 6c 65 73 3c 2f 73 6d 61 6c 6c 3e 0a 20 20 20  iles</small>.   
43f0: 20 3c 2f 62 75 74 74 6f 6e 3e 60 0a 20 20 7d 0a   </button>`.  }.
4400: 0a 20 20 2f 2f 20 7a 6f 6f 6d 20 62 74 6e 20 73  .  // zoom btn s
4410: 68 6f 75 6c 64 20 6f 6e 6c 79 20 73 68 6f 77 20  hould only show 
4420: 69 66 20 7a 6f 6f 6d 20 69 73 20 6e 6f 74 20 74  if zoom is not t
4430: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
4440: 6e 67 0a 20 20 76 61 72 20 7a 6f 6f 6d 42 74 6e  ng.  var zoomBtn
4450: 20 3d 20 27 27 0a 20 20 69 66 20 28 70 61 67 65   = ''.  if (page
4460: 20 26 26 20 70 61 67 65 2e 7a 6f 6f 6d 20 21 3d   && page.zoom !=
4470: 20 30 29 20 7b 0a 20 20 20 20 2f 2f 20 49 20 64   0) {.    // I d
4480: 6f 6e 74 20 6b 6e 6f 77 20 77 68 61 74 20 74 68  ont know what th
4490: 61 74 20 66 6f 72 6d 75 6c 61 20 69 73 2c 20 73  at formula is, s
44a0: 6f 20 49 20 73 6f 6c 76 65 64 20 74 68 69 73 20  o I solved this 
44b0: 70 72 6f 62 6c 65 6d 20 6c 69 6b 65 20 61 6e 79  problem like any
44c0: 20 67 6f 6f 64 20 70 72 6f 67 72 61 6d 6d 65 72   good programmer
44d0: 20 77 6f 75 6c 64 2c 20 62 79 20 73 74 65 61 6c   would, by steal
44e0: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 73 20 66  ing the values f
44f0: 72 6f 6d 20 63 68 72 6f 6d 65 0a 20 20 20 20 76  rom chrome.    v
4500: 61 72 20 7a 6f 6f 6d 50 63 74 20 3d 20 28 7b 0a  ar zoomPct = ({.
4510: 20 20 20 20 20 20 27 2d 30 2e 35 27 3a 20 39 30        '-0.5': 90
4520: 2c 20 27 2d 31 27 3a 20 37 35 2c 20 27 2d 31 2e  , '-1': 75, '-1.
4530: 35 27 3a 20 36 37 2c 20 27 2d 32 27 3a 20 35 30  5': 67, '-2': 50
4540: 2c 20 27 2d 32 2e 35 27 3a 20 33 33 2c 20 27 2d  , '-2.5': 33, '-
4550: 33 27 3a 20 32 35 2c 0a 20 20 20 20 20 20 27 30  3': 25,.      '0
4560: 27 3a 20 31 30 30 2c 0a 20 20 20 20 20 20 27 30  ': 100,.      '0
4570: 2e 35 27 3a 20 31 31 30 2c 20 27 31 27 3a 20 31  .5': 110, '1': 1
4580: 32 35 2c 20 27 31 2e 35 27 3a 20 31 35 30 2c 20  25, '1.5': 150, 
4590: 27 32 27 3a 20 31 37 35 2c 20 27 32 2e 35 27 3a  '2': 175, '2.5':
45a0: 20 32 30 30 2c 20 27 33 27 3a 20 32 35 30 2c 20   200, '3': 250, 
45b0: 27 33 2e 35 27 3a 20 33 30 30 2c 20 27 34 27 3a  '3.5': 300, '4':
45c0: 20 34 30 30 2c 20 27 34 2e 35 27 3a 20 35 30 30   400, '4.5': 500
45d0: 0a 20 20 20 20 7d 29 5b 70 61 67 65 2e 7a 6f 6f  .    })[page.zoo
45e0: 6d 5d 0a 20 20 20 20 7a 6f 6f 6d 42 74 6e 20 3d  m].    zoomBtn =
45f0: 20 79 6f 60 3c 62 75 74 74 6f 6e 20 6f 6e 63 6c   yo`<button oncl
4600: 69 63 6b 3d 24 7b 6f 6e 43 6c 69 63 6b 5a 6f 6f  ick=${onClickZoo
4610: 6d 7d 3e 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22  m}><span class="
4620: 69 63 6f 6e 20 69 63 6f 6e 2d 73 65 61 72 63 68  icon icon-search
4630: 22 3e 3c 2f 73 70 61 6e 3e 20 3c 73 6d 61 6c 6c  "></span> <small
4640: 3e 24 7b 7a 6f 6f 6d 50 63 74 7d 25 3c 2f 73 6d  >${zoomPct}%</sm
4650: 61 6c 6c 3e 3c 2f 62 75 74 74 6f 6e 3e 60 0a 20  all></button>`. 
4660: 20 7d 0a 0a 20 20 2f 2f 20 61 75 74 6f 63 6f 6d   }..  // autocom
4670: 70 6c 65 74 65 20 64 72 6f 70 64 6f 77 6e 0a 20  plete dropdown. 
4680: 20 76 61 72 20 61 75 74 6f 63 6f 6d 70 6c 65 74   var autocomplet
4690: 65 44 72 6f 70 64 6f 77 6e 20 3d 20 27 27 0a 20  eDropdown = ''. 
46a0: 20 69 66 20 28 61 75 74 6f 63 6f 6d 70 6c 65 74   if (autocomplet
46b0: 65 52 65 73 75 6c 74 73 29 20 7b 0a 20 20 20 20  eResults) {.    
46c0: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 44 72 6f 70  autocompleteDrop
46d0: 64 6f 77 6e 20 3d 20 79 6f 60 0a 20 20 20 20 20  down = yo`.     
46e0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 61 75 74   <div class="aut
46f0: 6f 63 6f 6d 70 6c 65 74 65 2d 64 72 6f 70 64 6f  ocomplete-dropdo
4700: 77 6e 22 20 6f 6e 63 6c 69 63 6b 3d 24 7b 6f 6e  wn" onclick=${on
4710: 43 6c 69 63 6b 41 75 74 6f 63 6f 6d 70 6c 65 74  ClickAutocomplet
4720: 65 44 72 6f 70 64 6f 77 6e 7d 3e 0a 20 20 20 20  eDropdown}>.    
4730: 20 20 20 20 24 7b 61 75 74 6f 63 6f 6d 70 6c 65      ${autocomple
4740: 74 65 52 65 73 75 6c 74 73 2e 6d 61 70 28 28 72  teResults.map((r
4750: 2c 20 69 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  , i) => {.      
4760: 2f 2f 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 20  // content.     
4770: 20 76 61 72 20 69 63 6f 6e 43 6c 73 20 3d 20 27   var iconCls = '
4780: 69 63 6f 6e 20 69 63 6f 6e 2d 27 20 2b 20 28 28  icon icon-' + ((
4790: 72 2e 73 65 61 72 63 68 29 20 3f 20 27 73 65 61  r.search) ? 'sea
47a0: 72 63 68 27 20 3a 20 27 77 69 6e 64 6f 77 27 29  rch' : 'window')
47b0: 0a 20 20 20 20 20 20 76 61 72 20 63 6f 6e 74 65  .      var conte
47c0: 6e 74 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 69  ntColumn.      i
47d0: 66 20 28 72 2e 73 65 61 72 63 68 29 0a 20 20 20  f (r.search).   
47e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 43 6f 6c 75       contentColu
47f0: 6d 6e 20 3d 20 79 6f 60 3c 73 70 61 6e 20 63 6c  mn = yo`<span cl
4800: 61 73 73 3d 22 72 65 73 75 6c 74 2d 73 65 61 72  ass="result-sear
4810: 63 68 22 3e 24 7b 72 2e 73 65 61 72 63 68 7d 3c  ch">${r.search}<
4820: 2f 73 70 61 6e 3e 60 0a 20 20 20 20 20 20 65 6c  /span>`.      el
4830: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  se {.        con
4840: 74 65 6e 74 43 6f 6c 75 6d 6e 20 3d 20 79 6f 60  tentColumn = yo`
4850: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 72 65 73  <span class="res
4860: 75 6c 74 2d 75 72 6c 22 3e 3c 2f 73 70 61 6e 3e  ult-url"></span>
4870: 60 0a 20 20 20 20 20 20 20 20 69 66 20 28 72 2e  `.        if (r.
4880: 75 72 6c 44 65 63 6f 72 61 74 65 64 29 0a 20 20  urlDecorated).  
4890: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 43          contentC
48a0: 6f 6c 75 6d 6e 2e 69 6e 6e 65 72 48 54 4d 4c 20  olumn.innerHTML 
48b0: 3d 20 72 2e 75 72 6c 44 65 63 6f 72 61 74 65 64  = r.urlDecorated
48c0: 20 2f 2f 20 75 73 65 20 69 6e 6e 65 72 48 54 4d   // use innerHTM
48d0: 4c 20 73 6f 20 6f 75 72 20 64 65 63 6f 72 61 74  L so our decorat
48e0: 69 6f 6e 20 63 61 6e 20 73 68 6f 77 0a 20 20 20  ion can show.   
48f0: 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20       else.      
4900: 20 20 20 20 63 6f 6e 74 65 6e 74 43 6f 6c 75 6d      contentColum
4910: 6e 2e 74 65 78 74 43 6f 6e 74 65 6e 74 20 3d 20  n.textContent = 
4920: 72 2e 75 72 6c 0a 20 20 20 20 20 20 7d 0a 20 20  r.url.      }.  
4930: 20 20 20 20 76 61 72 20 74 69 74 6c 65 43 6f 6c      var titleCol
4940: 75 6d 6e 20 3d 20 79 6f 60 3c 73 70 61 6e 20 63  umn = yo`<span c
4950: 6c 61 73 73 3d 22 72 65 73 75 6c 74 2d 74 69 74  lass="result-tit
4960: 6c 65 22 3e 3c 2f 73 70 61 6e 3e 60 0a 20 20 20  le"></span>`.   
4970: 20 20 20 69 66 20 28 72 2e 74 69 74 6c 65 44 65     if (r.titleDe
4980: 63 6f 72 61 74 65 64 29 0a 20 20 20 20 20 20 20  corated).       
4990: 20 74 69 74 6c 65 43 6f 6c 75 6d 6e 2e 69 6e 6e   titleColumn.inn
49a0: 65 72 48 54 4d 4c 20 3d 20 72 2e 74 69 74 6c 65  erHTML = r.title
49b0: 44 65 63 6f 72 61 74 65 64 20 2f 2f 20 75 73 65  Decorated // use
49c0: 20 69 6e 6e 65 72 48 54 4d 4c 20 73 6f 20 6f 75   innerHTML so ou
49d0: 72 20 64 65 63 6f 72 61 74 69 6f 6e 20 63 61 6e  r decoration can
49e0: 20 73 68 6f 77 0a 20 20 20 20 20 20 65 6c 73 65   show.      else
49f0: 0a 20 20 20 20 20 20 20 20 74 69 74 6c 65 43 6f  .        titleCo
4a00: 6c 75 6d 6e 2e 74 65 78 74 43 6f 6e 74 65 6e 74  lumn.textContent
4a10: 20 3d 20 72 2e 74 69 74 6c 65 0a 20 20 20 20 20   = r.title.     
4a20: 20 2f 2f 20 73 65 6c 65 63 74 69 6f 6e 0a 20 20   // selection.  
4a30: 20 20 20 20 76 61 72 20 72 6f 77 43 6c 73 20 3d      var rowCls =
4a40: 20 27 72 65 73 75 6c 74 27 0a 20 20 20 20 20 20   'result'.      
4a50: 69 66 20 28 69 20 3d 3d 20 61 75 74 6f 63 6f 6d  if (i == autocom
4a60: 70 6c 65 74 65 43 75 72 72 65 6e 74 53 65 6c 65  pleteCurrentSele
4a70: 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 72  ction).        r
4a80: 6f 77 43 6c 73 20 2b 3d 20 27 20 73 65 6c 65 63  owCls += ' selec
4a90: 74 65 64 27 0a 20 20 20 20 20 20 2f 2f 20 72 65  ted'.      // re
4aa0: 73 75 6c 74 20 72 6f 77 0a 20 20 20 20 20 20 72  sult row.      r
4ab0: 65 74 75 72 6e 20 79 6f 60 3c 64 69 76 20 63 6c  eturn yo`<div cl
4ac0: 61 73 73 3d 24 7b 72 6f 77 43 6c 73 7d 20 64 61  ass=${rowCls} da
4ad0: 74 61 2d 72 65 73 75 6c 74 2d 69 6e 64 65 78 3d  ta-result-index=
4ae0: 24 7b 69 7d 3e 0a 20 20 20 20 20 20 20 20 20 20  ${i}>.          
4af0: 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 24 7b    <span class=${
4b00: 69 63 6f 6e 43 6c 73 7d 3e 3c 2f 73 70 61 6e 3e  iconCls}></span>
4b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 7b 63  .            ${c
4b20: 6f 6e 74 65 6e 74 43 6f 6c 75 6d 6e 7d 0a 20 20  ontentColumn}.  
4b30: 20 20 20 20 20 20 20 20 20 20 24 7b 74 69 74 6c            ${titl
4b40: 65 43 6f 6c 75 6d 6e 7d 0a 20 20 20 20 20 20 20  eColumn}.       
4b50: 20 20 20 3c 2f 64 69 76 3e 60 0a 20 20 20 20 7d     </div>`.    }
4b60: 29 7d 0a 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a  )}.      </div>.
4b70: 20 20 20 20 60 0a 20 20 7d 0a 0a 20 20 2f 2f 20      `.  }..  // 
4b80: 70 72 65 73 65 72 76 65 20 74 68 65 20 63 75 72  preserve the cur
4b90: 72 65 6e 74 20 61 64 64 72 65 73 73 20 76 61 6c  rent address val
4ba0: 75 65 0a 20 20 76 61 72 20 61 64 64 72 45 6c 20  ue.  var addrEl 
4bb0: 3d 20 70 61 67 65 20 26 26 20 70 61 67 65 2e 6e  = page && page.n
4bc0: 61 76 62 61 72 45 6c 2e 71 75 65 72 79 53 65 6c  avbarEl.querySel
4bd0: 65 63 74 6f 72 28 27 2e 6e 61 76 2d 6c 6f 63 61  ector('.nav-loca
4be0: 74 69 6f 6e 2d 69 6e 70 75 74 27 29 0a 20 20 76  tion-input').  v
4bf0: 61 72 20 61 64 64 72 56 61 6c 75 65 20 3d 20 61  ar addrValue = a
4c00: 64 64 72 45 6c 20 3f 20 61 64 64 72 45 6c 2e 76  ddrEl ? addrEl.v
4c10: 61 6c 75 65 20 3a 20 27 27 0a 0a 20 20 2f 2f 20  alue : ''..  // 
4c20: 73 65 74 75 70 20 73 69 74 65 2d 70 65 72 6d 73  setup site-perms
4c30: 20 64 72 6f 70 64 6f 77 6e 0a 20 20 73 69 74 65   dropdown.  site
4c40: 50 65 72 6d 73 4e 61 76 62 61 72 42 74 6e 2e 70  PermsNavbarBtn.p
4c50: 72 6f 74 6f 63 6f 6c 44 65 73 63 72 69 70 74 69  rotocolDescripti
4c60: 6f 6e 20 3d 20 28 70 61 67 65 20 26 26 20 70 61  on = (page && pa
4c70: 67 65 2e 70 72 6f 74 6f 63 6f 6c 44 65 73 63 72  ge.protocolDescr
4c80: 69 70 74 69 6f 6e 29 0a 0a 20 20 2f 2f 20 72 65  iption)..  // re
4c90: 6e 64 65 72 0a 20 20 72 65 74 75 72 6e 20 79 6f  nder.  return yo
4ca0: 60 3c 64 69 76 20 64 61 74 61 2d 69 64 3d 24 7b  `<div data-id=${
4cb0: 69 64 7d 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62  id} class="toolb
4cc0: 61 72 2d 61 63 74 69 6f 6e 73 24 7b 74 6f 6f 6c  ar-actions${tool
4cd0: 62 61 72 48 69 64 64 65 6e 7d 22 3e 0a 20 20 20  barHidden}">.   
4ce0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 74 6f 6f   <div class="too
4cf0: 6c 62 61 72 2d 67 72 6f 75 70 22 3e 0a 20 20 20  lbar-group">.   
4d00: 20 20 20 3c 62 75 74 74 6f 6e 20 63 6c 61 73 73     <button class
4d10: 3d 22 74 6f 6f 6c 62 61 72 2d 62 74 6e 20 6e 61  ="toolbar-btn na
4d20: 76 2d 62 61 63 6b 2d 62 74 6e 22 20 24 7b 62 61  v-back-btn" ${ba
4d30: 63 6b 44 69 73 61 62 6c 65 64 7d 20 6f 6e 63 6c  ckDisabled} oncl
4d40: 69 63 6b 3d 24 7b 6f 6e 43 6c 69 63 6b 42 61 63  ick=${onClickBac
4d50: 6b 7d 3e 0a 20 20 20 20 20 20 20 20 3c 73 70 61  k}>.        <spa
4d60: 6e 20 63 6c 61 73 73 3d 22 69 63 6f 6e 20 69 63  n class="icon ic
4d70: 6f 6e 2d 6c 65 66 74 2d 6f 70 65 6e 2d 62 69 67  on-left-open-big
4d80: 22 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20 20  "></span>.      
4d90: 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20 20  </button>.      
4da0: 3c 62 75 74 74 6f 6e 20 63 6c 61 73 73 3d 22 74  <button class="t
4db0: 6f 6f 6c 62 61 72 2d 62 74 6e 20 6e 61 76 2d 66  oolbar-btn nav-f
4dc0: 6f 72 77 61 72 64 2d 62 74 6e 22 20 24 7b 66 6f  orward-btn" ${fo
4dd0: 72 77 61 72 64 44 69 73 61 62 6c 65 64 7d 20 6f  rwardDisabled} o
4de0: 6e 63 6c 69 63 6b 3d 24 7b 6f 6e 43 6c 69 63 6b  nclick=${onClick
4df0: 46 6f 72 77 61 72 64 7d 3e 0a 20 20 20 20 20 20  Forward}>.      
4e00: 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 69    <span class="i
4e10: 63 6f 6e 20 69 63 6f 6e 2d 72 69 67 68 74 2d 6f  con icon-right-o
4e20: 70 65 6e 2d 62 69 67 22 3e 3c 2f 73 70 61 6e 3e  pen-big"></span>
4e30: 0a 20 20 20 20 20 20 3c 2f 62 75 74 74 6f 6e 3e  .      </button>
4e40: 0a 20 20 20 20 20 20 24 7b 72 65 6c 6f 61 64 42  .      ${reloadB
4e50: 74 6e 7d 0a 20 20 20 20 20 20 24 7b 73 61 66 65  tn}.      ${safe
4e60: 42 74 6e 7d 0a 20 20 20 20 20 20 24 7b 73 61 66  Btn}.      ${saf
4e70: 65 4d 65 73 73 61 67 65 42 6f 78 7d 0a 20 20 20  eMessageBox}.   
4e80: 20 3c 2f 64 69 76 3e 0a 20 20 20 20 3c 64 69 76   </div>.    <div
4e90: 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72 2d   class="toolbar-
4ea0: 69 6e 70 75 74 2d 67 72 6f 75 70 22 3e 0a 20 20  input-group">.  
4eb0: 20 20 20 20 24 7b 73 69 74 65 50 65 72 6d 73 4e      ${sitePermsN
4ec0: 61 76 62 61 72 42 74 6e 2e 72 65 6e 64 65 72 28  avbarBtn.render(
4ed0: 29 7d 0a 20 20 20 20 20 20 3c 69 6e 70 75 74 0a  )}.      <input.
4ee0: 20 20 20 20 20 20 20 20 74 79 70 65 3d 22 74 65          type="te
4ef0: 78 74 22 0a 20 20 20 20 20 20 20 20 63 6c 61 73  xt".        clas
4f00: 73 3d 22 6e 61 76 2d 6c 6f 63 61 74 69 6f 6e 2d  s="nav-location-
4f10: 69 6e 70 75 74 22 0a 20 20 20 20 20 20 20 20 6f  input".        o
4f20: 6e 66 6f 63 75 73 3d 24 7b 6f 6e 46 6f 63 75 73  nfocus=${onFocus
4f30: 4c 6f 63 61 74 69 6f 6e 7d 0a 20 20 20 20 20 20  Location}.      
4f40: 20 20 6f 6e 62 6c 75 72 3d 24 7b 6f 6e 42 6c 75    onblur=${onBlu
4f50: 72 4c 6f 63 61 74 69 6f 6e 7d 0a 20 20 20 20 20  rLocation}.     
4f60: 20 20 20 6f 6e 6b 65 79 64 6f 77 6e 3d 24 7b 6f     onkeydown=${o
4f70: 6e 4b 65 79 64 6f 77 6e 4c 6f 63 61 74 69 6f 6e  nKeydownLocation
4f80: 7d 0a 20 20 20 20 20 20 20 20 6f 6e 69 6e 70 75  }.        oninpu
4f90: 74 3d 24 7b 6f 6e 49 6e 70 75 74 4c 6f 63 61 74  t=${onInputLocat
4fa0: 69 6f 6e 7d 0a 20 20 20 20 20 20 20 20 76 61 6c  ion}.        val
4fb0: 75 65 3d 24 7b 61 64 64 72 56 61 6c 75 65 7d 20  ue=${addrValue} 
4fc0: 2f 3e 0a 20 20 20 20 20 20 24 7b 69 6e 70 61 67  />.      ${inpag
4fd0: 65 46 69 6e 64 65 72 7d 0a 20 20 20 20 20 20 24  eFinder}.      $
4fe0: 7b 76 69 65 77 44 61 74 42 74 6e 7d 0a 20 20 20  {viewDatBtn}.   
4ff0: 20 20 20 24 7b 7a 6f 6f 6d 42 74 6e 7d 0a 20 20     ${zoomBtn}.  
5000: 20 20 20 20 3c 62 75 74 74 6f 6e 20 63 6c 61 73      <button clas
5010: 73 3d 24 7b 62 6f 6f 6b 6d 61 72 6b 43 6c 61 73  s=${bookmarkClas
5020: 73 7d 20 6f 6e 63 6c 69 63 6b 3d 24 7b 6f 6e 43  s} onclick=${onC
5030: 6c 69 63 6b 42 6f 6f 6b 6d 61 72 6b 7d 3e 3c 73  lickBookmark}><s
5040: 70 61 6e 20 63 6c 61 73 73 3d 22 69 63 6f 6e 20  pan class="icon 
5050: 69 63 6f 6e 2d 73 74 61 72 22 3e 3c 2f 73 70 61  icon-star"></spa
5060: 6e 3e 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20  n></button>.    
5070: 20 20 24 7b 61 75 74 6f 63 6f 6d 70 6c 65 74 65    ${autocomplete
5080: 44 72 6f 70 64 6f 77 6e 7d 0a 20 20 20 20 3c 2f  Dropdown}.    </
5090: 64 69 76 3e 0a 20 20 20 20 3c 64 69 76 20 63 6c  div>.    <div cl
50a0: 61 73 73 3d 22 74 6f 6f 6c 62 61 72 2d 67 72 6f  ass="toolbar-gro
50b0: 75 70 22 3e 0a 20 20 20 20 20 20 24 7b 64 6f 77  up">.      ${dow
50c0: 6e 6c 6f 61 64 73 4e 61 76 62 61 72 42 74 6e 2e  nloadsNavbarBtn.
50d0: 72 65 6e 64 65 72 28 29 7d 0a 20 20 20 20 20 20  render()}.      
50e0: 24 7b 75 70 64 61 74 65 73 4e 61 76 62 61 72 42  ${updatesNavbarB
50f0: 74 6e 2e 72 65 6e 64 65 72 28 29 7d 0a 20 20 20  tn.render()}.   
5100: 20 3c 2f 64 69 76 3e 0a 20 20 3c 2f 64 69 76 3e   </div>.  </div>
5110: 60 0a 7d 0a 0a 76 61 72 20 69 73 48 61 73 68 52  `.}..var isHashR
5120: 65 67 65 78 20 3d 20 2f 5e 5b 61 2d 7a 30 2d 39  egex = /^[a-z0-9
5130: 5d 7b 36 34 7d 2f 69 0a 66 75 6e 63 74 69 6f 6e  ]{64}/i.function
5140: 20 68 61 6e 64 6c 65 41 75 74 6f 63 6f 6d 70 6c   handleAutocompl
5150: 65 74 65 53 65 61 72 63 68 20 28 72 65 73 75 6c  eteSearch (resul
5160: 74 73 29 20 7b 0a 20 20 76 61 72 20 76 20 3d 20  ts) {.  var v = 
5170: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 43 75 72 72  autocompleteCurr
5180: 65 6e 74 56 61 6c 75 65 0a 0a 20 20 2f 2f 20 64  entValue..  // d
5190: 65 63 6f 72 61 74 65 20 72 65 73 75 6c 74 20 77  ecorate result w
51a0: 69 74 68 20 62 6f 6c 64 65 64 20 72 65 67 69 6f  ith bolded regio
51b0: 6e 73 0a 20 20 2f 2f 20 65 78 70 6c 69 63 69 74  ns.  // explicit
51c0: 6c 79 20 72 65 70 6c 61 63 65 20 73 70 65 63 69  ly replace speci
51d0: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 74 6f  al characters to
51e0: 20 6d 61 74 63 68 20 73 71 6c 69 74 65 20 66 74   match sqlite ft
51f0: 73 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 0a 20  s tokenization. 
5200: 20 76 61 72 20 73 65 61 72 63 68 54 65 72 6d 73   var searchTerms
5210: 20 3d 20 76 2e 72 65 70 6c 61 63 65 28 2f 5b 3a   = v.replace(/[:
5220: 5e 2a 2d 5c 2e 5d 2f 67 2c 20 27 20 27 29 2e 73  ^*-\.]/g, ' ').s
5230: 70 6c 69 74 28 27 20 27 29 2e 66 69 6c 74 65 72  plit(' ').filter
5240: 28 42 6f 6f 6c 65 61 6e 29 0a 20 20 72 65 73 75  (Boolean).  resu
5250: 6c 74 73 2e 66 6f 72 45 61 63 68 28 72 20 3d 3e  lts.forEach(r =>
5260: 20 64 65 63 6f 72 61 74 65 52 65 73 75 6c 74 4d   decorateResultM
5270: 61 74 63 68 65 73 28 73 65 61 72 63 68 54 65 72  atches(searchTer
5280: 6d 73 2c 20 72 29 29 0a 0a 20 20 2f 2f 20 64 6f  ms, r))..  // do
5290: 65 73 20 74 68 65 20 76 61 6c 75 65 20 6c 6f 6f  es the value loo
52a0: 6b 20 6c 69 6b 65 20 61 20 75 72 6c 3f 0a 20 20  k like a url?.  
52b0: 76 61 72 20 69 73 50 72 6f 62 61 62 6c 79 55 72  var isProbablyUr
52c0: 6c 20 3d 20 74 72 75 65 3b 0a 20 20 76 61 72 20  l = true;.  var 
52d0: 76 57 69 74 68 50 72 6f 74 6f 63 6f 6c 20 3d 20  vWithProtocol = 
52e0: 76 0a 20 20 76 61 72 20 69 73 47 75 65 73 73 69  v.  var isGuessi
52f0: 6e 67 54 68 65 53 63 68 65 6d 65 20 3d 20 66 61  ngTheScheme = fa
5300: 6c 73 65 0a 20 20 69 66 20 28 69 73 50 72 6f 62  lse.  if (isProb
5310: 61 62 6c 79 55 72 6c 20 26 26 20 21 76 2e 69 6e  ablyUrl && !v.in
5320: 63 6c 75 64 65 73 28 27 3a 2f 2f 27 29 20 26 26  cludes('://') &&
5330: 20 21 28 76 2e 73 74 61 72 74 73 57 69 74 68 28   !(v.startsWith(
5340: 27 62 65 61 6b 65 72 3a 27 29 20 7c 7c 20 76 2e  'beaker:') || v.
5350: 73 74 61 72 74 73 57 69 74 68 28 27 69 70 66 73  startsWith('ipfs
5360: 3a 2f 27 29 29 29 20 7b 0a 20 20 20 20 69 66 20  :/'))) {.    if 
5370: 28 69 73 48 61 73 68 52 65 67 65 78 2e 74 65 73  (isHashRegex.tes
5380: 74 28 76 29 29 0a 20 20 20 20 20 20 76 57 69 74  t(v)).      vWit
5390: 68 50 72 6f 74 6f 63 6f 6c 20 3d 20 27 64 61 74  hProtocol = 'dat
53a0: 3a 2f 2f 27 2b 76 0a 20 20 20 20 65 6c 73 65 20  ://'+v.    else 
53b0: 69 66 20 28 21 72 65 6d 6f 74 65 2e 67 65 74 47  if (!remote.getG
53c0: 6c 6f 62 61 6c 28 27 62 72 6f 77 73 65 72 53 74  lobal('browserSt
53d0: 61 74 75 73 27 29 2e 73 61 66 65 4d 6f 64 65 4f  atus').safeModeO
53e0: 6e 29 20 7b 0a 20 20 20 20 20 20 76 57 69 74 68  n) {.      vWith
53f0: 50 72 6f 74 6f 63 6f 6c 20 3d 20 27 68 74 74 70  Protocol = 'http
5400: 3a 2f 2f 27 20 2b 20 76 0a 20 20 20 20 20 20 69  ://' + v.      i
5410: 73 47 75 65 73 73 69 6e 67 54 68 65 53 63 68 65  sGuessingTheSche
5420: 6d 65 20 3d 20 74 72 75 65 0a 20 20 20 20 7d 20  me = true.    } 
5430: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 76 57 69  else {.      vWi
5440: 74 68 50 72 6f 74 6f 63 6f 6c 20 3d 20 27 73 61  thProtocol = 'sa
5450: 66 65 3a 2f 2f 27 2b 76 0a 20 20 20 20 20 20 69  fe://'+v.      i
5460: 73 47 75 65 73 73 69 6e 67 54 68 65 53 63 68 65  sGuessingTheSche
5470: 6d 65 20 3d 20 74 72 75 65 20 2f 2f 20 6e 6f 74  me = true // not
5480: 65 20 74 68 61 74 20 77 65 27 72 65 20 67 75 65  e that we're gue
5490: 73 73 69 6e 67 20 73 6f 20 74 68 61 74 2c 20 69  ssing so that, i
54a0: 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65  f this fails, we
54b0: 20 63 61 6e 20 74 72 79 20 68 74 74 70 3a 2f 2f   can try http://
54c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2f  .    }.  }..  //
54d0: 20 73 65 74 20 74 68 65 20 74 6f 70 20 72 65 73   set the top res
54e0: 75 6c 74 73 20 61 63 63 6f 72 64 69 6e 67 6c 79  ults accordingly
54f0: 0a 20 20 76 61 72 20 67 6f 74 6f 52 65 73 75 6c  .  var gotoResul
5500: 74 20 3d 20 7b 20 75 72 6c 3a 20 76 57 69 74 68  t = { url: vWith
5510: 50 72 6f 74 6f 63 6f 6c 2c 20 74 69 74 6c 65 3a  Protocol, title:
5520: 20 27 47 6f 20 74 6f 20 27 2b 76 2c 20 69 73 47   'Go to '+v, isG
5530: 75 65 73 73 69 6e 67 54 68 65 53 63 68 65 6d 65  uessingTheScheme
5540: 20 7d 0a 20 20 76 61 72 20 73 65 61 72 63 68 52   }.  var searchR
5550: 65 73 75 6c 74 20 3d 20 7b 0a 20 20 20 20 73 65  esult = {.    se
5560: 61 72 63 68 3a 20 76 2c 0a 20 20 20 20 74 69 74  arch: v,.    tit
5570: 6c 65 3a 20 27 44 75 63 6b 44 75 63 6b 47 6f 20  le: 'DuckDuckGo 
5580: 53 65 61 72 63 68 27 2c 0a 20 20 20 20 75 72 6c  Search',.    url
5590: 3a 20 27 68 74 74 70 73 3a 2f 2f 64 75 63 6b 64  : 'https://duckd
55a0: 75 63 6b 67 6f 2e 63 6f 6d 2f 3f 71 3d 27 20 2b  uckgo.com/?q=' +
55b0: 20 76 2e 73 70 6c 69 74 28 27 20 27 29 2e 6a 6f   v.split(' ').jo
55c0: 69 6e 28 27 2b 27 29 0a 20 20 7d 0a 20 20 69 66  in('+').  }.  if
55d0: 20 28 69 73 50 72 6f 62 61 62 6c 79 55 72 6c 29   (isProbablyUrl)
55e0: 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 52 65 73   autocompleteRes
55f0: 75 6c 74 73 20 3d 20 5b 67 6f 74 6f 52 65 73 75  ults = [gotoResu
5600: 6c 74 2c 20 73 65 61 72 63 68 52 65 73 75 6c 74  lt, searchResult
5610: 5d 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20  ].  else        
5620: 20 20 20 20 20 20 20 61 75 74 6f 63 6f 6d 70 6c         autocompl
5630: 65 74 65 52 65 73 75 6c 74 73 20 3d 20 5b 73 65  eteResults = [se
5640: 61 72 63 68 52 65 73 75 6c 74 5d 0a 0a 20 20 2f  archResult]..  /
5650: 2f 20 61 64 64 20 73 65 61 72 63 68 20 72 65 73  / add search res
5660: 75 6c 74 73 0a 20 20 69 66 20 28 72 65 73 75 6c  ults.  if (resul
5670: 74 73 29 0a 20 20 20 20 61 75 74 6f 63 6f 6d 70  ts).    autocomp
5680: 6c 65 74 65 52 65 73 75 6c 74 73 20 3d 20 61 75  leteResults = au
5690: 74 6f 63 6f 6d 70 6c 65 74 65 52 65 73 75 6c 74  tocompleteResult
56a0: 73 2e 63 6f 6e 63 61 74 28 72 65 73 75 6c 74 73  s.concat(results
56b0: 29 0a 0a 20 20 2f 2f 20 72 65 6e 64 65 72 0a 20  )..  // render. 
56c0: 20 75 70 64 61 74 65 28 29 0a 7d 0a 0a 66 75 6e   update().}..fun
56d0: 63 74 69 6f 6e 20 67 65 74 41 75 74 6f 63 6f 6d  ction getAutocom
56e0: 70 6c 65 74 65 53 65 6c 65 63 74 69 6f 6e 20 28  pleteSelection (
56f0: 69 29 20 7b 0a 20 20 69 66 20 28 74 79 70 65 6f  i) {.  if (typeo
5700: 66 20 69 20 21 3d 3d 20 27 6e 75 6d 62 65 72 27  f i !== 'number'
5710: 29 0a 20 20 20 20 69 20 3d 20 61 75 74 6f 63 6f  ).    i = autoco
5720: 6d 70 6c 65 74 65 43 75 72 72 65 6e 74 53 65 6c  mpleteCurrentSel
5730: 65 63 74 69 6f 6e 0a 20 20 69 66 20 28 61 75 74  ection.  if (aut
5740: 6f 63 6f 6d 70 6c 65 74 65 52 65 73 75 6c 74 73  ocompleteResults
5750: 20 26 26 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65   && autocomplete
5760: 52 65 73 75 6c 74 73 5b 69 5d 29 0a 20 20 20 20  Results[i]).    
5770: 72 65 74 75 72 6e 20 61 75 74 6f 63 6f 6d 70 6c  return autocompl
5780: 65 74 65 52 65 73 75 6c 74 73 5b 69 5d 0a 0a 20  eteResults[i].. 
5790: 20 2f 2f 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20   // fallback to 
57a0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
57b0: 65 20 69 6e 20 74 68 65 20 6e 61 76 62 61 72 0a  e in the navbar.
57c0: 20 20 76 61 72 20 61 64 64 72 45 6c 20 3d 20 70    var addrEl = p
57d0: 61 67 65 73 2e 67 65 74 41 63 74 69 76 65 28 29  ages.getActive()
57e0: 2e 6e 61 76 62 61 72 45 6c 2e 71 75 65 72 79 53  .navbarEl.queryS
57f0: 65 6c 65 63 74 6f 72 28 27 2e 6e 61 76 2d 6c 6f  elector('.nav-lo
5800: 63 61 74 69 6f 6e 2d 69 6e 70 75 74 27 29 0a 20  cation-input'). 
5810: 20 72 65 74 75 72 6e 20 7b 20 75 72 6c 3a 20 61   return { url: a
5820: 64 64 72 45 6c 2e 76 61 6c 75 65 20 7d 0a 7d 0a  ddrEl.value }.}.
5830: 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74 41 75 74  .function getAut
5840: 6f 63 6f 6d 70 6c 65 74 65 53 65 6c 65 63 74 69  ocompleteSelecti
5850: 6f 6e 55 72 6c 20 28 69 29 20 7b 0a 20 20 72 65  onUrl (i) {.  re
5860: 74 75 72 6e 20 67 65 74 41 75 74 6f 63 6f 6d 70  turn getAutocomp
5870: 6c 65 74 65 53 65 6c 65 63 74 69 6f 6e 28 69 29  leteSelection(i)
5880: 2e 75 72 6c 0a 7d 0a 0a 2f 2f 20 68 65 6c 70 65  .url.}..// helpe
5890: 72 20 66 6f 72 20 61 75 74 6f 63 6f 6d 70 6c 65  r for autocomple
58a0: 74 65 0a 2f 2f 20 2d 20 74 61 6b 65 73 20 69 6e  te.// - takes in
58b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 61   the current sea
58c0: 72 63 68 20 28 74 6f 6b 65 6e 69 7a 65 64 29 20  rch (tokenized) 
58d0: 61 6e 64 20 61 20 72 65 73 75 6c 74 20 6f 62 6a  and a result obj
58e0: 65 63 74 0a 2f 2f 20 2d 20 6d 75 74 61 74 65 73  ect.// - mutates
58f0: 20 60 72 65 73 75 6c 74 60 20 73 6f 20 74 68 61   `result` so tha
5900: 74 20 6d 61 74 63 68 69 6e 67 20 74 65 78 74 20  t matching text 
5910: 69 73 20 62 6f 6c 64 0a 76 61 72 20 6f 66 66 73  is bold.var offs
5920: 65 74 73 52 65 67 65 78 20 3d 20 2f 28 5b 5c 64  etsRegex = /([\d
5930: 5d 2b 20 5b 5c 64 5d 2b 20 5b 5c 64 5d 2b 20 5b  ]+ [\d]+ [\d]+ [
5940: 5c 64 5d 2b 29 2f 67 0a 66 75 6e 63 74 69 6f 6e  \d]+)/g.function
5950: 20 64 65 63 6f 72 61 74 65 52 65 73 75 6c 74 4d   decorateResultM
5960: 61 74 63 68 65 73 20 28 73 65 61 72 63 68 54 65  atches (searchTe
5970: 72 6d 73 2c 20 72 65 73 75 6c 74 29 20 7b 0a 20  rms, result) {. 
5980: 20 2f 2f 20 65 78 74 72 61 63 74 20 6f 66 66 73   // extract offs
5990: 65 74 73 0a 20 20 76 61 72 20 74 75 70 6c 65 73  ets.  var tuples
59a0: 20 3d 20 28 72 65 73 75 6c 74 2e 6f 66 66 73 65   = (result.offse
59b0: 74 73 20 7c 7c 20 27 27 29 2e 6d 61 74 63 68 28  ts || '').match(
59c0: 6f 66 66 73 65 74 73 52 65 67 65 78 29 0a 20 20  offsetsRegex).  
59d0: 69 66 20 28 21 74 75 70 6c 65 73 29 0a 20 20 20  if (!tuples).   
59e0: 20 72 65 74 75 72 6e 0a 0a 20 20 2f 2f 20 69 74   return..  // it
59f0: 65 72 61 74 65 20 61 6c 6c 20 6d 61 74 63 68 20  erate all match 
5a00: 74 75 70 6c 65 73 2c 20 61 6e 64 20 62 72 65 61  tuples, and brea
5a10: 6b 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 74  k the values int
5a20: 6f 20 73 65 67 6d 65 6e 74 73 0a 20 20 6c 65 74  o segments.  let
5a30: 20 6c 61 73 74 54 75 70 6c 65 0a 20 20 6c 65 74   lastTuple.  let
5a40: 20 73 65 67 6d 65 6e 74 73 20 3d 20 7b 20 75 72   segments = { ur
5a50: 6c 3a 20 5b 5d 2c 20 74 69 74 6c 65 3a 20 5b 5d  l: [], title: []
5a60: 20 7d 0a 20 20 6c 65 74 20 6c 61 73 74 4f 66 66   }.  let lastOff
5a70: 73 65 74 20 3d 20 7b 20 75 72 6c 3a 20 30 2c 20  set = { url: 0, 
5a80: 74 69 74 6c 65 3a 20 30 20 7d 0a 20 20 66 6f 72  title: 0 }.  for
5a90: 20 28 6c 65 74 20 74 75 70 6c 65 20 6f 66 20 74   (let tuple of t
5aa0: 75 70 6c 65 73 29 20 7b 0a 20 20 20 20 74 75 70  uples) {.    tup
5ab0: 6c 65 20 3d 20 74 75 70 6c 65 2e 73 70 6c 69 74  le = tuple.split
5ac0: 28 27 20 27 29 2e 6d 61 70 28 69 20 3d 3e 20 2b  (' ').map(i => +
5ad0: 69 29 20 2f 2f 20 74 68 65 20 6d 61 70 28 29 20  i) // the map() 
5ae0: 63 6f 65 72 63 65 73 20 74 6f 20 74 68 65 20 70  coerces to the p
5af0: 72 6f 70 65 72 20 74 79 70 65 0a 20 20 20 20 6c  roper type.    l
5b00: 65 74 20 5b 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  et [ columnIndex
5b10: 2c 20 74 65 72 6d 49 6e 64 65 78 2c 20 6f 66 66  , termIndex, off
5b20: 73 65 74 2c 20 6d 61 74 63 68 4c 65 6e 20 5d 20  set, matchLen ] 
5b30: 3d 20 74 75 70 6c 65 0a 20 20 20 20 6c 65 74 20  = tuple.    let 
5b40: 63 6f 6c 75 6d 6e 4e 61 6d 65 20 3d 20 5b 27 75  columnName = ['u
5b50: 72 6c 27 2c 20 27 74 69 74 6c 65 27 5d 5b 63 6f  rl', 'title'][co
5b60: 6c 75 6d 6e 49 6e 64 65 78 5d 0a 0a 20 20 20 20  lumnIndex]..    
5b70: 2f 2f 20 73 6f 6d 65 74 69 6d 65 73 20 6d 75 6c  // sometimes mul
5b80: 74 69 70 6c 65 20 74 65 72 6d 73 20 63 61 6e 20  tiple terms can 
5b90: 68 69 74 20 61 74 20 74 68 65 20 73 61 6d 65 20  hit at the same 
5ba0: 70 6f 69 6e 74 0a 20 20 20 20 2f 2f 20 74 68 61  point.    // tha
5bb0: 74 20 62 72 65 61 6b 73 20 74 68 65 20 61 6c 67  t breaks the alg
5bc0: 6f 72 69 74 68 6d 2c 20 73 6f 20 73 6b 69 70 20  orithm, so skip 
5bd0: 74 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  that condition. 
5be0: 20 20 20 69 66 20 28 6c 61 73 74 54 75 70 6c 65     if (lastTuple
5bf0: 20 26 26 20 6c 61 73 74 54 75 70 6c 65 5b 30 5d   && lastTuple[0]
5c00: 20 3d 3d 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   === columnIndex
5c10: 20 26 26 20 6c 61 73 74 54 75 70 6c 65 5b 32 5d   && lastTuple[2]
5c20: 20 3d 3d 3d 20 6f 66 66 73 65 74 29 0a 20 20 20   === offset).   
5c30: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20     continue.    
5c40: 6c 61 73 74 54 75 70 6c 65 20 3d 20 74 75 70 6c  lastTuple = tupl
5c50: 65 0a 0a 20 20 20 20 2f 2f 20 75 73 65 20 74 68  e..    // use th
5c60: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
5c70: 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20 20 20  search term.    
5c80: 2f 2f 20 28 73 71 6c 69 74 65 20 46 54 53 20 67  // (sqlite FTS g
5c90: 69 76 65 73 20 74 68 65 20 6c 65 6e 67 74 68 20  ives the length 
5ca0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6d 61 74 63  of the full matc
5cb0: 68 69 6e 67 20 74 6f 6b 65 6e 2c 20 77 68 69 63  hing token, whic
5cc0: 68 20 69 73 6e 74 20 61 73 20 68 65 6c 70 66 75  h isnt as helpfu
5cd0: 6c 29 0a 20 20 20 20 6c 65 74 20 73 65 61 72 63  l).    let searc
5ce0: 68 54 65 72 6d 20 3d 20 73 65 61 72 63 68 54 65  hTerm = searchTe
5cf0: 72 6d 73 5b 74 65 72 6d 49 6e 64 65 78 5d 0a 20  rms[termIndex]. 
5d00: 20 20 20 6c 65 74 20 6c 65 6e 20 3d 20 73 65 61     let len = sea
5d10: 72 63 68 54 65 72 6d 2e 6c 65 6e 67 74 68 0a 0a  rchTerm.length..
5d20: 20 20 20 20 2f 2f 20 65 78 74 72 61 63 74 20 73      // extract s
5d30: 65 67 6d 65 6e 74 73 0a 20 20 20 20 73 65 67 6d  egments.    segm
5d40: 65 6e 74 73 5b 63 6f 6c 75 6d 6e 4e 61 6d 65 5d  ents[columnName]
5d50: 2e 70 75 73 68 28 72 65 73 75 6c 74 5b 63 6f 6c  .push(result[col
5d60: 75 6d 6e 4e 61 6d 65 5d 2e 73 6c 69 63 65 28 6c  umnName].slice(l
5d70: 61 73 74 4f 66 66 73 65 74 5b 63 6f 6c 75 6d 6e  astOffset[column
5d80: 4e 61 6d 65 5d 2c 20 6f 66 66 73 65 74 29 29 0a  Name], offset)).
5d90: 20 20 20 20 73 65 67 6d 65 6e 74 73 5b 63 6f 6c      segments[col
5da0: 75 6d 6e 4e 61 6d 65 5d 2e 70 75 73 68 28 72 65  umnName].push(re
5db0: 73 75 6c 74 5b 63 6f 6c 75 6d 6e 4e 61 6d 65 5d  sult[columnName]
5dc0: 2e 73 6c 69 63 65 28 6f 66 66 73 65 74 2c 20 6f  .slice(offset, o
5dd0: 66 66 73 65 74 2b 6c 65 6e 29 29 0a 20 20 20 20  ffset+len)).    
5de0: 6c 61 73 74 4f 66 66 73 65 74 5b 63 6f 6c 75 6d  lastOffset[colum
5df0: 6e 4e 61 6d 65 5d 20 3d 20 6f 66 66 73 65 74 20  nName] = offset 
5e00: 2b 20 6c 65 6e 0a 20 20 7d 0a 0a 20 20 2f 2f 20  + len.  }..  // 
5e10: 61 64 64 20 74 68 65 20 72 65 6d 61 69 6e 69 6e  add the remainin
5e20: 67 20 74 65 78 74 0a 20 20 73 65 67 6d 65 6e 74  g text.  segment
5e30: 73 2e 75 72 6c 2e 70 75 73 68 28 72 65 73 75 6c  s.url.push(resul
5e40: 74 2e 75 72 6c 2e 73 6c 69 63 65 28 6c 61 73 74  t.url.slice(last
5e50: 4f 66 66 73 65 74 2e 75 72 6c 29 29 0a 20 20 73  Offset.url)).  s
5e60: 65 67 6d 65 6e 74 73 2e 74 69 74 6c 65 2e 70 75  egments.title.pu
5e70: 73 68 28 72 65 73 75 6c 74 2e 74 69 74 6c 65 2e  sh(result.title.
5e80: 73 6c 69 63 65 28 6c 61 73 74 4f 66 66 73 65 74  slice(lastOffset
5e90: 2e 74 69 74 6c 65 29 29 0a 0a 20 20 2f 2f 20 6a  .title))..  // j
5ea0: 6f 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 73  oin the segments
5eb0: 20 77 69 74 68 20 3c 73 74 72 6f 6e 67 3e 20 74   with <strong> t
5ec0: 61 67 73 0a 20 20 72 65 73 75 6c 74 2e 75 72 6c  ags.  result.url
5ed0: 44 65 63 6f 72 61 74 65 64 20 3d 20 6a 6f 69 6e  Decorated = join
5ee0: 53 65 67 6d 65 6e 74 73 28 73 65 67 6d 65 6e 74  Segments(segment
5ef0: 73 2e 75 72 6c 29 0a 20 20 72 65 73 75 6c 74 2e  s.url).  result.
5f00: 74 69 74 6c 65 44 65 63 6f 72 61 74 65 64 20 3d  titleDecorated =
5f10: 20 6a 6f 69 6e 53 65 67 6d 65 6e 74 73 28 73 65   joinSegments(se
5f20: 67 6d 65 6e 74 73 2e 74 69 74 6c 65 29 0a 7d 0a  gments.title).}.
5f30: 0a 2f 2f 20 68 65 6c 70 65 72 20 66 6f 72 20 64  .// helper for d
5f40: 65 63 6f 72 61 74 65 52 65 73 75 6c 74 4d 61 74  ecorateResultMat
5f50: 63 68 65 73 28 29 0a 2f 2f 20 2d 20 74 61 6b 65  ches().// - take
5f60: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  s an array of st
5f70: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 28 65  ring segments (e
5f80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
5f90: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
5fa0: 29 0a 2f 2f 20 2d 20 6f 75 74 70 75 74 73 20 61  ).// - outputs a
5fb0: 20 73 69 6e 67 6c 65 20 65 73 63 61 70 65 64 20   single escaped 
5fc0: 73 74 72 69 6e 67 20 77 69 74 68 20 65 76 65 72  string with ever
5fd0: 79 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 20  y other element 
5fe0: 77 72 61 70 70 65 64 20 69 6e 20 3c 73 74 72 6f  wrapped in <stro
5ff0: 6e 67 3e 0a 76 61 72 20 6c 74 52 65 67 65 78 20  ng>.var ltRegex 
6000: 3d 20 2f 3c 2f 67 0a 76 61 72 20 67 74 52 65 67  = /</g.var gtReg
6010: 65 78 20 3d 20 2f 3e 2f 67 0a 66 75 6e 63 74 69  ex = />/g.functi
6020: 6f 6e 20 6a 6f 69 6e 53 65 67 6d 65 6e 74 73 20  on joinSegments 
6030: 28 73 65 67 6d 65 6e 74 73 29 20 7b 0a 20 20 76  (segments) {.  v
6040: 61 72 20 73 74 72 20 3d 20 27 27 0a 20 20 76 61  ar str = ''.  va
6050: 72 20 69 73 42 6f 6c 64 20 3d 20 66 61 6c 73 65  r isBold = false
6060: 0a 20 20 66 6f 72 20 28 76 61 72 20 73 65 67 6d  .  for (var segm
6070: 65 6e 74 20 6f 66 20 73 65 67 6d 65 6e 74 73 29  ent of segments)
6080: 20 7b 0a 20 20 20 20 2f 2f 20 65 73 63 61 70 65   {.    // escape
6090: 20 66 6f 72 20 73 61 66 65 74 79 0a 20 20 20 20   for safety.    
60a0: 73 65 67 6d 65 6e 74 20 3d 20 73 65 67 6d 65 6e  segment = segmen
60b0: 74 2e 72 65 70 6c 61 63 65 28 6c 74 52 65 67 65  t.replace(ltRege
60c0: 78 2c 20 27 26 6c 74 3b 27 29 2e 72 65 70 6c 61  x, '&lt;').repla
60d0: 63 65 28 67 74 52 65 67 65 78 2c 20 27 26 67 74  ce(gtRegex, '&gt
60e0: 3b 27 29 0a 0a 20 20 20 20 2f 2f 20 64 65 63 6f  ;')..    // deco
60f0: 72 61 74 65 20 77 69 74 68 20 74 68 65 20 73 74  rate with the st
6100: 72 6f 6e 67 20 74 61 67 0a 20 20 20 20 69 66 20  rong tag.    if 
6110: 28 69 73 42 6f 6c 64 29 20 73 74 72 20 2b 3d 20  (isBold) str += 
6120: 27 3c 73 74 72 6f 6e 67 3e 27 20 2b 20 73 65 67  '<strong>' + seg
6130: 6d 65 6e 74 20 2b 20 27 3c 2f 73 74 72 6f 6e 67  ment + '</strong
6140: 3e 27 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  >'.    else     
6150: 20 20 20 73 74 72 20 2b 3d 20 73 65 67 6d 65 6e     str += segmen
6160: 74 0a 20 20 20 20 69 73 42 6f 6c 64 20 3d 20 21  t.    isBold = !
6170: 69 73 42 6f 6c 64 0a 20 20 7d 0a 20 20 72 65 74  isBold.  }.  ret
6180: 75 72 6e 20 73 74 72 0a 7d 0a 0a 66 75 6e 63 74  urn str.}..funct
6190: 69 6f 6e 20 73 65 74 41 75 74 68 50 6f 70 75 70  ion setAuthPopup
61a0: 41 73 53 63 72 6f 6c 6c 61 62 6c 65 28 29 20 7b  AsScrollable() {
61b0: 0a 20 20 76 61 72 20 70 6f 70 75 70 42 61 73 65  .  var popupBase
61c0: 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 71 75 65 72   = document.quer
61d0: 79 53 65 6c 65 63 74 6f 72 28 27 2e 70 6f 70 75  ySelector('.popu
61e0: 70 20 2e 70 6f 70 75 70 2d 62 61 73 65 20 2e 70  p .popup-base .p
61f0: 6f 70 75 70 2d 69 27 29 0a 20 20 76 61 72 20 70  opup-i').  var p
6200: 6f 70 75 70 43 6f 6e 74 4d 61 69 6e 20 3d 20 64  opupContMain = d
6210: 6f 63 75 6d 65 6e 74 2e 71 75 65 72 79 53 65 6c  ocument.querySel
6220: 65 63 74 6f 72 28 27 2e 70 6f 70 75 70 20 2e 70  ector('.popup .p
6230: 6f 70 75 70 2d 62 61 73 65 20 2e 70 6f 70 75 70  opup-base .popup
6240: 2d 69 20 2e 70 6f 70 75 70 2d 63 6e 74 20 2e 70  -i .popup-cnt .p
6250: 6f 70 75 70 2d 63 6e 74 2d 6d 61 69 6e 27 29 0a  opup-cnt-main').
6260: 20 20 76 61 72 20 70 6f 70 75 70 43 6f 6e 74 4d    var popupContM
6270: 61 69 6e 48 65 69 67 68 74 20 3d 20 70 6f 70 75  ainHeight = popu
6280: 70 43 6f 6e 74 4d 61 69 6e 20 3f 20 70 6f 70 75  pContMain ? popu
6290: 70 43 6f 6e 74 4d 61 69 6e 2e 6f 66 66 73 65 74  pContMain.offset
62a0: 48 65 69 67 68 74 20 3a 20 30 0a 20 20 76 61 72  Height : 0.  var
62b0: 20 70 6f 70 75 70 43 6f 6e 74 4c 73 20 3d 20 64   popupContLs = d
62c0: 6f 63 75 6d 65 6e 74 2e 71 75 65 72 79 53 65 6c  ocument.querySel
62d0: 65 63 74 6f 72 28 27 2e 70 6f 70 75 70 20 2e 70  ector('.popup .p
62e0: 6f 70 75 70 2d 62 61 73 65 20 2e 70 6f 70 75 70  opup-base .popup
62f0: 2d 69 20 2e 70 6f 70 75 70 2d 63 6e 74 20 2e 70  -i .popup-cnt .p
6300: 6f 70 75 70 2d 63 6e 74 2d 6c 73 27 29 0a 20 20  opup-cnt-ls').  
6310: 76 61 72 20 70 6f 70 75 70 43 6f 6e 74 4c 73 68  var popupContLsh
6320: 65 69 67 68 74 20 3d 20 70 6f 70 75 70 43 6f 6e  eight = popupCon
6330: 74 4c 73 20 3f 20 70 6f 70 75 70 43 6f 6e 74 4c  tLs ? popupContL
6340: 73 2e 6f 66 66 73 65 74 48 65 69 67 68 74 20 3a  s.offsetHeight :
6350: 20 30 0a 20 20 76 61 72 20 70 6f 70 75 70 4d 64   0.  var popupMd
6360: 61 74 61 57 61 72 6e 20 3d 20 64 6f 63 75 6d 65  ataWarn = docume
6370: 6e 74 2e 71 75 65 72 79 53 65 6c 65 63 74 6f 72  nt.querySelector
6380: 28 27 2e 70 6f 70 75 70 20 2e 70 6f 70 75 70 2d  ('.popup .popup-
6390: 62 61 73 65 20 2e 70 6f 70 75 70 2d 69 20 2e 70  base .popup-i .p
63a0: 6f 70 75 70 2d 63 6e 74 20 2e 6d 64 61 74 61 2d  opup-cnt .mdata-
63b0: 77 61 72 6e 27 29 0a 20 20 76 61 72 20 70 6f 70  warn').  var pop
63c0: 75 70 4d 64 61 74 61 57 61 72 6e 48 65 69 67 68  upMdataWarnHeigh
63d0: 74 20 3d 20 70 6f 70 75 70 4d 64 61 74 61 57 61  t = popupMdataWa
63e0: 72 6e 20 3f 20 70 6f 70 75 70 4d 64 61 74 61 57  rn ? popupMdataW
63f0: 61 72 6e 2e 6f 66 66 73 65 74 48 65 69 67 68 74  arn.offsetHeight
6400: 20 3a 20 30 0a 0a 20 20 76 61 72 20 70 6f 70 75   : 0..  var popu
6410: 70 4c 69 73 74 4d 61 72 67 69 6e 54 6f 70 20 3d  pListMarginTop =
6420: 20 34 30 0a 20 20 76 61 72 20 66 6f 6f 74 65 72   40.  var footer
6430: 48 65 69 67 68 74 20 3d 20 31 34 30 0a 20 20 76  Height = 140.  v
6440: 61 72 20 70 6f 70 75 70 43 6e 74 41 64 64 65 64  ar popupCntAdded
6450: 53 70 61 63 65 20 3d 20 33 30 0a 20 20 76 61 72  Space = 30.  var
6460: 20 70 6f 70 75 70 43 6f 6e 74 61 69 6e 65 72 48   popupContainerH
6470: 65 69 67 68 74 20 3d 20 70 6f 70 75 70 43 6f 6e  eight = popupCon
6480: 74 4d 61 69 6e 48 65 69 67 68 74 20 2b 20 70 6f  tMainHeight + po
6490: 70 75 70 4d 64 61 74 61 57 61 72 6e 48 65 69 67  pupMdataWarnHeig
64a0: 68 74 20 2b 20 70 6f 70 75 70 43 6f 6e 74 4c 73  ht + popupContLs
64b0: 68 65 69 67 68 74 20 2b 20 70 6f 70 75 70 4c 69  height + popupLi
64c0: 73 74 4d 61 72 67 69 6e 54 6f 70 20 2b 20 70 6f  stMarginTop + po
64d0: 70 75 70 43 6e 74 41 64 64 65 64 53 70 61 63 65  pupCntAddedSpace
64e0: 20 2b 20 66 6f 6f 74 65 72 48 65 69 67 68 74 3b   + footerHeight;
64f0: 0a 0a 0a 20 20 69 66 20 28 20 70 6f 70 75 70 42  ...  if ( popupB
6500: 61 73 65 20 26 26 20 70 6f 70 75 70 42 61 73 65  ase && popupBase
6510: 2e 6f 66 66 73 65 74 48 65 69 67 68 74 20 3c 20  .offsetHeight < 
6520: 70 6f 70 75 70 43 6f 6e 74 61 69 6e 65 72 48 65  popupContainerHe
6530: 69 67 68 74 29 20 7b 0a 20 20 20 20 70 6f 70 75  ight) {.    popu
6540: 70 42 61 73 65 2e 63 6c 61 73 73 4c 69 73 74 2e  pBase.classList.
6550: 61 64 64 28 27 73 63 72 6f 6c 6c 27 29 0a 20 20  add('scroll').  
6560: 7d 20 65 6c 73 65 20 69 66 28 20 70 6f 70 75 70  } else if( popup
6570: 42 61 73 65 20 29 20 7b 0a 20 20 20 20 70 6f 70  Base ) {.    pop
6580: 75 70 42 61 73 65 2e 63 6c 61 73 73 4c 69 73 74  upBase.classList
6590: 2e 72 65 6d 6f 76 65 28 27 73 63 72 6f 6c 6c 27  .remove('scroll'
65a0: 29 0a 20 20 7d 0a 7d 0a 0a 77 69 6e 64 6f 77 2e  ).  }.}..window.
65b0: 61 64 64 45 76 65 6e 74 4c 69 73 74 65 6e 65 72  addEventListener
65c0: 28 27 72 65 73 69 7a 65 27 2c 20 66 75 6e 63 74  ('resize', funct
65d0: 69 6f 6e 28 29 20 7b 20 73 65 74 41 75 74 68 50  ion() { setAuthP
65e0: 6f 70 75 70 41 73 53 63 72 6f 6c 6c 61 62 6c 65  opupAsScrollable
65f0: 28 29 3b 20 7d 29 3b 0a 0a 66 75 6e 63 74 69 6f  (); });..functio
6600: 6e 20 63 6f 75 6e 74 4d 61 74 63 68 65 73 20 28  n countMatches (
6610: 73 74 72 2c 20 72 65 67 65 78 29 20 7b 0a 20 20  str, regex) {.  
6620: 76 61 72 20 6d 61 74 63 68 65 73 20 3d 20 73 74  var matches = st
6630: 72 2e 6d 61 74 63 68 28 72 65 67 65 78 29 0a 20  r.match(regex). 
6640: 20 72 65 74 75 72 6e 20 28 6d 61 74 63 68 65 73   return (matches
6650: 29 20 3f 20 6d 61 74 63 68 65 73 2e 6c 65 6e 67  ) ? matches.leng
6660: 74 68 20 3a 20 30 0a 7d 0a 0a 2f 2f 20 75 69 20  th : 0.}..// ui 
6670: 65 76 65 6e 74 20 68 61 6e 64 6c 65 72 73 0a 2f  event handlers./
6680: 2f 20 3d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65  / =..function ge
6690: 74 45 76 65 6e 74 50 61 67 65 20 28 65 29 20 7b  tEventPage (e) {
66a0: 0a 20 20 66 6f 72 20 28 76 61 72 20 69 3d 30 3b  .  for (var i=0;
66b0: 20 69 20 3c 20 65 2e 70 61 74 68 2e 6c 65 6e 67   i < e.path.leng
66c0: 74 68 3b 20 69 2b 2b 29 0a 20 20 20 20 69 66 20  th; i++).    if 
66d0: 28 65 2e 70 61 74 68 5b 69 5d 2e 64 61 74 61 73  (e.path[i].datas
66e0: 65 74 20 26 26 20 65 2e 70 61 74 68 5b 69 5d 2e  et && e.path[i].
66f0: 64 61 74 61 73 65 74 2e 69 64 29 0a 20 20 20 20  dataset.id).    
6700: 20 20 72 65 74 75 72 6e 20 70 61 67 65 73 2e 67    return pages.g
6710: 65 74 42 79 49 64 28 65 2e 70 61 74 68 5b 69 5d  etById(e.path[i]
6720: 2e 64 61 74 61 73 65 74 2e 69 64 29 0a 7d 0a 0a  .dataset.id).}..
6730: 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c 69 63 6b  function onClick
6740: 42 61 63 6b 20 28 65 29 20 7b 0a 20 20 76 61 72  Back (e) {.  var
6750: 20 70 61 67 65 20 3d 20 67 65 74 45 76 65 6e 74   page = getEvent
6760: 50 61 67 65 28 65 29 0a 20 20 69 66 20 28 70 61  Page(e).  if (pa
6770: 67 65 20 26 26 20 70 61 67 65 2e 63 61 6e 47 6f  ge && page.canGo
6780: 42 61 63 6b 28 29 29 0a 20 20 20 20 70 61 67 65  Back()).    page
6790: 2e 67 6f 42 61 63 6b 28 29 0a 7d 0a 0a 66 75 6e  .goBack().}..fun
67a0: 63 74 69 6f 6e 20 6f 6e 43 6c 69 63 6b 46 6f 72  ction onClickFor
67b0: 77 61 72 64 20 28 65 29 20 7b 0a 20 20 76 61 72  ward (e) {.  var
67c0: 20 70 61 67 65 20 3d 20 67 65 74 45 76 65 6e 74   page = getEvent
67d0: 50 61 67 65 28 65 29 0a 20 20 69 66 20 28 70 61  Page(e).  if (pa
67e0: 67 65 20 26 26 20 70 61 67 65 2e 63 61 6e 47 6f  ge && page.canGo
67f0: 46 6f 72 77 61 72 64 28 29 29 0a 20 20 20 20 70  Forward()).    p
6800: 61 67 65 2e 67 6f 46 6f 72 77 61 72 64 28 29 0a  age.goForward().
6810: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c  }..function onCl
6820: 69 63 6b 52 65 6c 6f 61 64 20 28 65 29 20 7b 0a  ickReload (e) {.
6830: 20 20 76 61 72 20 70 61 67 65 20 3d 20 67 65 74    var page = get
6840: 45 76 65 6e 74 50 61 67 65 28 65 29 0a 20 20 69  EventPage(e).  i
6850: 66 20 28 70 61 67 65 29 0a 20 20 20 20 70 61 67  f (page).    pag
6860: 65 2e 72 65 6c 6f 61 64 28 29 0a 7d 0a 0a 66 75  e.reload().}..fu
6870: 6e 63 74 69 6f 6e 20 74 6f 67 67 6c 65 50 65 72  nction togglePer
6880: 6d 69 73 73 69 6f 6e 73 28 65 29 20 7b 0a 20 20  missions(e) {.  
6890: 65 2e 70 72 65 76 65 6e 74 44 65 66 61 75 6c 74  e.preventDefault
68a0: 28 29 3b 0a 20 20 76 61 72 20 74 61 72 67 65 74  ();.  var target
68b0: 4e 6f 64 65 20 3d 20 65 2e 74 61 72 67 65 74 2e  Node = e.target.
68c0: 74 61 67 4e 61 6d 65 20 3d 3d 3d 20 27 48 33 27  tagName === 'H3'
68d0: 20 3f 20 65 2e 74 61 72 67 65 74 20 3a 20 6e 75   ? e.target : nu
68e0: 6c 6c 3b 0a 20 20 69 66 20 28 21 74 61 72 67 65  ll;.  if (!targe
68f0: 74 4e 6f 64 65 20 26 26 20 65 2e 74 61 72 67 65  tNode && e.targe
6900: 74 2e 70 61 72 65 6e 74 45 6c 65 6d 65 6e 74 2e  t.parentElement.
6910: 74 61 67 4e 61 6d 65 20 3d 3d 3d 20 27 48 33 27  tagName === 'H3'
6920: 29 20 7b 0a 20 20 20 20 74 61 72 67 65 74 4e 6f  ) {.    targetNo
6930: 64 65 20 3d 20 65 2e 74 61 72 67 65 74 2e 70 61  de = e.target.pa
6940: 72 65 6e 74 45 6c 65 6d 65 6e 74 0a 20 20 7d 0a  rentElement.  }.
6950: 20 20 69 66 20 28 21 74 61 72 67 65 74 4e 6f 64    if (!targetNod
6960: 65 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e) {.    return;
6970: 0a 20 20 7d 0a 20 20 76 61 72 20 6c 69 73 74 20  .  }.  var list 
6980: 3d 20 74 61 72 67 65 74 4e 6f 64 65 2e 70 61 72  = targetNode.par
6990: 65 6e 74 45 6c 65 6d 65 6e 74 0a 20 20 69 66 20  entElement.  if 
69a0: 28 6c 69 73 74 2e 63 6c 61 73 73 4c 69 73 74 2e  (list.classList.
69b0: 63 6f 6e 74 61 69 6e 73 28 27 73 68 6f 77 27 29  contains('show')
69c0: 29 20 7b 0a 20 20 20 20 6c 69 73 74 2e 63 6c 61  ) {.    list.cla
69d0: 73 73 4c 69 73 74 2e 72 65 6d 6f 76 65 28 27 73  ssList.remove('s
69e0: 68 6f 77 27 29 3b 0a 20 20 7d 20 65 6c 73 65 20  how');.  } else 
69f0: 7b 0a 20 20 20 20 6c 69 73 74 2e 63 6c 61 73 73  {.    list.class
6a00: 4c 69 73 74 2e 61 64 64 28 27 73 68 6f 77 27 29  List.add('show')
6a10: 3b 0a 20 20 7d 0a 20 20 73 65 74 41 75 74 68 50  ;.  }.  setAuthP
6a20: 6f 70 75 70 41 73 53 63 72 6f 6c 6c 61 62 6c 65  opupAsScrollable
6a30: 28 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 74  ().}..function t
6a40: 6f 67 67 6c 65 41 70 70 28 65 29 20 7b 0a 20 20  oggleApp(e) {.  
6a50: 65 2e 70 72 65 76 65 6e 74 44 65 66 61 75 6c 74  e.preventDefault
6a60: 28 29 3b 0a 20 20 76 61 72 20 62 74 6e 20 3d 20  ();.  var btn = 
6a70: 65 2e 74 61 72 67 65 74 2e 74 61 67 4e 61 6d 65  e.target.tagName
6a80: 20 3d 3d 3d 20 27 42 55 54 54 4f 4e 27 20 3f 20   === 'BUTTON' ? 
6a90: 65 2e 74 61 72 67 65 74 20 3a 20 6e 75 6c 6c 3b  e.target : null;
6aa0: 0a 20 20 69 66 20 28 21 62 74 6e 29 20 7b 0a 20  .  if (!btn) {. 
6ab0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6ac0: 20 76 61 72 20 61 70 70 54 6f 67 67 6c 65 45 6c   var appToggleEl
6ad0: 65 20 3d 20 62 74 6e 2e 70 61 72 65 6e 74 45 6c  e = btn.parentEl
6ae0: 65 6d 65 6e 74 3b 0a 20 20 76 61 72 20 6c 69 73  ement;.  var lis
6af0: 74 42 61 73 65 20 3d 20 61 70 70 54 6f 67 67 6c  tBase = appToggl
6b00: 65 45 6c 65 2e 70 61 72 65 6e 74 45 6c 65 6d 65  eEle.parentEleme
6b10: 6e 74 3b 0a 20 20 69 66 20 28 21 6c 69 73 74 42  nt;.  if (!listB
6b20: 61 73 65 2e 63 6c 61 73 73 4c 69 73 74 2e 63 6f  ase.classList.co
6b30: 6e 74 61 69 6e 73 28 27 6c 69 73 74 2d 69 2d 62  ntains('list-i-b
6b40: 27 29 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  ')) {.    return
6b50: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 6c 69 73 74  ;.  }.  if (list
6b60: 42 61 73 65 2e 63 6c 61 73 73 4c 69 73 74 2e 63  Base.classList.c
6b70: 6f 6e 74 61 69 6e 73 28 27 73 68 6f 77 2d 61 70  ontains('show-ap
6b80: 70 73 27 29 29 20 7b 0a 20 20 20 20 61 70 70 54  ps')) {.    appT
6b90: 6f 67 67 6c 65 45 6c 65 2e 63 6c 61 73 73 4c 69  oggleEle.classLi
6ba0: 73 74 2e 72 65 6d 6f 76 65 28 27 61 70 70 27 29  st.remove('app')
6bb0: 3b 0a 20 20 20 20 6c 69 73 74 42 61 73 65 2e 63  ;.    listBase.c
6bc0: 6c 61 73 73 4c 69 73 74 2e 72 65 6d 6f 76 65 28  lassList.remove(
6bd0: 27 73 68 6f 77 2d 61 70 70 73 27 29 3b 0a 20 20  'show-apps');.  
6be0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 70 70  } else {.    app
6bf0: 54 6f 67 67 6c 65 45 6c 65 2e 63 6c 61 73 73 4c  ToggleEle.classL
6c00: 69 73 74 2e 61 64 64 28 27 61 70 70 27 29 3b 0a  ist.add('app');.
6c10: 20 20 20 20 6c 69 73 74 42 61 73 65 2e 63 6c 61      listBase.cla
6c20: 73 73 4c 69 73 74 2e 61 64 64 28 27 73 68 6f 77  ssList.add('show
6c30: 2d 61 70 70 73 27 29 3b 0a 20 20 7d 0a 7d 0a 0a  -apps');.  }.}..
6c40: 2f 2f 20 65 78 70 6f 72 74 20 66 75 6e 63 74 69  // export functi
6c50: 6f 6e 20 6f 6e 43 6c 69 63 6b 54 6f 67 67 6c 65  on onClickToggle
6c60: 53 61 66 65 20 28 20 65 20 29 0a 2f 2f 20 7b 0a  Safe ( e ).// {.
6c70: 2f 2f 20 20 20 20 20 70 61 67 65 73 2e 74 6f 67  //     pages.tog
6c80: 67 6c 65 53 61 66 65 28 29 3b 0a 2f 2f 20 7d 0a  gleSafe();.// }.
6c90: 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c 69 63  .function onClic
6ca0: 6b 4f 70 65 6e 53 61 66 65 41 75 74 68 48 6f 6d  kOpenSafeAuthHom
6cb0: 65 28 65 29 20 7b 0a 20 20 70 61 67 65 73 2e 73  e(e) {.  pages.s
6cc0: 65 74 41 63 74 69 76 65 28 70 61 67 65 73 2e 63  etActive(pages.c
6cd0: 72 65 61 74 65 28 70 61 67 65 73 2e 53 41 46 45  reate(pages.SAFE
6ce0: 5f 41 55 54 48 5f 44 45 46 41 55 4c 54 5f 55 52  _AUTH_DEFAULT_UR
6cf0: 4c 29 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  L)).}..function 
6d00: 6f 6e 43 6c 69 63 6b 43 61 6e 63 65 6c 20 28 65  onClickCancel (e
6d10: 29 20 7b 0a 20 20 76 61 72 20 70 61 67 65 20 3d  ) {.  var page =
6d20: 20 67 65 74 45 76 65 6e 74 50 61 67 65 28 65 29   getEventPage(e)
6d30: 0a 20 20 69 66 20 28 70 61 67 65 29 0a 20 20 20  .  if (page).   
6d40: 20 70 61 67 65 2e 73 74 6f 70 28 29 0a 7d 0a 0a   page.stop().}..
6d50: 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c 69 63 6b  function onClick
6d60: 42 6f 6f 6b 6d 61 72 6b 20 28 65 29 20 7b 0a 20  Bookmark (e) {. 
6d70: 20 76 61 72 20 70 61 67 65 20 3d 20 67 65 74 45   var page = getE
6d80: 76 65 6e 74 50 61 67 65 28 65 29 0a 20 20 69 66  ventPage(e).  if
6d90: 20 28 70 61 67 65 29 0a 20 20 20 20 70 61 67 65   (page).    page
6da0: 2e 74 6f 67 67 6c 65 42 6f 6f 6b 6d 61 72 6b 28  .toggleBookmark(
6db0: 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e  ).}..function on
6dc0: 43 6c 69 63 6b 56 69 65 77 46 69 6c 65 73 20 28  ClickViewFiles (
6dd0: 65 29 20 7b 0a 20 20 76 61 72 20 70 61 67 65 20  e) {.  var page 
6de0: 3d 20 67 65 74 45 76 65 6e 74 50 61 67 65 28 65  = getEventPage(e
6df0: 29 0a 20 20 69 66 20 28 70 61 67 65 29 20 7b 0a  ).  if (page) {.
6e00: 20 20 20 20 69 66 20 28 65 2e 6d 65 74 61 4b 65      if (e.metaKe
6e10: 79 20 7c 7c 20 65 2e 63 74 72 6c 4b 65 79 29 20  y || e.ctrlKey) 
6e20: 2f 2f 20 70 6f 70 75 70 0a 20 20 20 20 20 20 70  // popup.      p
6e30: 61 67 65 73 2e 73 65 74 41 63 74 69 76 65 28 70  ages.setActive(p
6e40: 61 67 65 73 2e 63 72 65 61 74 65 28 27 76 69 65  ages.create('vie
6e50: 77 2d 27 2b 70 61 67 65 2e 67 65 74 55 52 4c 28  w-'+page.getURL(
6e60: 29 29 29 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  ))).    else.   
6e70: 20 20 20 70 61 67 65 2e 6c 6f 61 64 55 52 4c 28     page.loadURL(
6e80: 27 76 69 65 77 2d 27 2b 70 61 67 65 2e 67 65 74  'view-'+page.get
6e90: 55 52 4c 28 29 29 20 2f 2f 20 67 6f 74 6f 0a 20  URL()) // goto. 
6ea0: 20 7d 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f   }.}..function o
6eb0: 6e 43 6c 69 63 6b 5a 6f 6f 6d 20 28 65 29 20 7b  nClickZoom (e) {
6ec0: 0a 20 20 63 6f 6e 73 74 20 7b 20 4d 65 6e 75 2c  .  const { Menu,
6ed0: 20 4d 65 6e 75 49 74 65 6d 20 7d 20 3d 20 72 65   MenuItem } = re
6ee0: 6d 6f 74 65 0a 20 20 76 61 72 20 6d 65 6e 75 20  mote.  var menu 
6ef0: 3d 20 4d 65 6e 75 2e 62 75 69 6c 64 46 72 6f 6d  = Menu.buildFrom
6f00: 54 65 6d 70 6c 61 74 65 28 5b 0a 20 20 20 20 7b  Template([.    {
6f10: 20 6c 61 62 65 6c 3a 20 27 52 65 73 65 74 20 5a   label: 'Reset Z
6f20: 6f 6f 6d 27 2c 20 63 6c 69 63 6b 3a 20 28 29 20  oom', click: () 
6f30: 3d 3e 20 7a 6f 6f 6d 2e 7a 6f 6f 6d 52 65 73 65  => zoom.zoomRese
6f40: 74 28 70 61 67 65 73 2e 67 65 74 41 63 74 69 76  t(pages.getActiv
6f50: 65 28 29 29 20 7d 2c 0a 20 20 20 20 7b 20 6c 61  e()) },.    { la
6f60: 62 65 6c 3a 20 27 5a 6f 6f 6d 20 49 6e 27 2c 20  bel: 'Zoom In', 
6f70: 63 6c 69 63 6b 3a 20 28 29 20 3d 3e 20 7a 6f 6f  click: () => zoo
6f80: 6d 2e 7a 6f 6f 6d 49 6e 28 70 61 67 65 73 2e 67  m.zoomIn(pages.g
6f90: 65 74 41 63 74 69 76 65 28 29 29 20 7d 2c 0a 20  etActive()) },. 
6fa0: 20 20 20 7b 20 6c 61 62 65 6c 3a 20 27 5a 6f 6f     { label: 'Zoo
6fb0: 6d 20 4f 75 74 27 2c 20 63 6c 69 63 6b 3a 20 28  m Out', click: (
6fc0: 29 20 3d 3e 20 7a 6f 6f 6d 2e 7a 6f 6f 6d 4f 75  ) => zoom.zoomOu
6fd0: 74 28 70 61 67 65 73 2e 67 65 74 41 63 74 69 76  t(pages.getActiv
6fe0: 65 28 29 29 20 7d 0a 20 20 5d 29 0a 20 20 6d 65  e()) }.  ]).  me
6ff0: 6e 75 2e 70 6f 70 75 70 28 72 65 6d 6f 74 65 2e  nu.popup(remote.
7000: 67 65 74 43 75 72 72 65 6e 74 57 69 6e 64 6f 77  getCurrentWindow
7010: 28 29 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20  ()).}..function 
7020: 6f 6e 46 6f 63 75 73 4c 6f 63 61 74 69 6f 6e 20  onFocusLocation 
7030: 28 65 29 20 7b 0a 20 20 76 61 72 20 70 61 67 65  (e) {.  var page
7040: 20 3d 20 67 65 74 45 76 65 6e 74 50 61 67 65 28   = getEventPage(
7050: 65 29 0a 20 20 69 66 20 28 70 61 67 65 29 0a 20  e).  if (page). 
7060: 20 20 20 70 61 67 65 2e 6e 61 76 62 61 72 45 6c     page.navbarEl
7070: 2e 71 75 65 72 79 53 65 6c 65 63 74 6f 72 28 27  .querySelector('
7080: 2e 6e 61 76 2d 6c 6f 63 61 74 69 6f 6e 2d 69 6e  .nav-location-in
7090: 70 75 74 27 29 2e 73 65 6c 65 63 74 28 29 0a 7d  put').select().}
70a0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 42 6c 75  ..function onBlu
70b0: 72 4c 6f 63 61 74 69 6f 6e 20 28 29 20 7b 0a 20  rLocation () {. 
70c0: 20 2f 2f 20 48 41 43 4b 0a 20 20 2f 2f 20 62 6c   // HACK.  // bl
70d0: 75 72 20 67 65 74 73 20 63 61 6c 6c 65 64 20 72  ur gets called r
70e0: 69 67 68 74 20 62 65 66 6f 72 65 20 74 68 65 20  ight before the 
70f0: 63 6c 69 63 6b 20 65 76 65 6e 74 20 66 6f 72 20  click event for 
7100: 6f 6e 43 6c 69 63 6b 41 75 74 6f 63 6f 6d 70 6c  onClickAutocompl
7110: 65 74 65 44 72 6f 70 64 6f 77 6e 0a 20 20 2f 2f  eteDropdown.  //
7120: 20 73 6f 2c 20 77 61 69 74 20 61 20 62 69 74 20   so, wait a bit 
7130: 62 65 66 6f 72 65 20 63 6c 65 61 72 69 6e 67 20  before clearing 
7140: 74 68 65 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65  the autocomplete
7150: 2c 20 73 6f 20 74 68 65 20 63 6c 69 63 6b 20 68  , so the click h
7160: 61 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 66  as a chance to f
7170: 69 72 65 0a 20 20 2f 2f 20 2d 70 72 66 0a 20 20  ire.  // -prf.  
7180: 73 65 74 54 69 6d 65 6f 75 74 28 63 6c 65 61 72  setTimeout(clear
7190: 41 75 74 6f 63 6f 6d 70 6c 65 74 65 2c 20 31 35  Autocomplete, 15
71a0: 30 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f  0).}..function o
71b0: 6e 49 6e 70 75 74 4c 6f 63 61 74 69 6f 6e 20 28  nInputLocation (
71c0: 65 29 20 7b 0a 20 20 76 61 72 20 76 61 6c 75 65  e) {.  var value
71d0: 20 3d 20 65 2e 74 61 72 67 65 74 2e 76 61 6c 75   = e.target.valu
71e0: 65 0a 0a 20 20 2f 2f 20 72 75 6e 20 61 75 74 6f  e..  // run auto
71f0: 63 6f 6d 70 6c 65 74 65 0a 20 20 2f 2f 20 54 4f  complete.  // TO
7200: 44 4f 20 64 65 62 6f 75 6e 63 65 0a 20 20 76 61  DO debounce.  va
7210: 72 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 56 61  r autocompleteVa
7220: 6c 75 65 20 3d 20 76 61 6c 75 65 2e 74 72 69 6d  lue = value.trim
7230: 28 29 0a 20 20 69 66 20 28 61 75 74 6f 63 6f 6d  ().  if (autocom
7240: 70 6c 65 74 65 56 61 6c 75 65 20 26 26 20 61 75  pleteValue && au
7250: 74 6f 63 6f 6d 70 6c 65 74 65 43 75 72 72 65 6e  tocompleteCurren
7260: 74 56 61 6c 75 65 20 21 3d 20 61 75 74 6f 63 6f  tValue != autoco
7270: 6d 70 6c 65 74 65 56 61 6c 75 65 29 20 7b 0a 20  mpleteValue) {. 
7280: 20 20 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 43     autocompleteC
7290: 75 72 72 65 6e 74 56 61 6c 75 65 20 3d 20 61 75  urrentValue = au
72a0: 74 6f 63 6f 6d 70 6c 65 74 65 56 61 6c 75 65 20  tocompleteValue 
72b0: 2f 2f 20 75 70 64 61 74 65 20 74 68 65 20 63 75  // update the cu
72c0: 72 72 65 6e 74 20 76 61 6c 75 65 0a 20 20 20 20  rrent value.    
72d0: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 43 75 72 72  autocompleteCurr
72e0: 65 6e 74 53 65 6c 65 63 74 69 6f 6e 20 3d 20 30  entSelection = 0
72f0: 20 2f 2f 20 72 65 73 65 74 20 74 68 65 20 73 65   // reset the se
7300: 6c 65 63 74 69 6f 6e 0a 20 20 20 20 62 65 61 6b  lection.    beak
7310: 65 72 48 69 73 74 6f 72 79 2e 73 65 61 72 63 68  erHistory.search
7320: 28 76 61 6c 75 65 29 2e 74 68 65 6e 28 68 61 6e  (value).then(han
7330: 64 6c 65 41 75 74 6f 63 6f 6d 70 6c 65 74 65 53  dleAutocompleteS
7340: 65 61 72 63 68 29 20 2f 2f 20 75 70 64 61 74 65  earch) // update
7350: 20 74 68 65 20 73 75 67 67 65 74 73 69 6f 6e 73   the suggetsions
7360: 0a 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 61  .  } else if (!a
7370: 75 74 6f 63 6f 6d 70 6c 65 74 65 56 61 6c 75 65  utocompleteValue
7380: 29 0a 20 20 20 20 63 6c 65 61 72 41 75 74 6f 63  ).    clearAutoc
7390: 6f 6d 70 6c 65 74 65 28 29 20 2f 2f 20 6e 6f 20  omplete() // no 
73a0: 76 61 6c 75 65 2c 20 63 61 6e 63 65 6c 20 6f 75  value, cancel ou
73b0: 74 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e  t.}..function on
73c0: 4b 65 79 64 6f 77 6e 4c 6f 63 61 74 69 6f 6e 20  KeydownLocation 
73d0: 28 65 29 20 7b 0a 20 20 2f 2f 20 6f 6e 20 65 6e  (e) {.  // on en
73e0: 74 65 72 0a 20 20 69 66 20 28 65 2e 6b 65 79 43  ter.  if (e.keyC
73f0: 6f 64 65 20 3d 3d 20 4b 45 59 43 4f 44 45 5f 45  ode == KEYCODE_E
7400: 4e 54 45 52 29 20 7b 0a 20 20 20 20 65 2e 70 72  NTER) {.    e.pr
7410: 65 76 65 6e 74 44 65 66 61 75 6c 74 28 29 0a 0a  eventDefault()..
7420: 20 20 20 20 76 61 72 20 70 61 67 65 20 3d 20 67      var page = g
7430: 65 74 45 76 65 6e 74 50 61 67 65 28 65 29 0a 20  etEventPage(e). 
7440: 20 20 20 69 66 20 28 70 61 67 65 29 20 7b 0a 20     if (page) {. 
7450: 20 20 20 20 20 76 61 72 20 73 65 6c 65 63 74 69       var selecti
7460: 6f 6e 20 3d 20 67 65 74 41 75 74 6f 63 6f 6d 70  on = getAutocomp
7470: 6c 65 74 65 53 65 6c 65 63 74 69 6f 6e 28 29 0a  leteSelection().
7480: 20 20 20 20 20 20 2f 2f 20 6c 6f 61 64 20 73 61        // load sa
7490: 66 65 61 75 74 68 20 70 61 67 65 0a 20 20 20 20  feauth page.    
74a0: 20 20 69 66 20 28 6e 65 77 20 55 52 4c 28 73 65    if (new URL(se
74b0: 6c 65 63 74 69 6f 6e 2e 75 72 6c 29 2e 70 72 6f  lection.url).pro
74c0: 74 6f 63 6f 6c 20 3d 3d 3d 20 70 61 67 65 73 2e  tocol === pages.
74d0: 53 41 46 45 5f 41 55 54 48 5f 53 43 48 45 4d 45  SAFE_AUTH_SCHEME
74e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
74f0: 70 61 67 65 73 2e 68 61 6e 64 6c 65 53 61 66 65  pages.handleSafe
7500: 41 75 74 68 53 63 68 65 6d 65 28 73 65 6c 65 63  AuthScheme(selec
7510: 74 69 6f 6e 2e 75 72 6c 29 29 20 7b 0a 20 20 20  tion.url)) {.   
7520: 20 20 20 20 20 20 20 65 2e 74 61 72 67 65 74 2e         e.target.
7530: 62 6c 75 72 28 29 0a 20 20 20 20 20 20 20 20 20  blur().         
7540: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 20 20   return.        
7550: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7560: 20 76 61 72 20 73 65 6c 65 63 74 69 6f 6e 55 72   var selectionUr
7570: 6c 20 3d 20 73 65 6c 65 63 74 69 6f 6e 2e 75 72  l = selection.ur
7580: 6c 0a 20 20 20 20 20 20 69 66 20 28 21 73 65 6c  l.      if (!sel
7590: 65 63 74 69 6f 6e 55 72 6c 2e 65 6e 64 73 57 69  ectionUrl.endsWi
75a0: 74 68 28 27 2f 27 29 20 26 26 20 21 70 61 74 68  th('/') && !path
75b0: 2e 65 78 74 6e 61 6d 65 28 73 65 6c 65 63 74 69  .extname(selecti
75c0: 6f 6e 55 72 6c 29 29 20 7b 0a 20 20 20 20 20 20  onUrl)) {.      
75d0: 20 20 73 65 6c 65 63 74 69 6f 6e 55 72 6c 20 3d    selectionUrl =
75e0: 20 73 65 6c 65 63 74 69 6f 6e 55 72 6c 2e 72 65   selectionUrl.re
75f0: 70 6c 61 63 65 28 2f 5c 2f 3f 28 5c 3f 7c 23 7c  place(/\/?(\?|#|
7600: 24 29 2f 2c 20 27 2f 24 31 27 29 3b 0a 20 20 20  $)/, '/$1');.   
7610: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 61 67 65     }..      page
7620: 2e 6c 6f 61 64 55 52 4c 28 73 65 6c 65 63 74 69  .loadURL(selecti
7630: 6f 6e 55 72 6c 2c 20 7b 20 69 73 47 75 65 73 73  onUrl, { isGuess
7640: 69 6e 67 54 68 65 53 63 68 65 6d 65 3a 20 73 65  ingTheScheme: se
7650: 6c 65 63 74 69 6f 6e 2e 69 73 47 75 65 73 73 69  lection.isGuessi
7660: 6e 67 54 68 65 53 63 68 65 6d 65 20 7d 29 0a 20  ngTheScheme }). 
7670: 20 20 20 20 20 65 2e 74 61 72 67 65 74 2e 62 6c       e.target.bl
7680: 75 72 28 29 0a 20 20 20 20 7d 0a 20 20 20 20 72  ur().    }.    r
7690: 65 74 75 72 6e 0a 20 20 7d 0a 0a 20 20 2f 2f 20  eturn.  }..  // 
76a0: 6f 6e 20 65 73 63 61 70 65 0a 20 20 69 66 20 28  on escape.  if (
76b0: 65 2e 6b 65 79 43 6f 64 65 20 3d 3d 20 4b 45 59  e.keyCode == KEY
76c0: 43 4f 44 45 5f 45 53 43 29 20 7b 0a 20 20 20 20  CODE_ESC) {.    
76d0: 76 61 72 20 70 61 67 65 20 3d 20 67 65 74 45 76  var page = getEv
76e0: 65 6e 74 50 61 67 65 28 65 29 0a 20 20 20 20 70  entPage(e).    p
76f0: 61 67 65 2e 6e 61 76 62 61 72 45 6c 2e 71 75 65  age.navbarEl.que
7700: 72 79 53 65 6c 65 63 74 6f 72 28 27 2e 6e 61 76  rySelector('.nav
7710: 2d 6c 6f 63 61 74 69 6f 6e 2d 69 6e 70 75 74 27  -location-input'
7720: 29 2e 76 61 6c 75 65 20 3d 20 70 61 67 65 2e 67  ).value = page.g
7730: 65 74 55 52 4c 28 29 0a 20 20 20 20 65 2e 74 61  etURL().    e.ta
7740: 72 67 65 74 2e 62 6c 75 72 28 29 0a 20 20 20 20  rget.blur().    
7750: 72 65 74 75 72 6e 0a 20 20 7d 0a 0a 20 20 2f 2f  return.  }..  //
7760: 20 6f 6e 20 6b 65 79 63 6f 64 65 20 6e 61 76 69   on keycode navi
7770: 67 61 74 69 6f 6e 73 0a 20 20 76 61 72 20 75 70  gations.  var up
7780: 20 20 20 3d 20 28 65 2e 6b 65 79 43 6f 64 65 20     = (e.keyCode 
7790: 3d 3d 20 4b 45 59 43 4f 44 45 5f 55 50 20 7c 7c  == KEYCODE_UP ||
77a0: 20 28 65 2e 63 74 72 6c 4b 65 79 20 26 26 20 65   (e.ctrlKey && e
77b0: 2e 6b 65 79 43 6f 64 65 20 3d 3d 20 4b 45 59 43  .keyCode == KEYC
77c0: 4f 44 45 5f 50 29 29 0a 20 20 76 61 72 20 64 6f  ODE_P)).  var do
77d0: 77 6e 20 3d 20 28 65 2e 6b 65 79 43 6f 64 65 20  wn = (e.keyCode 
77e0: 3d 3d 20 4b 45 59 43 4f 44 45 5f 44 4f 57 4e 20  == KEYCODE_DOWN 
77f0: 7c 7c 20 28 65 2e 63 74 72 6c 4b 65 79 20 26 26  || (e.ctrlKey &&
7800: 20 65 2e 6b 65 79 43 6f 64 65 20 3d 3d 20 4b 45   e.keyCode == KE
7810: 59 43 4f 44 45 5f 4e 29 29 0a 20 20 69 66 20 28  YCODE_N)).  if (
7820: 61 75 74 6f 63 6f 6d 70 6c 65 74 65 52 65 73 75  autocompleteResu
7830: 6c 74 73 20 26 26 20 28 75 70 20 7c 7c 20 64 6f  lts && (up || do
7840: 77 6e 29 29 20 7b 0a 20 20 20 20 65 2e 70 72 65  wn)) {.    e.pre
7850: 76 65 6e 74 44 65 66 61 75 6c 74 28 29 0a 20 20  ventDefault().  
7860: 20 20 69 66 20 28 75 70 20 26 26 20 61 75 74 6f    if (up && auto
7870: 63 6f 6d 70 6c 65 74 65 43 75 72 72 65 6e 74 53  completeCurrentS
7880: 65 6c 65 63 74 69 6f 6e 20 3e 20 30 29 0a 20 20  election > 0).  
7890: 20 20 20 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65      autocomplete
78a0: 43 75 72 72 65 6e 74 53 65 6c 65 63 74 69 6f 6e  CurrentSelection
78b0: 2d 2d 0a 20 20 20 20 69 66 20 28 64 6f 77 6e 20  --.    if (down 
78c0: 26 26 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 43  && autocompleteC
78d0: 75 72 72 65 6e 74 53 65 6c 65 63 74 69 6f 6e 20  urrentSelection 
78e0: 3c 20 61 75 74 6f 63 6f 6d 70 6c 65 74 65 52 65  < autocompleteRe
78f0: 73 75 6c 74 73 2e 6c 65 6e 67 74 68 20 2d 20 31  sults.length - 1
7900: 29 0a 20 20 20 20 20 20 61 75 74 6f 63 6f 6d 70  ).      autocomp
7910: 6c 65 74 65 43 75 72 72 65 6e 74 53 65 6c 65 63  leteCurrentSelec
7920: 74 69 6f 6e 2b 2b 0a 0a 20 20 20 20 2f 2f 20 72  tion++..    // r
7930: 65 2d 72 65 6e 64 65 72 20 61 6e 64 20 75 70 64  e-render and upd
7940: 61 74 65 20 74 68 65 20 75 72 6c 0a 20 20 20 20  ate the url.    
7950: 76 61 72 20 70 61 67 65 20 3d 20 67 65 74 45 76  var page = getEv
7960: 65 6e 74 50 61 67 65 28 65 29 0a 20 20 20 20 76  entPage(e).    v
7970: 61 72 20 6e 65 77 56 61 6c 75 65 20 3d 20 67 65  ar newValue = ge
7980: 74 41 75 74 6f 63 6f 6d 70 6c 65 74 65 53 65 6c  tAutocompleteSel
7990: 65 63 74 69 6f 6e 55 72 6c 28 61 75 74 6f 63 6f  ectionUrl(autoco
79a0: 6d 70 6c 65 74 65 43 75 72 72 65 6e 74 53 65 6c  mpleteCurrentSel
79b0: 65 63 74 69 6f 6e 29 0a 20 20 20 20 70 61 67 65  ection).    page
79c0: 2e 6e 61 76 62 61 72 45 6c 2e 71 75 65 72 79 53  .navbarEl.queryS
79d0: 65 6c 65 63 74 6f 72 28 27 2e 6e 61 76 2d 6c 6f  elector('.nav-lo
79e0: 63 61 74 69 6f 6e 2d 69 6e 70 75 74 27 29 2e 76  cation-input').v
79f0: 61 6c 75 65 20 3d 20 6e 65 77 56 61 6c 75 65 0a  alue = newValue.
7a00: 20 20 20 20 75 70 64 61 74 65 28 70 61 67 65 29      update(page)
7a10: 0a 20 20 20 20 72 65 74 75 72 6e 0a 20 20 7d 0a  .    return.  }.
7a20: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 6f 6e 43 6c  }..function onCl
7a30: 69 63 6b 41 75 74 6f 63 6f 6d 70 6c 65 74 65 44  ickAutocompleteD
7a40: 72 6f 70 64 6f 77 6e 20 28 65 29 20 7b 0a 20 20  ropdown (e) {.  
7a50: 2f 2f 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  // get the resul
7a60: 74 20 69 6e 64 65 78 0a 20 20 66 6f 72 20 28 76  t index.  for (v
7a70: 61 72 20 69 3d 30 3b 20 69 20 3c 20 65 2e 70 61  ar i=0; i < e.pa
7a80: 74 68 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b 29 20  th.length; i++) 
7a90: 7b 0a 20 20 20 20 69 66 20 28 65 2e 70 61 74 68  {.    if (e.path
7aa0: 5b 69 5d 2e 64 61 74 61 73 65 74 20 26 26 20 65  [i].dataset && e
7ab0: 2e 70 61 74 68 5b 69 5d 2e 63 6c 61 73 73 4c 69  .path[i].classLi
7ac0: 73 74 2e 63 6f 6e 74 61 69 6e 73 28 27 72 65 73  st.contains('res
7ad0: 75 6c 74 27 29 29 20 7b 0a 20 20 20 20 20 20 2f  ult')) {.      /
7ae0: 2f 20 66 6f 6c 6c 6f 77 20 72 65 73 75 6c 74 20  / follow result 
7af0: 75 72 6c 0a 20 20 20 20 20 20 76 61 72 20 72 65  url.      var re
7b00: 73 75 6c 74 49 6e 64 65 78 20 3d 20 2b 65 2e 70  sultIndex = +e.p
7b10: 61 74 68 5b 69 5d 2e 64 61 74 61 73 65 74 2e 72  ath[i].dataset.r
7b20: 65 73 75 6c 74 49 6e 64 65 78 0a 20 20 20 20 20  esultIndex.     
7b30: 20 70 61 67 65 73 2e 67 65 74 41 63 74 69 76 65   pages.getActive
7b40: 28 29 2e 6c 6f 61 64 55 52 4c 28 67 65 74 41 75  ().loadURL(getAu
7b50: 74 6f 63 6f 6d 70 6c 65 74 65 53 65 6c 65 63 74  tocompleteSelect
7b60: 69 6f 6e 55 72 6c 28 72 65 73 75 6c 74 49 6e 64  ionUrl(resultInd
7b70: 65 78 29 29 0a 20 20 20 20 20 20 72 65 74 75 72  ex)).      retur
7b80: 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 66  n.    }.  }.}..f
7b90: 75 6e 63 74 69 6f 6e 20 6f 6e 49 6e 70 75 74 46  unction onInputF
7ba0: 69 6e 64 20 28 65 29 20 7b 0a 20 20 76 61 72 20  ind (e) {.  var 
7bb0: 73 74 72 20 3d 20 65 2e 74 61 72 67 65 74 2e 76  str = e.target.v
7bc0: 61 6c 75 65 0a 20 20 76 61 72 20 70 61 67 65 20  alue.  var page 
7bd0: 3d 20 67 65 74 45 76 65 6e 74 50 61 67 65 28 65  = getEventPage(e
7be0: 29 0a 20 20 69 66 20 28 70 61 67 65 29 20 7b 0a  ).  if (page) {.
7bf0: 20 20 20 20 69 66 20 28 73 74 72 29 20 70 61 67      if (str) pag
7c00: 65 2e 66 69 6e 64 49 6e 50 61 67 65 28 73 74 72  e.findInPage(str
7c10: 29 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 70  ).    else     p
7c20: 61 67 65 2e 73 74 6f 70 46 69 6e 64 49 6e 50 61  age.stopFindInPa
7c30: 67 65 28 27 63 6c 65 61 72 53 65 6c 65 63 74 69  ge('clearSelecti
7c40: 6f 6e 27 29 0a 20 20 7d 0a 7d 0a 0a 66 75 6e 63  on').  }.}..func
7c50: 74 69 6f 6e 20 6f 6e 4b 65 79 64 6f 77 6e 46 69  tion onKeydownFi
7c60: 6e 64 20 28 65 29 20 7b 0a 20 20 2f 2f 20 6f 6e  nd (e) {.  // on
7c70: 20 65 73 63 61 70 65 0a 20 20 69 66 20 28 65 2e   escape.  if (e.
7c80: 6b 65 79 43 6f 64 65 20 3d 3d 20 4b 45 59 43 4f  keyCode == KEYCO
7c90: 44 45 5f 45 53 43 29 20 7b 0a 20 20 20 20 6c 65  DE_ESC) {.    le
7ca0: 74 20 70 61 67 65 20 3d 20 67 65 74 45 76 65 6e  t page = getEven
7cb0: 74 50 61 67 65 28 65 29 0a 20 20 20 20 69 66 20  tPage(e).    if 
7cc0: 28 70 61 67 65 29 0a 20 20 20 20 20 20 68 69 64  (page).      hid
7cd0: 65 49 6e 70 61 67 65 46 69 6e 64 28 70 61 67 65  eInpageFind(page
7ce0: 29 0a 20 20 7d 0a 0a 20 20 2f 2f 20 6f 6e 20 65  ).  }..  // on e
7cf0: 6e 74 65 72 0a 20 20 69 66 20 28 65 2e 6b 65 79  nter.  if (e.key
7d00: 43 6f 64 65 20 3d 3d 20 4b 45 59 43 4f 44 45 5f  Code == KEYCODE_
7d10: 45 4e 54 45 52 29 20 7b 0a 20 20 20 20 6c 65 74  ENTER) {.    let
7d20: 20 73 74 72 20 3d 20 65 2e 74 61 72 67 65 74 2e   str = e.target.
7d30: 76 61 6c 75 65 0a 20 20 20 20 6c 65 74 20 62 61  value.    let ba
7d40: 63 6b 77 61 72 64 73 20 3d 20 65 2e 73 68 69 66  ckwards = e.shif
7d50: 74 4b 65 79 20 2f 2f 20 73 65 61 72 63 68 20 62  tKey // search b
7d60: 61 63 6b 77 6f 72 64 73 20 6f 6e 20 73 68 69 66  ackwords on shif
7d70: 74 2b 65 6e 74 65 72 0a 20 20 20 20 6c 65 74 20  t+enter.    let 
7d80: 70 61 67 65 20 3d 20 67 65 74 45 76 65 6e 74 50  page = getEventP
7d90: 61 67 65 28 65 29 0a 20 20 20 20 69 66 20 28 70  age(e).    if (p
7da0: 61 67 65 29 20 7b 0a 20 20 20 20 20 20 69 66 20  age) {.      if 
7db0: 28 73 74 72 29 20 70 61 67 65 2e 66 69 6e 64 49  (str) page.findI
7dc0: 6e 50 61 67 65 28 73 74 72 2c 20 7b 20 66 69 6e  nPage(str, { fin
7dd0: 64 4e 65 78 74 3a 20 74 72 75 65 2c 20 66 6f 72  dNext: true, for
7de0: 77 61 72 64 3a 20 21 62 61 63 6b 77 61 72 64 73  ward: !backwards
7df0: 20 7d 29 0a 20 20 20 20 20 20 65 6c 73 65 20 20   }).      else  
7e00: 20 20 20 70 61 67 65 2e 73 74 6f 70 46 69 6e 64     page.stopFind
7e10: 49 6e 50 61 67 65 28 27 63 6c 65 61 72 53 65 6c  InPage('clearSel
7e20: 65 63 74 69 6f 6e 27 29 0a 20 20 20 20 7d 0a 20  ection').    }. 
7e30: 20 7d 0a 7d 0a                                    }.}.