{"version":3,"sources":["../../../libs/index.ts","../../../libs/footer/footer.module.scss","../../../libs/storage/use-storage.ts","../../../libs/footer/links/links.module.scss","app/app.module.scss","../../../libs/border/border.tsx","../../../libs/prefs/indent/indent.module.scss","app/view/tree/map/map.module.scss","../../../libs/about/about.module.scss","../../../libs/resize-div/resize-div.module.scss","../../../libs/debug/debug.ts","app/view/view.module.scss","app/view/tree/primitive.module.scss","app/view/tree/map/pipe.module.scss","../../../libs/about/about.tsx","../../../libs/use-editor/editor.module.scss","app/edit/toolbar/toolbar.module.scss","app/edit/edit.module.scss","app/view/tree/tree.module.scss","app/edit/toolbar/format/format.module.scss","../../../libs/resize-div/resize-div.tsx","../../../libs/storage/storage.ts","../../../libs/use-editor/editor.tsx","../../../libs/use-editor/use-editor.ts","../../../libs/footer/privacy/privacy.tsx","../../../libs/footer/links/version/service-worker.ts","../../../libs/footer/links/version/version.tsx","../../../libs/footer/links/links.tsx","../../../libs/footer/footer.tsx","../../../libs/prefs/theme/theme.tsx","../../../libs/prefs/indent/indent.tsx","../../../libs/about/logo.png","../../../libs/border/border.module.scss","../../../libs/footer/privacy/privacy.module.scss","../../../libs/footer/links/version/version.module.scss","app/edit/toolbar/save/save.module.scss","app/edit/toolbar/more/more.module.scss","app/view/toolbar/toolbar.module.scss","app/view/tree/map/more.module.scss","app/edit/toolbar/format/format.tsx","app/edit/toolbar/save/save.tsx","app/edit/toolbar/more/more.tsx","app/edit/toolbar/toolbar.tsx","app/edit/edit.tsx","app/view/toolbar/toolbar.tsx","app/view/tree/primitive.tsx","app/view/tree/map/pipe.tsx","app/view/tree/xml-options.ts","app/view/tree/map/more.tsx","app/view/tree/map/map.tsx","app/view/tree/node.tsx","app/view/tree/tree.tsx","app/view/view.tsx","app/sample.tsx","app/app.tsx","prefs/prefs.tsx","index.tsx"],"names":["module","exports","StorageContext","React","createContext","self","s","useStorage","key","fallback","parse","JSON","stringify","storage","useContext","Error","initial","useMemo","existed","getItem","e","state","useState","setItem","fn","bind","throttle","leading","value","useEffect","Border","props","className","borderColor","color","border","join","debugLog","message","Team","link","href","target","rel","Body","body","size","Logo","logo","alt","src","width","height","About","reverse","container","sDisable","disable","undefined","root","document","documentElement","maxX","clientWidth","ResizeDiv","setWidth","isDragging","setIsDragging","doDrag","useCallback","clientX","input","x","Math","min","max","normalizeX","stopDrag","classList","remove","removeEventListener","startDrag","add","addEventListener","drag","noDrag","onMouseDown","onDoubleClick","line","AppStorage","appID","this","localStorage","clear","Editor","editor","ref","refBody","params","statusVisible","status","refStatus","baseConfig","showInvisibles","displayIndentGuides","printMargin","keyboardHandler","wrap","useEditor","useRef","setEditor","current","config","_editor","ace","edit","StatusBar","element","textContent","focus","removeCommands","forEach","command","commands","removeCommand","onChange","listener","cb","getValue","on","off","addCommand","aceCommand","bindKey","name","exec","ops","setValue","navigateFileEnd","window","setTimeout","scrollToRow","Infinity","setIndent","indent","session","setUseSoftTabs","tab","setTabSize","refs","Privacy","dataText","isLocalhost","Boolean","location","hostname","match","register","navigator","URL","process","origin","swUrl","fetch","headers","then","response","contentType","get","indexOf","serviceWorker","ready","registration","unregister","reload","registerValidSW","console","log","checkValidServiceWorker","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","error","Version","enabled","outdated","setOutdated","update","waiting","postMessage","type","forceUpdate","content","onClick","TPLink","Links","offlineMode","tptop","space","tpbot","nobreak","Footer","privacy","grow","links","about","defaultProps","themeOptions","label","html","useTheme","theme","setTheme","ThemeSelect","options","getIndentString","kind","repeat","custom","useIndent","setKind","kindOptions","widthOptions","IndentSelect","fullWidth","full","auto","isApple","platform","startsWith","Shortcut","icon","path","style","Format","format","highlight","blobOptions","targets","disabled","SaveMenu","clipboard","alert","blob","Blob","FileSaver","saveAs","MorePane","prefs","DesktopToolbar","uglify","desktop","MobileToolbar","moreVis","setMoreVis","mobile","primary","selected","Toolbar","workerUrl","require","setModuleUrl","xmlParser","xml2js","explicitArray","xmlFormat","a","parseStringPromise","obj","builder","renderOpts","pretty","buildObject","getEditorIndent","Edit","mode","editorOnChange","editorAddCommand","editorGetValue","editorSetValue","editorSetIndent","propsSetValue","next","mac","win","toolbar","background","secondary","getCls","PrimitiveNode","node","toString","getString","Hor","hor","Ver","last","verLast","verMid","Pipe","pipe","XML_OPTIONS","attrkey","charkey","xmlBuilder","MoreButton","setFoo","copy","snode","_node","_name","nameNum","Number","isNaN","Array","isArray","sanitize","text","expand","collapse","more","sMap","ToggleButton","setExpand","children","toggle","renderItem","item","index","arr","length","FooContext","MapNode","items","foo","fooContext","Provider","map","ObjectNode","Object","keys","ArrayNode","parentName","NodeBody","includes","Node","parseXML","setError","setNode","ErrorMsg","role","aria-label","Tree","useNode","View","tree","samples","floor","random","App","usePrefs","flexGrow","resize","view","app","scrollbar","footer","ReactDOM","render","StrictMode","getElementById"],"mappings":"uHAAA,k3B,sBCCAA,EAAOC,QAAU,CAAC,UAAY,0BAA0B,KAAO,qBAAqB,KAAO,qBAAqB,MAAQ,sBAAsB,MAAQ,wB,8ICIzIC,EAAiBC,IAAMC,cAAiC,MAE/DC,EAAO,SAACC,GAAD,OAAuBA,GAEvBC,EAAa,SAAIC,EAAaC,GACvC,IAAMC,EAA4B,kBAAbD,EAAwBJ,EAAOM,KAAKD,MACnDE,EAAgC,kBAAbH,EAAwBJ,EAAOM,KAAKC,UAEvDC,EAAUV,IAAMW,WAAWZ,GACjC,GAAgB,OAAZW,EAAkB,MAAME,MAAM,6BAGlC,IAAMC,EAAab,IAAMc,SAAQ,WAC7B,IAAMC,EAAUL,EAAQM,QAAQX,GAChC,GAAgB,OAAZU,EAAkB,OAAOT,EAC7B,IACI,OAAOC,EAAMQ,GACf,MAAOE,GACL,OAAOX,KAEZ,CAACD,EAAKC,EAAUC,IACbW,EAAQlB,IAAMmB,SAASN,GAGvBO,EAAUpB,IAAMc,SAAQ,WAC1B,IAAMO,EAAKX,EAAQU,QAAQE,KAAKZ,GAChC,OAAOa,IAASF,EAAI,IAAM,CAAEG,SAAS,MACtC,CAACd,IACGe,EAxBgD,YAwBvCP,EAxBuC,MA8BvD,OALAlB,IAAM0B,WAAU,WACZN,EAAQf,EAAKI,EAAUgB,MACxB,CAACpB,EAAKoB,EAAOhB,EAAWW,IAGpBF,I,gBCtCXrB,EAAOC,QAAU,CAAC,UAAY,yBAAyB,MAAQ,qBAAqB,MAAQ,qBAAqB,QAAU,uBAAuB,MAAQ,uB,gBCA1JD,EAAOC,QAAU,CAAC,IAAM,iBAAiB,OAAS,oBAAoB,KAAO,kBAAkB,KAAO,kBAAkB,OAAS,oBAAoB,KAAO,kBAAkB,KAAO,oB,8BCDrL,8EASa6B,EAAS,SAACC,GACnB,OAAO,yBAAKC,UAAW,CAACC,IAAYF,EAAMG,OAAQ5B,IAAE6B,QAAQC,KAAK,S,iBCTrEpC,EAAOC,QAAU,CAAC,UAAY,0BAA0B,KAAO,qBAAqB,KAAO,qBAAqB,MAAQ,sBAAsB,OAAS,uBAAuB,KAAO,uB,oBCArLD,EAAOC,QAAU,CAAC,KAAO,kBAAkB,OAAS,oBAAoB,KAAO,oB,gBCA/ED,EAAOC,QAAU,CAAC,QAAU,uBAAuB,UAAY,yBAAyB,KAAO,oBAAoB,KAAO,oBAAoB,KAAO,sB,gBCArJD,EAAOC,QAAU,CAAC,UAAY,8BAA8B,KAAO,yBAAyB,OAAS,2BAA2B,KAAO,yBAAyB,QAAU,8B,8ECC7JoC,EAAW,SAACC,M,iBCDzBtC,EAAOC,QAAU,CAAC,UAAY,wBAAwB,KAAO,mBAAmB,KAAO,mBAAmB,QAAU,wB,gBCApHD,EAAOC,QAAU,CAAC,UAAY,6BAA6B,OAAS,0BAA0B,OAAS,0BAA0B,KAAO,wBAAwB,QAAU,6B,gBCA1KD,EAAOC,QAAU,CAAC,KAAO,mBAAmB,QAAU,sBAAsB,OAAS,qBAAqB,IAAM,oB,mCCDhH,+FAMMsC,EAAO,kBACT,uBACIP,UAAW1B,IAAEkC,KACbC,KAAK,wBACLC,OAAO,SACPC,IAAI,uBAJR,mBAUEC,EAAO,kBACT,yBAAKZ,UAAW1B,IAAEuC,MACd,yDACA,kBAAC,IAAD,CAAOC,KAAM,IACb,6BACI,qCACA,kBAACP,EAAD,SAKNQ,EAAO,kBACT,uBACIf,UAAW1B,IAAE0C,KACbP,KAAK,wBACLC,OAAO,SACPC,IAAI,uBAEJ,yBAAKM,IAAI,iBAAiBC,IAAKF,IAAMG,MAAM,OAAOC,OAAQ,OAQrDC,EAAyB,SAAC,GAAD,IAAGC,EAAH,EAAGA,QAAH,OAClC,yBAAKtB,UAAWsB,EAAUhD,IAAEgD,QAAU,IAClC,yBAAKtB,UAAW1B,IAAEiD,WACd,kBAACX,EAAD,MACA,kBAAC,IAAD,CAAOE,KAAM,KACb,kBAACC,EAAD,U,mBC/CZ/C,EAAOC,QAAU,CAAC,UAAY,0BAA0B,KAAO,qBAAqB,OAAS,yB,gBCA7FD,EAAOC,QAAU,CAAC,QAAU,yBAAyB,OAAS,wBAAwB,QAAU,2B,gBCAhGD,EAAOC,QAAU,CAAC,UAAY,wBAAwB,OAAS,qBAAqB,QAAU,wB,gBCA9FD,EAAOC,QAAU,CAAC,UAAY,wBAAwB,KAAO,mBAAmB,MAAQ,sB,mCCAxFD,EAAOC,QAAU,CAAC,KAAO,qBAAqB,MAAQ,sBAAsB,KAAO,uB,2ICG7EuD,EAAWlD,IAAEmD,QACnB,QAAiBC,IAAbF,EAAwB,MAAMzC,MAAM,gCAExC,IAAM4C,EAAOC,SAASC,gBAChBC,EAAOH,EAAKI,YAAc,IAcnBC,EAA6B,SAAC,GAAkB,IAAhBC,EAAe,EAAfA,SAAe,EACpB9D,IAAMmB,UAAS,GADK,mBACjD4C,EADiD,KACrCC,EADqC,KAGlDC,EAASjE,IAAMkE,aACjB,SAACjD,GACG,IAAMkD,EAhBC,SAACC,GAChB,IAAIC,EAAID,EAGR,OAFAC,EAAIC,KAAKC,IAAIF,EAAGV,GAChBU,EAAIC,KAAKE,IAAIH,EALJ,KAkBeI,CAAWxD,EAAEkD,SAC7BL,EAASK,EAAUX,EAAKI,eAE5B,CAACE,IAGCY,EAAW1E,IAAMkE,aAAY,WAC/BV,EAAKmB,UAAUC,OAAOvB,GACtBG,EAAKqB,oBAAoB,YAAaZ,GACtCT,EAAKqB,oBAAoB,UAAWH,GACpCV,GAAc,KACf,CAACC,EAAQH,IAENgB,EAAY9E,IAAMkE,aAAY,WAChCV,EAAKmB,UAAUI,IAAI1B,GACnBG,EAAKwB,iBAAiB,YAAaf,GACnCT,EAAKwB,iBAAiB,UAAWN,GACjCV,GAAc,KACf,CAACC,EAAQS,IAEZ,OACI,yBACI7C,UAAS,UAAK1B,IAAEiD,UAAP,YAAoBW,EAAa5D,IAAE8E,KAAO9E,IAAE+E,QACrDC,YAAaL,EACbM,cAAe,kBAAMtB,EAAS,MAE9B,yBAAKjC,UAAW1B,IAAEkF,U,2KCnDvB,IAAMC,EAAb,WAEI,WAAYC,GAAgB,yBAD5BA,WAC2B,EACvBC,KAAKD,MAAQA,EAHrB,oDAMQ,OAAOE,aAAaC,UAN5B,8BAQYrF,GAEJ,OADA6B,YAAS,cAAe7B,GACjBoF,aAAazE,QAAb,UAAwBwE,KAAKD,MAA7B,YAAsClF,MAVrD,8BAYYA,EAAaoB,GAEjB,OADAS,YAAS,cAAe7B,GACjBoF,aAAarE,QAAb,UAAwBoE,KAAKD,MAA7B,YAAsClF,GAAOoB,OAd5D,M,6CCFA,sFAWakE,EAA0B,SAAC,GAAD,IAAGC,EAAH,EAAGA,OAAH,OACnC,yBAAK/D,UAAW1B,IAAEiD,WACd,yBAAKvB,UAAW1B,IAAEuC,MACd,yBAAKmD,IAAKD,EAAOE,WAEpBF,EAAOG,OAAOC,eACX,oCACI,kBAAC,IAAD,CAAQjE,MAAM,WACd,kBAAC,IAAD,CAAOY,KAAM,IACb,yBAAKd,UAAW1B,IAAE8F,QACd,kBAAC,IAAD,KACI,yBAAKJ,IAAKD,EAAOM,cAGzB,kBAAC,IAAD,CAAOvD,KAAM,Q,iJCuBvBwD,G,OAA6C,CAC/CC,gBAAgB,EAChBC,qBAAqB,EACrBC,aAAa,EACbC,gBAAiB,uBACjBC,MAAM,IAGGC,EAAuB,SAACV,GACjC,IAAMD,EAAU9F,IAAM0G,OAAuB,MACvCR,EAAYlG,IAAM0G,OAAuB,MAFH,EAGhB1G,IAAMmB,SAAgC,MAHtB,mBAGrCyE,EAHqC,KAG7Be,EAH6B,KAM5C3G,IAAM0B,WAAU,WACZ,GAAe,OAAXkE,EAAJ,CAEA,GAAwB,OAApBE,EAAQc,QAAkB,MAAMhG,MAAM,wBAC1C,IAAMiG,EAAM,2BAAQV,GAAeJ,EAAOc,QACpCC,EAAUC,IAAIC,KAAKlB,EAAQc,QAASC,GAE1C,GAAId,EAAOC,cAAe,CAEtB,GAAkB,OADAE,EAAUU,QACJ,MAAMhG,MAAM,yBAClB,IAAIqG,YAAUH,EAASZ,EAAUU,SACzCM,QAAQC,YAAc,MAGpCL,EAAQM,QACRT,EAAUG,MACX,CAAClB,EAAQG,EAAOc,SAEnB7G,IAAM0B,WAAU,WACG,OAAXkE,GACJG,EAAOsB,eAAeC,SAAQ,SAACC,GAE3B3B,EAAO4B,SAASC,cAAcF,QAEnC,CAAC3B,EAAQG,EAAOsB,iBAGnB,IAAMK,EAAqB1H,IAAMkE,aAC7B,SAACyD,GACG,GAAe,OAAX/B,EAAiB,OAAO,aAC5B,IAAMgC,EAAK,kBAAMD,EAAS,CAAElG,MAAOmE,EAAOiC,cAE1C,OADAjC,EAAOkC,GAAG,SAAUF,GACb,kBAAMhC,EAAOmC,IAAI,SAAUH,MAEtC,CAAChC,IAGCoC,EAAyBhI,IAAMkE,aACjC,SAACqD,GACG,GAAe,OAAX3B,EAAiB,OAAO,aAC5B,IAAMqC,EAA8B,CAChCC,QAASX,EAAQlH,IACjB8H,KAAMZ,EAAQY,KACdC,KAAMb,EAAQlG,IAGlB,OADAuE,EAAO4B,SAASQ,WAAWC,GACpB,kBAAMrC,EAAO4B,SAASC,cAAcQ,MAE/C,CAACrC,IA0BCyC,EAAM,CAAER,SAvBG7H,IAAMkE,aAAY,WAAO,IAAD,EACrC,wBAAO0B,QAAP,IAAOA,OAAP,EAAOA,EAAQiC,kBAAf,QAA6B,OAC9B,CAACjC,IAqBoB0C,SAnBPtI,IAAMkE,aACnB,SAACzC,GACkB,OAAXmE,IACJA,EAAO0C,SAAS7G,GAChBmE,EAAO2C,kBACPC,OAAOC,YAAW,kBAAM7C,EAAO8C,YAAYC,OAAW,MAE1D,CAAC/C,IAY6BgD,UAThB5I,IAAMkE,aACpB,SAAC2E,GACkB,OAAXjD,IACJA,EAAOkD,QAAQC,gBAAgBF,EAAOG,KACtCpD,EAAOkD,QAAQG,WAAWJ,EAAO7F,UAErC,CAAC4C,IAGwC8B,WAAUM,cACjDkB,EAAO,CAAEpD,UAASI,aACxB,OAAO,yBAAEH,UAAWsC,GAAQa,K,kKCjInBC,EAA2B,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAH,OACpC,yBAAKvH,UAAW1B,IAAEiD,WACd,kBAAC,IAAD,KACI,kBAAC,IAAD,kCACA,iDACqBgG,EADrB,iE,yCCDNC,EAAcC,QACa,cAA7Bd,OAAOe,SAASC,UAEiB,UAA7BhB,OAAOe,SAASC,UAEhBhB,OAAOe,SAASC,SAASC,MACrB,2DASL,SAASC,EAAS7C,GACrB,GAA6C,kBAAmB8C,UAAW,CAGvE,GADkB,IAAIC,IAAIC,OAAwBrB,OAAOe,SAASjH,MACpDwH,SAAWtB,OAAOe,SAASO,OAIrC,OAGJtB,OAAOxD,iBAAiB,QAAQ,WAC5B,IAAM+E,EAAK,UAAMF,OAAN,sBAEPR,IAgEhB,SAAiCU,EAAelD,GAE5CmD,MAAMD,EAAO,CACTE,QAAS,CAAE,iBAAkB,YAE5BC,MAAK,SAACC,GAEH,IAAMC,EAAcD,EAASF,QAAQI,IAAI,gBAEjB,MAApBF,EAASlE,QACO,MAAfmE,IAC0C,IAAvCA,EAAYE,QAAQ,cAGxBX,UAAUY,cAAcC,MAAMN,MAAK,SAACO,GAChCA,EAAaC,aAAaR,MAAK,WAC3B1B,OAAOe,SAASoB,eAKxBC,EAAgBb,EAAOlD,MAnBnC,OAsBW,WACHgE,QAAQC,IACJ,oEAxFAC,CAAwBhB,EAAOlD,GAI/B8C,UAAUY,cAAcC,MAAMN,MAAK,WAC/BW,QAAQC,IACJ,iHAMRF,EAAgBb,EAAOlD,OAMvC,SAAS+D,EAAgBb,EAAelD,GACpC8C,UAAUY,cACLb,SAASK,GACTG,MAAK,SAACO,GACHA,EAAaO,cAAgB,WACzB,IAAMC,EAAmBR,EAAaS,WACd,MAApBD,IAGJA,EAAiBE,cAAgB,WACE,cAA3BF,EAAiB/J,QACbyI,UAAUY,cAAca,YAIxBP,QAAQC,IACJ,iHAKAjE,GAAUA,EAAOwE,UACjBxE,EAAOwE,SAASZ,KAMpBI,QAAQC,IAAI,sCAGRjE,GAAUA,EAAOyE,WACjBzE,EAAOyE,UAAUb,WA/B7C,OAsCW,SAACc,GACJV,QAAQU,MAAM,4CAA6CA,MC9FvE,IAcaC,EAAU,SAAC,GAAwB,IAAtBC,EAAqB,EAArBA,QAAqB,EACXzL,IAAMmB,UAAS,GADJ,mBACpCuK,EADoC,KAC1BC,EAD0B,KAErCC,EAAS5L,IAAM0G,QAAmB,eAexC,OAbA1G,IAAM0B,WAAU,YACI,IAAZ+J,ED+GJ,kBAAmB9B,WACnBA,UAAUY,cAAcC,MACnBN,MAAK,SAACO,GACHA,EAAaC,gBAFrB,OAIW,SAACa,GACJV,QAAQU,MAAMA,EAAMpJ,YClHxBuH,EAAS,CACL2B,SAAU,SAACZ,GACPmB,EAAOhF,QAAU,kBArBjB,SAAC6D,GACjBI,QAAQC,IAAI,WAAYL,GACnBA,GAAiBA,EAAaoB,UACnCpB,EAAaoB,QAAQC,YAAY,CAAEC,KAAM,iBACzCvD,OAAOe,SAASoB,UAiBuBqB,CAAYvB,IACnCkB,GAAY,QAIzB,CAACF,IAECC,EAGD,8BACI,kBAAC,IAAD,MACA,kBAAC,IAAD,CAAKO,QApCR,wFAqCO,4BAAQC,QAASN,EAAOhF,QAAS/E,UAAW1B,IAAEyL,QAA9C,6BANU,MChCpBO,EAAS,kBACX,8BACI,4CACA,uBACI5J,OAAO,SACPC,IAAI,sBACJF,KAAK,yBAHT,oBAcK8J,EAAQ,SAACxK,GAAD,OACjB,kBAAC,IAAD,KACI,yBAAKC,UAAW1B,IAAEiD,WACd,kBAAC,IAAD,KACI,uBAAGd,KAAK,6BAAR,YACA,kBAAC,IAAD,MACA,uBACIE,IAAI,sBACJF,KAAK,wCAFT,iBAOA,kBAAC,EAAD,CAASmJ,QAAS7J,EAAMyK,cACxB,0BAAMxK,UAAW1B,IAAEmM,OACf,kBAAC,IAAD,MACA,kBAAC,EAAD,QAGR,yBAAKzK,UAAW1B,IAAEoM,OACd,kBAAC,IAAD,CAAO5J,KAAM,MAEjB,kBAAC,IAAD,KACI,0BAAMd,UAAW1B,IAAEqM,OACf,kBAAC,EAAD,OAEJ,mCACA,0BAAM3K,UAAW1B,IAAEsM,SAAnB,gCACA,mCACA,0BAAM5K,UAAW1B,IAAEsM,SAAnB,sBACA,mCACA,0BAAM5K,UAAW1B,IAAEsM,SAAnB,2B,iCCxCHC,EAAS,SAAC,GAAD,IAAGtD,EAAH,EAAGA,SAAUiD,EAAb,EAAaA,YAAb,OAClB,yBAAKxK,UAAW1B,IAAEiD,WACd,yBAAKvB,UAAW1B,IAAEoM,QAClB,yBAAK1K,UAAW1B,IAAEwM,SACd,kBAAC,EAAD,CAASvD,SAAUA,KAEvB,yBAAKvH,UAAW1B,IAAEyM,OAClB,yBAAK/K,UAAW1B,IAAEkF,MACd,kBAAC,IAAD,CAAO1C,KAAM,KADjB,IACwB,kBAAC,IAAD,CAAQZ,MAAM,WADtC,IACkD,kBAAC,IAAD,CAAOY,KAAM,MAE/D,yBAAKd,UAAW1B,IAAE0M,OACd,kBAAC,EAAD,CAAOR,YAAaA,KAExB,yBAAKxK,UAAW1B,IAAEkF,MACd,kBAAC,IAAD,CAAO1C,KAAM,KADjB,IACwB,kBAAC,IAAD,CAAQZ,MAAM,WADtC,IACkD,kBAAC,IAAD,CAAOY,KAAM,MAE/D,yBAAKd,UAAW1B,IAAE2M,OACd,kBAAC,IAAD,CAAO3J,SAAO,OAK1BuJ,EAAOK,aAAe,CAClBV,aAAa,I,iPC5BJW,EAAe,CACxB,CAAEC,MAAO,QAASxL,MAAO,eACzB,CAAEwL,MAAO,OAAQxL,MAAO,cACxB,CAAEwL,MAAO,SAAUxL,MAAO,eAGxByL,EAAOzJ,SAASC,gBAETyJ,EAAW,WAAO,IAAD,EACA/M,YAAW,aAAc,cADzB,mBACnBqB,EADmB,KACZ6G,EADY,KAQ1B,OALAtI,IAAM0B,WAAU,WAEZ,OADAwL,EAAKvI,UAAUI,IAAItD,GACZ,kBAAMyL,EAAKvI,UAAUC,OAAOnD,MACpC,CAACA,IAEG,CAAE2L,MAAO3L,EAAO4L,SAAU/E,IAQxBgF,EAA+B,SAAC,GAAD,IAAGF,EAAH,EAAGA,MAAOC,EAAV,EAAUA,SAAV,OACxC,kBAAC,IAAD,CAAU5L,MAAO2L,EAAO9E,SAAU+E,EAAUE,QAASP,K,iBCd5CQ,EAAkB,SAAC3E,GAAoB,IAAD,EAC/C,MAAoB,QAAhBA,EAAO4E,KAAuB,KAC3B,IAAIC,OAAJ,UAAW7E,EAAO7F,aAAlB,QAA2B6F,EAAO8E,SAQhCC,EAAY,WAAoB,IAAD,EAChBxN,YAAW,mBAAoB,OADf,mBACjCqN,EADiC,KAC3BI,EAD2B,OAEdzN,YAA0B,oBAAqB,GAFjC,mBAEjC4C,EAFiC,KAE1Bc,EAF0B,OAGZ1D,YAAW,qBAAsB,GAHrB,mBAKxC,MAAO,CACHyI,OAAQ,CAAE4E,OAAMzK,QAAO2K,OANa,MAOpC/E,UAAW,CAAE6E,KAAMI,EAAS7K,MAAOc,EAAU6J,OAPT,QAetCG,EAAsC,CACxC,CAAErM,MAAO,MAAOwL,MAAO,QACvB,CAAExL,MAAO,QAASwL,MAAO,WAGvBc,EAA8C,CAChD,CAAEtM,MAAO,EAAGwL,MAAO,YACnB,CAAExL,MAAO,EAAGwL,MAAO,YACnB,CAAExL,MAAO,EAAGwL,MAAO,YACnB,CAAExL,MAAO,KAAMwL,MAAO,WAGbe,EAAgC,SAAC,GAAD,IACzCC,EADyC,EACzCA,UACApF,EAFyC,EAEzCA,OACAD,EAHyC,EAGzCA,UAHyC,OAKzC,yBAAK/G,UAAS,UAAK1B,IAAEiD,UAAP,YAAoB6K,EAAY9N,IAAE+N,KAAO/N,IAAEgO,OACrD,yBAAKtM,UAAW1B,IAAEsN,MACd,kBAAC,IAAD,CACIhM,MAAOoH,EAAO4E,KACdnF,SAAUM,EAAU6E,KACpBF,QAASO,EACTG,WAAS,KAGjB,kBAAC,IAAD,CAAOtL,KAAM,IACb,yBAAKd,UAAW1B,IAAE6C,OACd,kBAAC,IAAD,CACIvB,MAAOoH,EAAO7F,MACdsF,SAAUM,EAAU5F,MACpBuK,QAASQ,EACTE,WAAS,KAGC,OAAjBpF,EAAO7F,OACJ,oCACI,kBAAC,IAAD,CAAOL,KAAM,IACb,yBAAKd,UAAW1B,IAAEwN,QACd,kBAAC,IAAD,CACI5B,KAAK,SACLtK,MAAOoH,EAAO8E,OACdrF,SAAUM,EAAU+E,OACpBM,WAAS,S,cCxFjCpO,EAAOC,QAAU,8uN,gBCCjBD,EAAOC,QAAU,CAAC,OAAS,yB,gBCA3BD,EAAOC,QAAU,CAAC,UAAY,6B,gBCA9BD,EAAOC,QAAU,CAAC,OAAS,0B,sBCA3BD,EAAOC,QAAU,CAAC,UAAY,0B,gBCA9BD,EAAOC,QAAU,CAAC,QAAU,wB,gBCA5BD,EAAOC,QAAU,CAAC,QAAU,yBAAyB,MAAQ,yB,kCCA7DD,EAAOC,QAAU,CAAC,KAAO,qB,kSCWnBsO,EACFzE,UAAU0E,WACT1E,UAAU0E,SAASC,WAAW,QAC3B3E,UAAU0E,SAASC,WAAW,SAC9B3E,UAAU0E,SAASC,WAAW,WAEhCC,EAAW,kBACb,0BAAM1M,UAAW1B,IAAEqO,MACf,kBAAC,IAAD,CAAMC,KAAML,EAdhB,maAEA,oJAaI,0BAAMM,MAAO,CAAE1L,MAAO,KACtB,kBAAC,IAAD,CAAMyL,KAZV,wOAoBSE,EAA0B,SAAC,GAAD,IAAGC,EAAH,EAAGA,OAAH,OACnC,kBAAC,IAAD,CAAQC,WAAS,EAAC3C,QAAS0C,GACvB,0BAAM/M,UAAW1B,IAAE8M,OACf,wCACA,kBAAC,EAAD,S,6DCtBN6B,EAA+B,CACjC/C,KAAM,0BAGJgD,EAAkC,CACpC,CAAEtN,MAAO,OAAQwL,MAAO,OAAQ+B,UAAU,GAC1C,CAAEvN,MAAO,YAAawL,MAAO,qBAC7B,CAAExL,MAAO,OAAQwL,MAAO,qBAGfgC,EAA4B,SAAC,GAAkB,IAAhBpH,EAAe,EAAfA,SAkBxC,OACI,yBAAKhG,UAAW1B,IAAEiD,WACd,kBAAC,IAAD,CACI6K,WAAS,EACTxM,MAAM,OACN6G,SAtBM,SAAC/F,GACf,IAAMd,EAAQoG,KAAc,GAC5B,OAAQtF,GACJ,IAAK,YACD2M,IAAoBzN,GAApB,OAAiC,SAACR,GAC9BuH,OAAO2G,MAAP,uBAA6BlO,EAAEkB,aAEnC,MACJ,IAAK,OACD,IAAMiN,EAAO,IAAIC,KAAK,CAAC5N,GAAQqN,GAC/BQ,IAAUC,OAAOH,EAAM,gBACvB,MACJ,IAAK,OACD,MAAMxO,MAAM,6BAUZ2M,QAASwB,M,kBChCZS,EAA4B,SAAC5N,GAAW,IACzC6N,EAAoB7N,EAApB6N,MAAO5H,EAAajG,EAAbiG,SACPgB,EAAuC4G,EAAvC5G,OAAQD,EAA+B6G,EAA/B7G,UAAWwE,EAAoBqC,EAApBrC,MAAOC,EAAaoC,EAAbpC,SAClC,OACI,yBAAKxL,UAAW1B,IAAEiD,WACd,kBAAC,IAAD,CAAOT,KAAM,KACb,kBAAC,EAAD,CAAUkF,SAAUA,IACpB,kBAAC,IAAD,CAAOlF,KAAM,KACb,kBAAC,SAAD,CAAQZ,MAAM,WACd,kBAAC,IAAD,CAAOY,KAAM,KACb,kBAAC,eAAD,CAAcsL,WAAS,EAACpF,OAAQA,EAAQD,UAAWA,IACnD,kBAAC,IAAD,CAAOjG,KAAM,KACb,kBAAC,cAAD,CAAayK,MAAOA,EAAOC,SAAUA,MCN3CqC,EAAkC,SAAC9N,GAAW,IACxCgN,EAAoChN,EAApCgN,OAAQe,EAA4B/N,EAA5B+N,OAAQ9H,EAAoBjG,EAApBiG,SAAU4H,EAAU7N,EAAV6N,MAC1B5G,EAAsB4G,EAAtB5G,OAAQD,EAAc6G,EAAd7G,UAChB,OACI,yBAAK/G,UAAW1B,IAAEyP,SACd,kBAAC,EAAD,CAAQhB,OAAQA,IAChB,kBAAC,IAAD,CAAOjM,KAAM,KACb,kBAAC,IAAD,CAAQuJ,QAASyD,GAAjB,UACA,kBAAC,IAAD,CAAOhN,KAAM,KACb,kBAAC,EAAD,CAAUkF,SAAUA,IACpB,kBAAC,IAAD,MACA,kBAAC,eAAD,CAAcgB,OAAQA,EAAQD,UAAWA,MAK/CiH,EAAiC,SAACjO,GAAW,IACvCgN,EAAoChN,EAApCgN,OAAQe,EAA4B/N,EAA5B+N,OAAQ9H,EAAoBjG,EAApBiG,SAAU4H,EAAU7N,EAAV6N,MADY,EAEhBzP,IAAMmB,UAAS,GAFC,mBAEvC2O,EAFuC,KAE9BC,EAF8B,KAG9C,OACI,yBAAKlO,UAAW1B,IAAE6P,QACd,yBAAKnO,UAAW1B,IAAE8P,SACd,kBAAC,EAAD,CAAQrB,OAAQA,IAChB,kBAAC,IAAD,CAAOjM,KAAM,KACb,kBAAC,IAAD,CAAQuJ,QAASyD,GAAjB,UACA,kBAAC,IAAD,MACA,kBAAC,IAAD,CACIO,SAAUJ,EACV5D,QAAS,kBAAM6D,GAAYD,IAC3BtB,KA/BhB,0GAkCSsB,GAAW,kBAAC,EAAa,CAAEjI,WAAU4H,YAKrCU,EAA2B,SAACvO,GAAD,OACpC,6BACI,kBAAC,EAAmBA,GACpB,kBAAC,EAAkBA,K,yBC7CrBwO,EAAYC,EAAQ,KAC1BtJ,IAAIF,OAAOyJ,aAAa,sBAAuBF,GAQ/C,IAAMG,EAAY,IAAIC,SAAc,CAAEC,eAAe,IAE/CC,EAAS,uCAAG,WAAOjP,EAAeoH,GAAtB,iBAAA8H,EAAA,sEACIJ,EAAUK,mBAAmBnP,GADjC,cACRoP,EADQ,OAERC,EAAU,IAAIN,UAAe,CAC/BO,WAAY,CACRC,YAAmBzN,IAAXsF,EACRA,OAAQA,EAAS2E,0BAAgB3E,QAAUtF,KALrC,kBAQPuN,EAAQG,YAAYJ,IARb,2CAAH,wDAWTxJ,EAAiB,CACnB,eACA,gBAGE6J,EAAkB,SAACrI,GAAD,YAAmC,CACvDG,IAAqB,QAAhBH,EAAO4E,KACZzK,MAAK,UAAE6F,EAAO7F,aAAT,QAAkB6F,EAAO8E,SAGrBwD,EAAwB,SAACvP,GAClC,IAAMgE,EAASa,oBAAU,CACrBI,OAAQ,CAAEpF,MAAOG,EAAMH,MAAO2P,KAAM,gBACpC/J,mBAIUgK,EAKVzL,EALA8B,SACY4J,EAIZ1L,EAJAoC,WACUuJ,EAGV3L,EAHAiC,SACU2J,EAEV5L,EAFA0C,SACWmJ,EACX7L,EADAgD,UAGc8I,EAAkB9P,EAA5B0G,SAERtI,IAAM0B,WAAU,WACZ,OAAO2P,GAAe,SAACtL,GAAD,OAAY2L,EAAc3L,EAAOtE,YACxD,CAAC4P,EAAgBK,IAlBwB,IAoBpC7I,EAAWjH,EAAM6N,MAAjB5G,OACF+F,EAAS5O,IAAMkE,YAAN,sBAAkB,8BAAAyM,EAAA,+EAEND,EAAS,UAACa,WAAD,QAAqB,GAAI1I,GAF5B,OAEnB8I,EAFmB,OAGzBH,EAAeG,GACfF,EAAgBP,EAAgBrI,IAJP,gDAMzBL,OAAO2G,MAAP,yBAA+B,KAAEhN,UANR,yDAQ9B,CAACoP,EAAgBC,EAAgBC,EAAiB5I,IAErD7I,IAAM0B,WAAU,WAEZ,OAAO4P,EAAiB,CAAEjR,IADd,CAAEuR,IAAK,YAAaC,IAAK,cACN1J,KAAM,SAAU9G,GAAIuN,MACpD,CAAC0C,EAAkB1C,IAEtB,IAAMe,EAAS3P,IAAMkE,YAAN,sBAAkB,8BAAAyM,EAAA,+EAEND,EAAS,UAACa,WAAD,QAAqB,IAFxB,OAEnBI,EAFmB,OAGzBH,EAAeG,GAHU,gDAKzBnJ,OAAO2G,MAAP,yBAA+B,KAAEhN,UALR,yDAO9B,CAACoP,EAAgBC,IAEdM,EACF,kBAAC,EAAD,CACIjK,SAAU0J,EACV5B,OAAQA,EACRf,OAAQA,EACRa,MAAO7N,EAAM6N,QAGrB,OACI,yBAAK5N,UAAS,UAAK1B,IAAEiD,UAAP,YAAoB2O,IAAWC,YACzC,kBAAC,IAAD,CAAOrP,KAAM,KACb,yBAAKd,UAAW1B,IAAE2R,SAAUA,GAC5B,kBAAC,IAAD,CAAOnP,KAAM,KAHjB,IAGwB,kBAAC,SAAD,CAAQZ,MAAM,WAHtC,IAGkD,kBAAC,IAAD,CAAOY,KAAM,KAC3D,yBAAKd,UAAW1B,IAAEyF,QACd,kBAAC,SAAD,CAAQA,OAAQA,O,kBC9FnBuK,EAA2B,SAAC,GAAD,IAAGV,EAAH,EAAGA,MAAH,OACpC,yBAAK5N,UAAW1B,IAAE2R,SACd,kBAAC,cAAD,CAAa1E,MAAOqC,EAAMrC,MAAOC,SAAUoC,EAAMpC,WACjD,kBAAC,IAAD,MACA,kBAAC,QAAD,Q,kCCCF4E,EAAS,SAACxQ,GAAD,OAA6B,OAAVA,EAAiBtB,IAAC,KAAQA,WAASsB,IAcxDyQ,EAAiC,SAAC,GAAD,IAAG/J,EAAH,EAAGA,KAAY1G,EAAf,EAAS0Q,KAAT,OAC1C,yBAAKtQ,UAAW1B,IAAEiD,WACb+E,GACG,oCACI,yBAAKtG,UAAW1B,IAAEgI,MAAOA,EAAzB,KACA,kBAAC,IAAD,CAAOxF,KAAM,KAGrB,yBAAKd,UAAWoQ,EAAOxQ,IApBb,SAACA,GACf,GAAc,OAAVA,EAAgB,MAAO,OAC3B,cAAeA,GACX,IAAK,UACD,OAAOA,EAAQ,OAAS,QAC5B,IAAK,SACD,OAAOA,EAAM2Q,WACjB,IAAK,SACD,MAAM,IAAN,OAAW3Q,EAAX,MAY4B4Q,CAAU5Q,M,6DCjC5C6Q,GAAM,kBACR,yBAAKzQ,UAAW1B,KAAEoS,KACd,kBAAC,SAAD,CAAQxQ,MAAM,aAIhByQ,GAAmC,SAAC,GAAD,IAAGC,EAAH,EAAGA,KAAH,OACrC,yBAAK5Q,UAAW4Q,EAAOtS,KAAEuS,QAAUvS,KAAEwS,QACjC,kBAAC,IAAD,CAAOhQ,KAAM,IACb,kBAAC,SAAD,CAAQZ,MAAM,aAIT6Q,GAAoC,SAAC,GAAD,IAAGH,EAAH,EAAGA,KAAH,OAC7C,yBAAK5Q,UAAW1B,KAAE0S,MACd,kBAAC,GAAD,CAAKJ,KAAMA,IACX,kBAAC,GAAD,Q,8BCpBKK,GAAyB,CAClCrC,eAAe,EACfsC,QAAS,SACTC,QAAS,SCsBPC,GAAa,IAAIzC,UAAesC,IAEzBI,GAA8B,SAAC,GAA4B,IAA1B/K,EAAyB,EAAzBA,KAAMgK,EAAmB,EAAnBA,KAAMgB,EAAa,EAAbA,OAChDC,EAAOpT,IAAMkE,aAAY,WAC3B,IACI,IAAMmP,EAhBD,SAACC,EAAgBC,GAC9B,IAAMC,EAAUC,OAAOF,GAEjBpL,EAAOuL,MAAMF,GAAWD,EAAjB,cAAgCA,GAEvCpB,EAAI,gBAAMhK,EAAOmL,GAEvB,OAAIK,MAAMC,QAAQN,GAAe,0BAAMnL,EAAb,SAA2BgK,GAC9CA,EAQe0B,CAAS1B,EAAMhK,GACvB2L,EAAOb,GAAWhC,YAAYoC,GACpCnE,IAAoB4E,GACtB,MAAO7S,GACLuH,OAAO2G,MAAP,uBAA6BlO,EAAEkB,aAEpC,CAACgQ,EAAMhK,IAEJ4L,EAAS/T,IAAMkE,aAAY,WAC7BiP,GAAO,GACP3K,OAAOC,YAAW,kBAAM0K,EAAO,QAAO,OACvC,CAACA,IAEEa,EAAWhU,IAAMkE,aAAY,WAC/BiP,GAAO,GACP3K,OAAOC,YAAW,kBAAM0K,EAAO,QAAO,OACvC,CAACA,IAEEzL,EAAW1H,IAAMkE,aACnB,SAACjD,GACG,OAAQA,EAAEsB,OAAOd,OACb,IAAK,OACD,OAAO2R,IACX,IAAK,SACD,OAAOW,IACX,IAAK,WACD,OAAOC,IACX,QACI,MAAMpT,MAAM,mBAAD,OAAoBK,EAAEsB,OAAOd,WAGpD,CAAC2R,EAAMW,EAAQC,IAGnB,OACI,4BACItM,SAAUA,EACVjG,MAAM,UAENI,UAAS,UAAK1B,KAAE8T,KAAP,YAAeC,KAAKD,KAApB,YAA4BlC,IAAW9B,UAEhD,4BAAQxO,MAAM,WAAd,UACA,4BAAQA,MAAM,QAAd,QACA,4BAAQA,MAAM,UAAd,cACA,4BAAQA,MAAM,YAAd,kBCtDN0S,GAID,SAAC,GAAD,IAAGJ,EAAH,EAAGA,OAAQK,EAAX,EAAWA,UAAWC,EAAtB,EAAsBA,SAAtB,OACD,4BAAQnI,QAAS,kBAAMkI,GAAWL,IAASlS,UAAW1B,KAAEmU,QACnDP,EAAS,SAAM,IADpB,IAC0BM,IAIxBE,GAAa,SAACC,EAAYC,EAAeC,GAA5B,OACf,wBAAI7S,UAAW1B,KAAEqU,KAAMnU,IAAKmU,EAAKrM,MAC7B,kBAAC,GAAD,CAAMsK,KAAMgC,IAAUC,EAAIC,OAAS,IACnC,kBAAC,GAAD,CAAMxM,KAAMqM,EAAKrM,KAAMgK,KAAMqC,EAAKrC,SAKpCyC,GAAa5U,IAAMC,cAA8B,MAE1C4U,GAA2B,SAAC,GAA2B,IAAzB1C,EAAwB,EAAxBA,KAAMhK,EAAkB,EAAlBA,KAAM2M,EAAY,EAAZA,MAAY,EACnC9U,IAAMmB,SAAS2T,EAAMH,OAAS,GADK,mBACxDZ,EADwD,KAChDK,EADgD,OAEzCpU,IAAMmB,SAAyB,MAFU,mBAExD4T,EAFwD,KAEnD5B,EAFmD,KAGzD6B,EAAahV,IAAMW,WAAWiU,IAWpC,OATA5U,IAAM0B,WAAU,WACZyR,EAAO6B,GACY,OAAfA,GAAqBZ,EAAUY,KACpC,CAACA,IAEJhV,IAAM0B,WAAU,WACA,OAARqT,GAAcX,EAAUW,KAC7B,CAACA,IAGA,kBAACH,GAAWK,SAAZ,CAAqBxT,MAAOsT,GACxB,6BACI,yBAAKlT,UAAW1B,KAAEgI,MACd,kBAAC,GAAD,CAAc4L,OAAQA,EAAQK,UAAWA,GACpCjM,GAEL,kBAAC,GAAD,CAAYgK,KAAMA,EAAMgB,OAAQA,EAAQhL,KAAMA,KAEjD4L,GAAU,gCAAMe,EAAMI,IAAIX,IAAhB,QCtDrBY,GAA8B,SAACvT,GACjC,IAAMkT,EAAQM,OAAOC,KAAKzT,EAAMuQ,MAAM+C,KAAI,SAAC7U,GAAD,MAAU,CAChD8H,KAAM9H,EACN8R,KAAMvQ,EAAMuQ,KAAK9R,OAErB,OAAO,kBAAC,GAAD,iBAAauB,EAAb,CAAoBkT,MAAOA,MAGhCQ,GAA6B,SAAC1T,GAChC,IAAK+R,MAAMC,QAAQhS,EAAMuQ,MAAO,MAAMvR,MAAM,0BAC5C,IAAMkU,EAAQlT,EAAMuQ,KAAK+C,KAAI,SAAC/C,EAAMsC,GAAP,MAAkB,CAC3Cc,WAAY3T,EAAMuG,KAClBA,KAAMsM,EAAMrC,WACZD,WAEJ,OAAO,kBAAC,GAAD,iBAAavQ,EAAb,CAAoBkT,MAAOA,MAGhCU,GAA4B,SAAC5T,GAC/B,OLjBc,QADUH,EKkBRG,EAAMuQ,OLhBf,CAAC,UAAW,SAAU,UAAUsD,gBAAgBhU,GKgBnB,kBAAC,EAAkBG,GACnD+R,MAAMC,QAAQhS,EAAMuQ,MAAc,kBAAC,GAAcvQ,GAC9C,kBAAC,GAAeA,GLpBA,IAACH,GKuBfiU,GAAwB,SAAC9T,GAAD,OACjC,yBAAKC,UAAW1B,KAAEiD,WACd,kBAAC,GAAaxB,K,oBCzBhB2O,GAAY,IAAIC,SAAcsC,IAE9B6C,GAAQ,uCAAG,WACb7B,EACA8B,EACAC,GAHa,eAAAlF,EAAA,+EAMUJ,GAAUK,mBAAmBkD,GANvC,OAMH3B,EANG,OAOTyD,EAAS,MACTC,EAAQ1D,GARC,gDAUTyD,EAAS,KAAMzT,SAVN,yDAAH,0DAyBR2T,GAAwC,SAAC,GAAD,IAAGvK,EAAH,EAAGA,MAAH,OAC1C,oCACI,yBAAK1J,UAAW1B,KAAEoL,OACd,kBAAC,IAAD,KACI,0BAAMwK,KAAK,MAAMC,aAAW,oBAA5B,UAGA,kCAAQzK,KAGhB,kBAAC,IAAD,CAAO5I,KAAM,OAIRsT,GAAwB,SAAC,GAAe,IAAD,EAzBpC,SAACnC,GAAkB,IAAD,EACJ9T,IAAMmB,SAAwB,MAD1B,mBACvBoK,EADuB,KAChBqK,EADgB,OAEN5V,IAAMmB,SAAc,IAFd,mBAEvBgR,EAFuB,KAEjB0D,EAFiB,KAQ9B,OAJA7V,IAAM0B,WAAU,WACZiU,GAAS7B,EAAM8B,EAAUC,KAC1B,CAAC/B,IAEG,CAAEvI,QAAO4G,QAkBQ+D,CADwB,EAAZzU,OAC5B0Q,EADwC,EACxCA,KAAM5G,EADkC,EAClCA,MAEd,OACI,yBAAK1J,UAAW1B,KAAEiD,WACbmI,GAAS,kBAAC,GAAD,CAAUA,MAAOA,IAC3B,yBAAK1J,UAAW1B,KAAEgS,MACd,kBAAC,GAAD,CAAMhK,KAAK,MAAMgK,KAAMA,OC9C1BgE,GAAwB,SAAC,GAAsB,IAApB1G,EAAmB,EAAnBA,MAAOhO,EAAY,EAAZA,MAC3C,OACI,yBAAKI,UAAW1B,IAAEiD,WACd,yBAAKvB,UAAW1B,IAAE2R,SACd,kBAAC,EAAD,CAASrC,MAAOA,KAEpB,yBAAK5N,UAAW1B,IAAEkF,MACd,kBAAC,IAAD,CAAO1C,KAAM,KACb,kBAAC,SAAD,CAAQZ,MAAM,WACd,kBAAC,IAAD,CAAOY,KAAM,MAEjB,yBAAKd,UAAW1B,IAAEiW,MACd,kBAAC,GAAD,CAAM3U,MAAOA,O,QC1BvB4U,GAAU,CAAC,8qE,oBCWX/V,GDGF+V,GAAQ/R,KAAKgS,MAAMhS,KAAKiS,SAAWF,GAAQ1B,SCDlC6B,GAAM,WACf,IAAM/G,ECPc,WACpB,IAAM5G,EAAS+E,sBADkB,EAELT,qBAApBC,EAFyB,EAEzBA,MAAOC,EAFkB,EAElBA,SACf,OAAO,cAAED,QAAOC,YAAaxE,GDIf4N,GADO,EAEKrW,qBAAW,QAASE,IAFzB,mBAEdmB,EAFc,KAEP6G,EAFO,OAGKlI,qBAAW,QAAS,IAHzB,mBAGd4C,EAHc,KAGPc,EAHO,KAKfpB,EACF,yBAAKb,UAAW1B,KAAEuC,MACd,yBAAKb,UAAW1B,KAAE6G,KAAM0H,MAAO,CAAEgI,SAAU1T,IACvC,kBAAC,EAAS,CAAEyM,QAAOhO,QAAO6G,cAE9B,yBAAKzG,UAAW1B,KAAEwW,QACd,kBAAC,YAAD,CAAW7S,SAAUA,KAEzB,yBAAKjC,UAAW1B,KAAEkF,MACd,kBAAC,SAAD,CAAQtD,MAAM,YAElB,yBAAKF,UAAW1B,KAAEyW,KAAMlI,MAAO,CAAEgI,SAAU,EAAI1T,IAC3C,kBAAC,GAAD,CAAMyM,MAAOA,EAAOhO,MAAOA,MAKvC,OACI,yBAAKI,UAAS,UAAK1B,KAAE0W,IAAP,YAAcC,IAAUnJ,SACjCjL,EACD,kBAAC,SAAD,CAAQX,MAAM,WACd,yBAAKF,UAAW1B,KAAE4W,QACd,kBAAC,SAAD,CAAQ3N,SAAS,YElC3B1I,GAAU,IAAI4E,aAAW,OAE/B0R,IAASC,OACL,kBAAC,IAAMC,WAAP,KACI,kBAAC,iBAAejC,SAAhB,CAAyBxT,MAAOf,IAC5B,kBAAC,GAAD,QAGR+C,SAAS0T,eAAe,W","file":"static/js/main.b90cd2db.chunk.js","sourcesContent":["export * from \"./about/about\";\nexport * from \"./border/border\";\nexport * from \"./debug/debug\";\nexport * from \"./footer/footer\";\nexport * from \"./icon/icon\";\nexport * from \"./prefs/prefs\";\nexport * from \"./resize-div/resize-div\";\nexport * from \"./storage/storage\";\nexport * from \"./types/types\";\nexport * from \"./use-editor/editor\";\nexport * from \"./use-editor/use-editor\";\nexport * from \"./use-resize-observer/use-resize-observer\";\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"footer_container__lONVT\",\"line\":\"footer_line__B8fLy\",\"grow\":\"footer_grow__IzUpL\",\"about\":\"footer_about__2iXRq\",\"space\":\"footer_space__1xsp6\"};","import React from \"react\";\nimport throttle from \"lodash.throttle\";\n\nimport { AppStorage } from \"./storage\";\n\nexport const StorageContext = React.createContext(null);\n\nconst self = (s: string): string => s;\n\nexport const useStorage = (key: string, fallback: T) => {\n const parse = typeof fallback === \"string\" ? self : JSON.parse;\n const stringify = typeof fallback === \"string\" ? self : JSON.stringify;\n\n const storage = React.useContext(StorageContext);\n if (storage === null) throw Error(\"storage context not found\");\n\n // get\n const initial: T = React.useMemo(() => {\n const existed = storage.getItem(key);\n if (existed === null) return fallback;\n try {\n return parse(existed);\n } catch (e) {\n return fallback;\n }\n }, [key, fallback, parse]);\n const state = React.useState(initial);\n\n // set\n const setItem = React.useMemo(() => {\n const fn = storage.setItem.bind(storage);\n return throttle(fn, 2000, { leading: true });\n }, [storage]);\n const [value] = state;\n React.useEffect(() => {\n setItem(key, stringify(value));\n }, [key, value, stringify, setItem]);\n\n // return\n return state;\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"links_container__2n3RN\",\"tptop\":\"links_tptop__191dn\",\"tpbot\":\"links_tpbot__1kdbp\",\"nobreak\":\"links_nobreak__3Piom\",\"space\":\"links_space__uM8hc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"app\":\"app_app__1ZWe8\",\"resize\":\"app_resize__2Kzcv\",\"line\":\"app_line__1sNXQ\",\"body\":\"app_body__1DfIV\",\"footer\":\"app_footer__1B34Y\",\"edit\":\"app_edit__3X8FM\",\"view\":\"app_view__2TwIj\"};","import React from \"react\";\n\nimport s from \"./border.module.scss\";\nimport { borderColor } from \"@moai/core\";\n\ninterface Props {\n color: keyof typeof borderColor;\n}\n\nexport const Border = (props: Props) => {\n return
;\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"indent_container__J1Fg7\",\"full\":\"indent_full__3ePWF\",\"kind\":\"indent_kind__2MX6E\",\"width\":\"indent_width__3NDAa\",\"custom\":\"indent_custom__mVUtK\",\"auto\":\"indent_auto__Hxc5f\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"map_item__HhR5m\",\"toggle\":\"map_toggle__BST4Z\",\"more\":\"map_more__3BPAU\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"reverse\":\"about_reverse__3b8SN\",\"container\":\"about_container__5Uz_w\",\"logo\":\"about_logo__mIO1X\",\"body\":\"about_body__3Eo99\",\"link\":\"about_link__3rU_E\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"resize-div_container__c1aOp\",\"line\":\"resize-div_line__3JQcI\",\"noDrag\":\"resize-div_noDrag__1QeEx\",\"drag\":\"resize-div_drag__3f1kO\",\"disable\":\"resize-div_disable__2hz1r\"};","import React from \"react\";\n\nexport const debugLog = (message: any, ...others: any) => {\n // console.log(message, ...others);\n};\n\n// Hook\nexport const useDebugWhyDidYouUpdate = (\n name: string,\n props: { [index: string]: any }\n) => {\n // Get a mutable ref object where we can store props ...\n // ... for comparison next time this hook runs.\n const previousProps = React.useRef<{ [index: string]: any }>({});\n\n React.useEffect(() => {\n if (previousProps.current) {\n // Get all keys from previous and current props\n const allKeys = Object.keys({ ...previousProps.current, ...props });\n // Use this object to keep track of changed props\n const changesObj: { [index: string]: any } = {};\n // Iterate through keys\n allKeys.forEach((key) => {\n // If previous is different from current\n if (previousProps.current[key] !== props[key]) {\n // Add to changesObj\n changesObj[key] = {\n from: previousProps.current[key],\n to: props[key],\n };\n }\n });\n\n // If changesObj not empty then output to console\n if (Object.keys(changesObj).length) {\n console.log(\"[why-did-you-update]\", name, changesObj);\n }\n }\n\n // Finally update previousProps with current props for next hook call\n previousProps.current = props;\n });\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"view_container__2oDm-\",\"tree\":\"view_tree__1hvcL\",\"line\":\"view_line__22x2f\",\"toolbar\":\"view_toolbar__2Z_Iz\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"primitive_container__3aTV0\",\"string\":\"primitive_string__3yb39\",\"number\":\"primitive_number__CYVL1\",\"null\":\"primitive_null__3Rk0r\",\"boolean\":\"primitive_boolean__2nkMk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pipe\":\"pipe_pipe__1cSYm\",\"verLast\":\"pipe_verLast__1AeuP\",\"verMid\":\"pipe_verMid__ustVz\",\"hor\":\"pipe_hor__1hDBA\"};","import React from \"react\";\n\nimport s from \"./about.module.scss\";\nimport logo from \"./logo.png\";\nimport { DivPx } from \"@moai/core\";\n\nconst Team = () => (\n \n TablePlus Team\n \n);\n\nconst Body = () => (\n
\n
Developed and maintained
\n \n
\n by \n \n
\n
\n);\n\nconst Logo = () => (\n \n \"tableplus\n \n);\n\ninterface Props {\n reverse?: boolean;\n}\n\nexport const About: React.FC = ({ reverse }) => (\n
\n
\n \n \n \n
\n
\n);\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"editor_container__1ca_f\",\"body\":\"editor_body__1rMcG\",\"status\":\"editor_status__7RtXv\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"desktop\":\"toolbar_desktop__3wUEd\",\"mobile\":\"toolbar_mobile__1m38T\",\"primary\":\"toolbar_primary__1Ravm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"edit_container__3DSS2\",\"editor\":\"edit_editor__2-vuA\",\"toolbar\":\"edit_toolbar__18Xk0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"tree_container__2LYmq\",\"node\":\"tree_node__333ca\",\"error\":\"tree_error__l405Q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icon\":\"format_icon__C5mfs\",\"label\":\"format_label__3-CDl\",\"text\":\"format_text__LmTYn\"};","import React from \"react\";\n\nimport s from \"./resize-div.module.scss\";\n\nconst sDisable = s.disable;\nif (sDisable === undefined) throw Error(\"disable class is not defined\");\n\nconst root = document.documentElement;\nconst maxX = root.clientWidth - 320;\nconst minX = 320;\n\nconst normalizeX = (input: number) => {\n let x = input;\n x = Math.min(x, maxX);\n x = Math.max(x, minX);\n return x;\n};\n\ninterface Props {\n setWidth: (width: number) => void;\n}\n\nexport const ResizeDiv: React.FC = ({ setWidth }) => {\n const [isDragging, setIsDragging] = React.useState(false);\n\n const doDrag = React.useCallback(\n (e: MouseEvent) => {\n const clientX = normalizeX(e.clientX);\n setWidth(clientX / root.clientWidth);\n },\n [setWidth]\n );\n\n const stopDrag = React.useCallback(() => {\n root.classList.remove(sDisable);\n root.removeEventListener(\"mousemove\", doDrag);\n root.removeEventListener(\"mouseup\", stopDrag);\n setIsDragging(false);\n }, [doDrag, setWidth]);\n\n const startDrag = React.useCallback(() => {\n root.classList.add(sDisable);\n root.addEventListener(\"mousemove\", doDrag);\n root.addEventListener(\"mouseup\", stopDrag);\n setIsDragging(true);\n }, [doDrag, stopDrag]);\n\n return (\n setWidth(0.5)}\n >\n
\n
\n );\n};\n","import { debugLog } from \"../debug/debug\";\n\nexport class AppStorage {\n appID: string;\n constructor(appID: string) {\n this.appID = appID;\n }\n clear() {\n return localStorage.clear();\n }\n getItem(key: string) {\n debugLog(\"storage get\", key);\n return localStorage.getItem(`${this.appID}@${key}`);\n }\n setItem(key: string, value: string) {\n debugLog(\"storage set\", key);\n return localStorage.setItem(`${this.appID}@${key}`, value);\n }\n}\n\nexport * from \"./use-storage\";\n","import React from \"react\";\n\nimport { EditorManager } from \"./use-editor\";\nimport s from \"./editor.module.scss\";\nimport { MutedDiv, DivPx } from \"@moai/core\";\nimport { Border } from \"../border/border\";\n\ninterface Props {\n editor: EditorManager;\n}\n\nexport const Editor: React.FC = ({ editor }) => (\n
\n
\n
\n
\n {editor.params.statusVisible && (\n <>\n \n \n
\n \n
\n \n
\n \n \n )}\n
\n);\n","import React from \"react\";\n\nimport ace from \"ace-builds\";\nimport \"ace-builds/src-noconflict/keybinding-sublime\";\nimport \"ace-builds/src-noconflict/ext-prompt\";\nimport \"ace-builds/src-noconflict/ext-searchbox\";\nimport { StatusBar } from \"ace-builds/src-noconflict/ext-statusbar\";\n\nimport \"./use-editor.scss\";\n\ntype RemoveListenerFn = () => void;\ntype ListenerFn

= (params: P) => void;\ntype AddListenerFn

= (listener: ListenerFn

) => RemoveListenerFn;\n\ntype OnChange = AddListenerFn<{ value: string }>;\n\nexport interface EditorIndent {\n tab: boolean;\n width: number;\n}\n\nexport interface EditorCommand {\n name: string;\n key: { mac: string; win: string };\n fn: () => void;\n}\n\ntype AddCommand = (command: EditorCommand) => () => void;\n\ninterface EditorParams {\n config: Partial;\n removeCommands: string[];\n statusVisible?: boolean;\n}\n\nexport interface EditorManager {\n params: EditorParams;\n getValue: () => string | null;\n setValue: (value: string) => void;\n setIndent: (indent: EditorIndent) => void;\n onChange: OnChange;\n addCommand: AddCommand;\n refBody: React.RefObject;\n refStatus: React.RefObject;\n}\n\ntype UseEditor = (params: EditorParams) => EditorManager;\n\nconst baseConfig: Partial = {\n showInvisibles: true,\n displayIndentGuides: false,\n printMargin: false,\n keyboardHandler: \"ace/keyboard/sublime\",\n wrap: false as any, // https://github.com/ajaxorg/ace/pull/4292\n};\n\nexport const useEditor: UseEditor = (params) => {\n const refBody = React.useRef(null);\n const refStatus = React.useRef(null);\n const [editor, setEditor] = React.useState(null);\n\n // init ace\n React.useEffect(() => {\n if (editor !== null) return;\n\n if (refBody.current === null) throw Error(\"Body is not defined.\");\n const config = { ...baseConfig, ...params.config };\n const _editor = ace.edit(refBody.current, config);\n\n if (params.statusVisible) {\n const statusElm = refStatus.current;\n if (statusElm === null) throw Error(\"Status is not defined\");\n const statusBar = new StatusBar(_editor, refStatus.current);\n statusBar.element.textContent = \"0:0\";\n }\n\n _editor.focus();\n setEditor(_editor);\n }, [editor, params.config]);\n\n React.useEffect(() => {\n if (editor === null) return;\n params.removeCommands.forEach((command) => {\n // https://github.com/ajaxorg/ace/pull/4293\n editor.commands.removeCommand(command as any);\n });\n }, [editor, params.removeCommands]);\n\n // event listeners\n const onChange: OnChange = React.useCallback(\n (listener) => {\n if (editor === null) return () => {};\n const cb = () => listener({ value: editor.getValue() });\n editor.on(\"change\", cb);\n return () => editor.off(\"change\", cb);\n },\n [editor]\n );\n\n const addCommand: AddCommand = React.useCallback(\n (command) => {\n if (editor === null) return () => {};\n const aceCommand: ace.Ace.Command = {\n bindKey: command.key,\n name: command.name,\n exec: command.fn,\n };\n editor.commands.addCommand(aceCommand);\n return () => editor.commands.removeCommand(aceCommand);\n },\n [editor]\n );\n\n const getValue = React.useCallback(() => {\n return editor?.getValue() ?? null;\n }, [editor]);\n\n const setValue = React.useCallback(\n (value: string) => {\n if (editor === null) return;\n editor.setValue(value);\n editor.navigateFileEnd();\n window.setTimeout(() => editor.scrollToRow(Infinity), 0);\n },\n [editor]\n );\n\n const setIndent = React.useCallback(\n (indent: EditorIndent) => {\n if (editor === null) return;\n editor.session.setUseSoftTabs(!indent.tab);\n editor.session.setTabSize(indent.width);\n },\n [editor]\n );\n\n const ops = { getValue, setValue, setIndent, onChange, addCommand };\n const refs = { refBody, refStatus };\n return { params, ...ops, ...refs };\n};\n","import React from \"react\";\n\nimport { Paragraph, Strong } from \"@moai/core\";\nimport s from \"./privacy.module.scss\";\n\ninterface Props {\n dataText: string;\n}\n\nexport const Privacy: React.FC = ({ dataText }) => (\n

\n \n Your data are safe here. \n \n We process your {dataText} right in the browser, so no data\n shall leave this device.\n \n \n
\n);\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://bit.ly/CRA-PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://bit.ly/CRA-PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null &&\n contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import React from \"react\";\n\nimport { Pop, DivEm } from \"@moai/core\";\nimport s from \"./version.module.scss\";\n\nimport { register, unregister } from \"./service-worker\";\n\nconst msg = `A new version will be updated on your next visit,\nor click to reload and update now`;\n\nconst forceUpdate = (registration: ServiceWorkerRegistration) => {\n console.log(\"sw debug\", registration);\n if (!registration || !registration.waiting) return;\n registration.waiting.postMessage({ type: \"SKIP_WAITING\" });\n window.location.reload();\n};\n\ninterface Props {\n enabled: boolean;\n}\n\nexport const Version = ({ enabled }: Props) => {\n const [outdated, setOutdated] = React.useState(false);\n const update = React.useRef<() => void>(() => {});\n\n React.useEffect(() => {\n if (enabled === false) {\n unregister();\n } else {\n register({\n onUpdate: (registration) => {\n update.current = () => forceUpdate(registration);\n setOutdated(true);\n },\n });\n }\n }, [enabled]);\n\n if (!outdated) return null;\n\n return (\n \n \n \n \n \n \n );\n};\n","import React from \"react\";\n\nimport s from \"./links.module.scss\";\nimport { MutedDiv, Paragraph, DivEm, DivPx } from \"@moai/core\";\nimport { Version } from \"./version/version\";\n\nconst TPLink = () => (\n \n © 2022 \n \n TablePlus Inc.\n \n \n);\n\ninterface Props {\n offlineMode: boolean;\n}\n\nexport const Links = (props: Props) => (\n \n
\n \n Email us\n \n \n Issue tracker\n \n {/* There's an Em inside Version */}\n \n \n \n \n \n \n
\n \n
\n \n \n \n \n \n 1100-1959 Upper Water Street\n \n Halifax NS Canada.\n \n All rights reserved\n \n
\n
\n);\n","import React from \"react\";\n\nimport { DivPx } from \"@moai/core\";\nimport { Privacy } from \"./privacy/privacy\";\nimport { Links } from \"./links/links\";\nimport s from \"./footer.module.scss\";\nimport { About } from \"../about/about\";\nimport { Border } from \"../border/border\";\n\ninterface Props {\n dataText: string;\n offlineMode: boolean;\n}\n\nexport const Footer = ({ dataText, offlineMode }: Props) => (\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n);\n\nFooter.defaultProps = {\n offlineMode: true,\n};\n","import React from \"react\";\n\nimport { Switcher } from \"@moai/core\";\nimport { useStorage } from \"../../storage/use-storage\";\nimport { SetState } from \"../../types/types\";\n\nexport type Theme = string;\nexport type SetTheme = React.Dispatch>;\n\nexport const themeOptions = [\n { label: \"Light\", value: \"theme-light\" },\n { label: \"Dark\", value: \"theme-dark\" },\n { label: \"System\", value: \"theme-auto\" },\n];\n\nconst html = document.documentElement;\n\nexport const useTheme = () => {\n const [value, setValue] = useStorage(\"pref-theme\", \"theme-auto\");\n\n React.useEffect(() => {\n html.classList.add(value);\n return () => html.classList.remove(value);\n }, [value]);\n\n return { theme: value, setTheme: setValue };\n};\n\ninterface Props {\n theme: string;\n setTheme: SetState;\n}\n\nexport const ThemeSelect: React.FC = ({ theme, setTheme }) => (\n \n);\n","import React from \"react\";\n\nimport { DivPx, Input, Select, SelectOption } from \"@moai/core\";\nimport { useStorage } from \"../../storage/use-storage\";\nimport s from \"./indent.module.scss\";\n\ntype SetState = React.Dispatch>;\n\nexport interface Indent {\n kind: string;\n width: number | null;\n custom: number;\n}\n\nexport interface SetIndent {\n kind: SetState;\n width: SetState;\n custom: SetState;\n}\n\nexport const getIndentString = (indent: Indent) => {\n if (indent.kind === \"tab\") return \"\\t\";\n return \" \".repeat(indent.width ?? indent.custom);\n};\n\nexport interface IndentState {\n indent: Indent;\n setIndent: SetIndent;\n}\n\nexport const useIndent = (): IndentState => {\n const [kind, setKind] = useStorage(\"pref-indent-type\", \"tab\");\n const [width, setWidth] = useStorage(\"pref-indent-width\", 4);\n const [custom, setCustom] = useStorage(\"pref-indent-custom\", 3);\n\n return {\n indent: { kind, width, custom },\n setIndent: { kind: setKind, width: setWidth, custom: setCustom },\n };\n};\n\ninterface Props extends IndentState {\n fullWidth?: boolean;\n}\n\nconst kindOptions: SelectOption[] = [\n { value: \"tab\", label: \"Tabs\" },\n { value: \"space\", label: \"Spaces\" },\n];\n\nconst widthOptions: SelectOption[] = [\n { value: 2, label: \"2 spaces\" },\n { value: 4, label: \"4 spaces\" },\n { value: 8, label: \"8 spaces\" },\n { value: null, label: \"Custom\" },\n];\n\nexport const IndentSelect: React.FC = ({\n fullWidth,\n indent,\n setIndent,\n}) => (\n
\n
\n \n
\n \n
\n \n
\n {indent.width === null && (\n <>\n \n
\n \n
\n \n )}\n
\n);\n","module.exports = \"data:image/png;base64,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\"","// extracted by mini-css-extract-plugin\nmodule.exports = {\"border\":\"border_border__1-fpc\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"privacy_container__3CqYN\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"update\":\"version_update__1tJbk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"save_container__eISZW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"actions\":\"more_actions__-zzqn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toolbar\":\"toolbar_toolbar__3fQnA\",\"theme\":\"toolbar_theme__2-EOs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"more\":\"more_more__1Gzcw\"};","import React from \"react\";\nimport { Button } from \"@moai/core\";\nimport { Icon } from \"@moai/core\";\nimport s from \"./format.module.scss\";\n\nconst cmd =\n \"M12 9h-1V7h1c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3v1H7V4c0-1.66-1.34-3-3-3S1 2.34 1 4s1.34 3 3 3h1v2H4c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3v-1h2v1c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3zm0-6c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zM4 13c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm0-8c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm5 4H7V7h2v2zm3 4c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1z\";\nconst ctrl =\n \"M12.71 5.29l-4-4C8.53 1.11 8.28 1 8 1s-.53.11-.71.29l-4 4a1.003 1.003 0 001.42 1.42L8 3.41l3.29 3.29c.18.19.43.3.71.3a1.003 1.003 0 00.71-1.71z\";\nconst enter =\n \"M14 2c-.55 0-1 .45-1 1v3c0 1.66-1.34 3-3 3H4.41L5.7 7.71c.19-.18.3-.43.3-.71a1.003 1.003 0 00-1.71-.71l-3 3c-.18.18-.29.43-.29.71 0 .28.11.53.29.71l3 3a1.003 1.003 0 001.42-1.42L4.41 11H10c2.76 0 5-2.24 5-5V3c0-.55-.45-1-1-1z\";\n\nconst isApple =\n navigator.platform &&\n (navigator.platform.startsWith(\"Mac\") ||\n navigator.platform.startsWith(\"iPad\") ||\n navigator.platform.startsWith(\"iPhone\"));\n\nconst Shortcut = () => (\n \n \n \n \n \n);\n\ninterface Props {\n format: () => void;\n}\n\nexport const Format: React.FC = ({ format }) => (\n \n);\n","import React from \"react\";\nimport { Select, SelectOption } from \"@moai/core\";\nimport * as clipboard from \"clipboard-polyfill\";\nimport FileSaver from \"file-saver\";\nimport s from \"./save.module.scss\";\n\ninterface Props {\n getValue: () => string | null;\n}\n\ntype Target = \"none\" | \"clipboard\" | \"file\";\n\nconst blobOptions: BlobPropertyBag = {\n type: \"text/xml;charset=utf-8\",\n};\n\nconst targets: SelectOption[] = [\n { value: \"none\", label: \"Save\", disabled: true },\n { value: \"clipboard\", label: \"Copy to clipboard\" },\n { value: \"file\", label: 'Download as file' },\n];\n\nexport const SaveMenu: React.FC = ({ getValue }) => {\n const setTarget = (target: Target) => {\n const value = getValue() || \"\";\n switch (target) {\n case \"clipboard\":\n clipboard.writeText(value).catch((e) => {\n window.alert(`Cannot copy: ${e.message}`);\n });\n break;\n case \"file\":\n const blob = new Blob([value], blobOptions);\n FileSaver.saveAs(blob, \"untitled.xml\");\n break;\n case \"none\":\n throw Error('Should not reach \"none\"');\n }\n };\n\n return (\n
\n \n
\n );\n};\n","import React from \"react\";\n\nimport { Border, IndentSelect, ThemeSelect } from \"@tableplus/toolkit\";\nimport { Prefs } from \"prefs/prefs\";\nimport { DivPx } from \"@moai/core\";\nimport { SaveMenu } from \"../save/save\";\n\nimport s from \"./more.module.scss\";\n\ninterface Props {\n getValue: () => string | null;\n prefs: Prefs;\n}\n\nexport const MorePane: React.FC = (props) => {\n const { prefs, getValue } = props;\n const { indent, setIndent, theme, setTheme } = prefs;\n return (\n
\n \n \n \n \n \n \n \n \n
\n );\n};\n","import React from \"react\";\n\nimport { Format } from \"./format/format\";\nimport { Button, DivGrow, DivPx } from \"@moai/core\";\nimport s from \"./toolbar.module.scss\";\nimport { Prefs } from \"prefs/prefs\";\nimport { IndentSelect } from \"@tableplus/toolkit\";\nimport { SaveMenu } from \"./save/save\";\nimport { MorePane } from \"./more/more\";\n\ninterface Props {\n getValue: () => string | null;\n format: () => void;\n uglify: () => void;\n prefs: Prefs;\n}\n\nconst more =\n \"M2 10.03a2 2 0 100-4 2 2 0 000 4zM14 10.03a2 2 0 100-4 2 2 0 000 4zM8 10.03a2 2 0 100-4 2 2 0 000 4z\";\n\nconst DesktopToolbar: React.FC = (props) => {\n const { format, uglify, getValue, prefs } = props;\n const { indent, setIndent } = prefs;\n return (\n
\n \n \n \n \n \n \n \n
\n );\n};\n\nconst MobileToolbar: React.FC = (props) => {\n const { format, uglify, getValue, prefs } = props;\n const [moreVis, setMoreVis] = React.useState(false);\n return (\n
\n
\n \n \n \n \n setMoreVis(!moreVis)}\n icon={more}\n />\n
\n {moreVis && }\n
\n );\n};\n\nexport const Toolbar: React.FC = (props) => (\n
\n \n \n
\n);\n","import React from \"react\";\n\nimport ace from \"ace-builds\";\nimport \"ace-builds/src-noconflict/mode-xml\";\n\nimport { Indent, getIndentString, Editor } from \"@tableplus/toolkit\";\nimport { useEditor, EditorIndent, Border } from \"@tableplus/toolkit\";\nimport { DivPx, background } from \"@moai/core\";\nimport { Prefs } from \"prefs/prefs\";\nimport { Toolbar } from \"./toolbar/toolbar\";\nimport s from \"./edit.module.scss\";\nimport * as xml2js from \"xml2js\";\n\n// https://github.com/ajaxorg/ace/issues/3913\n// eslint-disable-next-line\nconst workerUrl = require(\"file-loader!ace-builds/src-noconflict/worker-xml.js\");\nace.config.setModuleUrl(\"ace/mode/xml_worker\", workerUrl);\n\ninterface Props {\n prefs: Prefs;\n value: string;\n setValue: React.Dispatch>;\n}\n\nconst xmlParser = new xml2js.Parser({ explicitArray: false });\n\nconst xmlFormat = async (value: string, indent?: Indent): Promise => {\n const obj = await xmlParser.parseStringPromise(value);\n const builder = new xml2js.Builder({\n renderOpts: {\n pretty: indent !== undefined,\n indent: indent ? getIndentString(indent) : undefined,\n },\n });\n return builder.buildObject(obj);\n};\n\nconst removeCommands = [\n \"addLineAfter\", // ctrl-enter ---> conflict with \"format\"\n \"expandtoline\", // ctrl-l ---> browser's default\n];\n\nconst getEditorIndent = (indent: Indent): EditorIndent => ({\n tab: indent.kind === \"tab\",\n width: indent.width ?? indent.custom,\n});\n\nexport const Edit: React.FC = (props) => {\n const editor = useEditor({\n config: { value: props.value, mode: \"ace/mode/xml\" },\n removeCommands,\n });\n\n const {\n onChange: editorOnChange,\n addCommand: editorAddCommand,\n getValue: editorGetValue,\n setValue: editorSetValue,\n setIndent: editorSetIndent,\n } = editor;\n\n const { setValue: propsSetValue } = props;\n\n React.useEffect(() => {\n return editorOnChange((params) => propsSetValue(params.value));\n }, [editorOnChange, propsSetValue]);\n\n const { indent } = props.prefs;\n const format = React.useCallback(async () => {\n try {\n const next = await xmlFormat(editorGetValue() ?? \"\", indent);\n editorSetValue(next);\n editorSetIndent(getEditorIndent(indent));\n } catch (e) {\n window.alert(`Cannot format: ${e.message}`);\n }\n }, [editorGetValue, editorSetValue, editorSetIndent, indent]);\n\n React.useEffect(() => {\n const key = { mac: \"cmd-enter\", win: \"ctrl-enter\" };\n return editorAddCommand({ key, name: \"format\", fn: format });\n }, [editorAddCommand, format]);\n\n const uglify = React.useCallback(async () => {\n try {\n const next = await xmlFormat(editorGetValue() ?? \"\");\n editorSetValue(next);\n } catch (e) {\n window.alert(`Cannot format: ${e.message}`);\n }\n }, [editorGetValue, editorSetValue]);\n\n const toolbar = (\n \n );\n return (\n
\n \n
{toolbar}
\n \n
\n \n
\n
\n );\n};\n","import React from \"react\";\n\nimport { ThemeSelect, About } from \"@tableplus/toolkit\";\nimport { DivGrow } from \"@moai/core\";\nimport { Prefs } from \"prefs/prefs\";\n\nimport s from \"./toolbar.module.scss\";\n\ninterface Props {\n prefs: Prefs;\n}\n\nexport const Toolbar: React.FC = ({ prefs }) => (\n
\n \n \n \n
\n);\n","import React from \"react\";\n\nimport s from \"./primitive.module.scss\";\nimport { DivPx } from \"@moai/core\";\n\ntype Value = boolean | number | string | null;\n\ninterface Props {\n name?: string;\n node: Value;\n}\n\nexport const isPrimitive = (value: any): value is Value => {\n if (value === null) return true;\n return [\"boolean\", \"number\", \"string\"].includes(typeof value);\n};\n\nconst getCls = (value: Value) => (value === null ? s.null : s[typeof value]);\n\nconst getString = (value: Value): string => {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"boolean\":\n return value ? \"true\" : \"false\";\n case \"number\":\n return value.toString();\n case \"string\":\n return `\"${value}\"`;\n }\n};\n\nexport const PrimitiveNode: React.FC = ({ name, node: value }) => (\n
\n {name && (\n <>\n
{name}:
\n \n \n )}\n
{getString(value)}
\n
\n);\n","import React from \"react\";\n\nimport { DivPx } from \"@moai/core\";\nimport s from \"./pipe.module.scss\";\nimport { Border } from \"@tableplus/toolkit\";\n\nconst Hor = () => (\n
\n \n
\n);\n\nconst Ver: React.FC<{ last: boolean }> = ({ last }) => (\n
\n \n \n
\n);\n\nexport const Pipe: React.FC<{ last: boolean }> = ({ last }) => (\n
\n \n \n
\n);\n","import { OptionsV2 } from \"xml2js\";\n\nexport const XML_OPTIONS: OptionsV2 = {\n explicitArray: false,\n attrkey: \"@attrs\",\n charkey: \"#text\",\n};\n","import React from \"react\";\nimport * as clipboard from \"clipboard-polyfill\";\nimport * as xml2js from \"xml2js\";\n\nimport { MapNode } from \"./map\";\nimport s from \"./more.module.scss\";\nimport sMap from \"./map.module.scss\";\nimport { XML_OPTIONS } from \"../xml-options\";\nimport { background } from \"@moai/core\";\n\ninterface Props {\n name: string;\n node: MapNode;\n setFoo: (foo: null | boolean) => void;\n}\n\nconst sanitize = (_node: MapNode, _name: string): object => {\n const nameNum = Number(_name);\n // @TODO: https://github.com/dvkndn/toolkit/issues/10\n const name = isNaN(nameNum) ? _name : `item${_name}`;\n // @TODO: we may not always really need to wrap?\n const node = { [name]: _node };\n // @TODO: same as #10, we need beter name (e.g. parent name)\n if (Array.isArray(_node)) return { [`${name}array`]: node };\n return node;\n};\n\nconst xmlBuilder = new xml2js.Builder(XML_OPTIONS);\n\nexport const MoreButton: React.FC = ({ name, node, setFoo }) => {\n const copy = React.useCallback(() => {\n try {\n const snode = sanitize(node, name);\n const text = xmlBuilder.buildObject(snode);\n clipboard.writeText(text);\n } catch (e) {\n window.alert(`Cannot copy: ${e.message}`);\n }\n }, [node, name]);\n\n const expand = React.useCallback(() => {\n setFoo(true);\n window.setTimeout(() => setFoo(null), 500);\n }, [setFoo]);\n\n const collapse = React.useCallback(() => {\n setFoo(false);\n window.setTimeout(() => setFoo(null), 500);\n }, [setFoo]);\n\n const onChange = React.useCallback(\n (e: React.ChangeEvent) => {\n switch (e.target.value) {\n case \"copy\":\n return copy();\n case \"expand\":\n return expand();\n case \"collapse\":\n return collapse();\n default:\n throw Error(`Unknown target: ${e.target.value}`);\n }\n },\n [copy, expand, collapse]\n );\n\n return (\n \n \n \n \n \n \n );\n};\n","import React from \"react\";\n\nimport s from \"./map.module.scss\";\nimport { Node } from \"../node\";\nimport { Pipe } from \"./pipe\";\nimport { MoreButton } from \"./more\";\n\ninterface Item {\n name: string;\n node: any;\n}\n\nexport type MapNode = any[] | { [key: string]: any };\n\nexport type MapChildExpand = \"default\" | \"expand\" | \"collapse\";\n\ninterface Props {\n name: string;\n items: Item[];\n node: MapNode;\n}\n\nconst ToggleButton: React.FC<{\n expand: boolean;\n setExpand: (expand: boolean) => void;\n children: string;\n}> = ({ expand, setExpand, children }) => (\n \n);\n\nconst renderItem = (item: Item, index: number, arr: Item[]) => (\n
  • \n \n \n
  • \n);\n\n// Using object here on purpose so we can expand a previously expanded tree\nconst FooContext = React.createContext(null);\n\nexport const MapNode: React.FC = ({ node, name, items }) => {\n const [expand, setExpand] = React.useState(items.length < 4);\n const [foo, setFoo] = React.useState(null);\n const fooContext = React.useContext(FooContext);\n\n React.useEffect(() => {\n setFoo(fooContext);\n if (fooContext !== null) setExpand(fooContext);\n }, [fooContext]);\n\n React.useEffect(() => {\n if (foo !== null) setExpand(foo);\n }, [foo]);\n\n return (\n \n
    \n
    \n \n {name}\n \n \n
    \n {expand &&
      {items.map(renderItem)}
    }\n
    \n
    \n );\n};\n","import React from \"react\";\n\nimport { PrimitiveNode, isPrimitive } from \"./primitive\";\nimport s from \"./node.module.scss\";\nimport { MapNode } from \"./map/map\";\n\ninterface Props {\n name: string;\n node: any;\n}\n\nconst ObjectNode: React.FC = (props) => {\n const items = Object.keys(props.node).map((key) => ({\n name: key,\n node: props.node[key],\n }));\n return ;\n};\n\nconst ArrayNode: React.FC = (props) => {\n if (!Array.isArray(props.node)) throw Error(\"nodes must be an array\");\n const items = props.node.map((node, index) => ({\n parentName: props.name,\n name: index.toString(),\n node,\n }));\n return ;\n};\n\nconst NodeBody: React.FC = (props) => {\n if (isPrimitive(props.node)) return ;\n if (Array.isArray(props.node)) return ;\n return ;\n};\n\nexport const Node: React.FC = (props) => (\n
    \n \n
    \n);\n","import React from \"react\";\nimport * as xml2js from \"xml2js\";\n\nimport { Paragraph, DivPx } from \"@moai/core\";\nimport { Node } from \"./node\";\nimport s from \"./tree.module.scss\";\nimport { XML_OPTIONS } from \"./xml-options\";\n\ninterface Props {\n value: string;\n}\n\nconst xmlParser = new xml2js.Parser(XML_OPTIONS);\n\nconst parseXML = async (\n text: string,\n setError: React.Dispatch>,\n setNode: React.Dispatch>\n) => {\n try {\n const node = await xmlParser.parseStringPromise(text);\n setError(null);\n setNode(node);\n } catch (error) {\n setError(error.message);\n }\n};\n\nconst useNode = (text: string) => {\n const [error, setError] = React.useState(null);\n const [node, setNode] = React.useState({});\n\n React.useEffect(() => {\n parseXML(text, setError, setNode);\n }, [text]);\n\n return { error, node };\n};\n\nconst ErrorMsg: React.FC<{ error: string }> = ({ error }) => (\n <>\n
    \n \n \n ❗\n \n {error}\n \n
    \n \n \n);\n\nexport const Tree: React.FC = ({ value }) => {\n const { node, error } = useNode(value);\n\n return (\n
    \n {error && }\n
    \n \n
    \n
    \n );\n};\n","import React from \"react\";\n\nimport { Toolbar } from \"./toolbar/toolbar\";\nimport s from \"./view.module.scss\";\nimport { DivPx } from \"@moai/core\";\nimport { Prefs } from \"prefs/prefs\";\nimport { Tree } from \"./tree/tree\";\nimport { Border } from \"@tableplus/toolkit\";\n\ninterface Props {\n prefs: Prefs;\n value: string;\n}\n\nexport const View: React.FC = ({ prefs, value }) => {\n return (\n
    \n
    \n \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n );\n};\n","const samples = [\n `\n \n Gambardella, Matthew XML Developer's Guide Computer 44.95 2000-10-01 An in-depth look at creating applications with XML. \n Ralls, Kim Midnight Rain Fantasy 5.95 2000-12-16 A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. \n Corets, Eva Maeve Ascendant Fantasy 5.95 2000-11-17 After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society. \n Corets, Eva Oberon's Legacy Fantasy 5.95 2001-03-10 In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant. \n Corets, Eva The Sundered Grail Fantasy 5.95 2001-09-10 The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon's Legacy. \n Randall, Cynthia Lover Birds Romance 4.95 2000-09-02 When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled. \n Thurman, Paula Splish Splash Romance 4.95 2000-11-02 A deep sea diver finds true love twenty thousand leagues beneath the sea. \n `\n];\n\nexport const getRandomSample: () => string = () =>\n samples[Math.floor(Math.random() * samples.length)];\n","import React from \"react\";\n\nimport { useStorage } from \"@tableplus/toolkit\";\nimport { Border, Footer, ResizeDiv } from \"@tableplus/toolkit\";\nimport { scrollbar } from \"@moai/core\";\nimport { Edit } from \"./edit/edit\";\nimport { View } from \"./view/view\";\nimport { usePrefs } from \"../prefs/prefs\";\nimport { getRandomSample } from \"./sample\";\nimport s from \"./app.module.scss\";\n\nconst fallback = getRandomSample();\n\nexport const App = () => {\n const prefs = usePrefs();\n const [value, setValue] = useStorage(\"value\", fallback);\n const [width, setWidth] = useStorage(\"width\", 0.5);\n\n const body = (\n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n );\n\n return (\n
    \n {body}\n \n
    \n
    \n
    \n
    \n );\n};\n","import { IndentState, useIndent, useTheme, SetState } from \"@tableplus/toolkit\";\n\nexport interface Prefs extends IndentState {\n theme: string;\n setTheme: SetState;\n}\n\nexport const usePrefs = (): Prefs => {\n const indent = useIndent();\n const { theme, setTheme } = useTheme();\n return { theme, setTheme, ...indent };\n};\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport { AppStorage, StorageContext } from \"@tableplus/toolkit\";\nimport { App } from \"./app/app\";\n\nconst storage = new AppStorage(\"xml\");\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n"],"sourceRoot":""}