!7 please include function mL. cmodule2 MechLists > DynCalculatedList { SS listToMD5; transient ReliableSingleThread rst = new(r downloadAll); transient bool authed; switchable double downloadInterval = 10.0; visualize { JComponent c = super.visualize(); onDoubleClickOrEnter(list, voidfunc(S listName) { showText(listName, mechList_raw_localCopy(listName)) }); if (!authed) ret c; ret withLeftAlignedButtonsOnTop(c, "Create...", r createList); } start { set serverMechList_raw_fresh_verbose; setModuleName("Mech Lists With Text" + trueFalseNull(authed = mech_authedOnServer(), " [Authed]", " [Not Authed]", "")); actualCalc(); if (!isTrue(vm_generalMap_get('noMechDownload))) doEvery(5.0, downloadInterval, rst); bot("Mech Lists Mirror."); dm_registerMainClassAs mechListsHolder(); } void actualCalc { setField(results := sortedIC(keys(listToMD5))); } L calc() { ret results; } void downloadAll { // TODO: transmit timestamp and get only changes L l = mechListMD5sAndStatuses_fresh(); new HashMap listToMD5; for (LS x : l) { S name = first(x); listToMD5.put(name, second(x)); saveTextFileIfDifferent(remoteMechListMirrorMetaFile(name), struct(litmap("Name" := name, "Status" := third(x)))); } deleteLocalMechListCopiesOtherThan(keys(listToMD5)); setField(+listToMD5); actualCalc(); mechList_completeLocalCopies(listToMD5); } void createList enter { inputText("List Name", voidfunc(S name) { if (emptyAfterTrim(name)) ret; createMechList(trim(name)); rst.trigger(); }); } }