diff --git a/client/src/cmdlfawid.c b/client/src/cmdlfawid.c index 81556b357..7d944df25 100644 --- a/client/src/cmdlfawid.c +++ b/client/src/cmdlfawid.c @@ -568,7 +568,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "this help"}, {"demod", CmdAWIDDemod, AlwaysAvailable, "demodulate an AWID FSK tag from the GraphBuffer"}, {"reader", CmdAWIDReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdAWIDClone, IfPm3Lf, "clone AWID tag to T55x7 or Q5/T5555"}, + {"clone", CmdAWIDClone, IfPm3Lf, "clone AWID tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdAWIDSim, IfPm3Lf, "simulate AWID tag"}, {"brute", CmdAWIDBrute, IfPm3Lf, "bruteforce card number against reader"}, {"watch", CmdAWIDWatch, IfPm3Lf, "continuously watch for cards. Reader mode"}, diff --git a/client/src/cmdlfdestron.c b/client/src/cmdlfdestron.c index 0f0b782c5..52a0b736b 100644 --- a/client/src/cmdlfdestron.c +++ b/client/src/cmdlfdestron.c @@ -238,7 +238,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdDestronDemod, AlwaysAvailable, "demodulate an Destron tag from the GraphBuffer"}, {"reader", CmdDestronReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdDestronClone, IfPm3Lf, "clone Destron tag to T55x7"}, + {"clone", CmdDestronClone, IfPm3Lf, "clone Destron tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdDestronSim, IfPm3Lf, "simulate Destron tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfem410x.c b/client/src/cmdlfem410x.c index 2354de4d0..51fa79674 100644 --- a/client/src/cmdlfem410x.c +++ b/client/src/cmdlfem410x.c @@ -745,7 +745,7 @@ static command_t CommandTable[] = { {"brute", CmdEM410xBrute, IfPm3Lf, "reader bruteforce attack by simulating EM410x tags"}, {"watch", CmdEM410xWatch, IfPm3Lf, "watches for EM410x 125/134 kHz tags"}, {"spoof", CmdEM410xSpoof, IfPm3Lf, "watches for EM410x 125/134 kHz tags, and replays them" }, - {"clone", CmdEM410xClone, IfPm3Lf, "write EM410x Tag ID to T55x7 or Q5/T5555 tag"}, + {"clone", CmdEM410xClone, IfPm3Lf, "clone EM410x Tag ID to T55x7, Q5/T5555 or EM4305/4469"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfem4x05.c b/client/src/cmdlfem4x05.c index a23db1bad..65db29ed5 100644 --- a/client/src/cmdlfem4x05.c +++ b/client/src/cmdlfem4x05.c @@ -58,6 +58,40 @@ static const char *em4x69_annotation [] = {"Info", "UID", "Password", "Lock", "C static int CmdHelp(const char *Cmd); +static int CmdEM4x05CloneHelp(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "lf em 4x05 clonehelp", + "Display a list of available commands for cloning specific techs on EM4305/4469 tags", + "lf em 4x05 clonehelp" + ); + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + PrintAndLogEx(NORMAL, "For cloning specific techs on EM4305/4469 tags, see commands available in corresponding LF sub-menus, e.g.:"); + PrintAndLogEx(NORMAL, _GREEN_("lf awid clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf destron clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf em 410x clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf fdxb clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf gallagher clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf hid clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf jablotron clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf keri clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf nedap clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf nexwatch clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf noralsy clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf pac clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf paradox clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf presco clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf pyramid clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf securakey clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf viking clone --em")); + PrintAndLogEx(NORMAL, _GREEN_("lf visa2000 clone --em")); + return PM3_SUCCESS; +} + // 1 = EM4x69 // 2 = EM4x05 static em_tech_type_t em_get_card_type(uint32_t config) { @@ -2496,7 +2530,7 @@ int CmdEM4x05Sniff(const char *Cmd) { static int CmdEM4x05View(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "lf em ex05 view", + CLIParserInit(&ctx, "lf em 4x05 view", "Print a EM4205/4305/4369/4469 dump file\n" "note:\n" "We don't track if password is known in current dump file formats.\n" @@ -2552,7 +2586,7 @@ static int CmdEM4x05View(const char *Cmd) { static int CmdEM4x05Config(const char *Cmd) { CLIParserContext *ctx; - CLIParserInit(&ctx, "lf em ex05 config", + CLIParserInit(&ctx, "lf em 4x05 config", "Create common configuration blocks", "lf em 4x05 config" ); @@ -2595,21 +2629,22 @@ static int CmdEM4x05Config(const char *Cmd) { } static command_t CommandTable[] = { - {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("General") " -----------------------"}, - {"help", CmdHelp, AlwaysAvailable, "This help"}, - {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("Operations") " -----------------------"}, - {"brute", CmdEM4x05Brute, IfPm3Lf, "Bruteforce password"}, - {"chk", CmdEM4x05Chk, IfPm3Lf, "Check passwords from dictionary"}, - {"config", CmdEM4x05Config, AlwaysAvailable, "Create common configuration words"}, - {"demod", CmdEM4x05Demod, AlwaysAvailable, "Demodulate a EM4x05/EM4x69 tag from the GraphBuffer"}, - {"dump", CmdEM4x05Dump, IfPm3Lf, "Dump EM4x05/EM4x69 tag"}, - {"info", CmdEM4x05Info, IfPm3Lf, "Tag information"}, - {"read", CmdEM4x05Read, IfPm3Lf, "Read word data from EM4x05/EM4x69"}, - {"sniff", CmdEM4x05Sniff, AlwaysAvailable, "Attempt to recover em4x05 commands from sample buffer"}, - {"unlock", CmdEM4x05Unlock, IfPm3Lf, "Execute tear off against EM4x05/EM4x69"}, - {"view", CmdEM4x05View, AlwaysAvailable, "Display content from tag dump file"}, - {"wipe", CmdEM4x05Wipe, IfPm3Lf, "Wipe EM4x05/EM4x69 tag"}, - {"write", CmdEM4x05Write, IfPm3Lf, "Write word data to EM4x05/EM4x69"}, + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("General") " -----------------------"}, + {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("Operations") " -----------------------"}, + {"clonehelp", CmdEM4x05CloneHelp, IfPm3Lf, "Shows the available clone commands"}, + {"brute", CmdEM4x05Brute, IfPm3Lf, "Bruteforce password"}, + {"chk", CmdEM4x05Chk, IfPm3Lf, "Check passwords from dictionary"}, + {"config", CmdEM4x05Config, AlwaysAvailable, "Create common configuration words"}, + {"demod", CmdEM4x05Demod, AlwaysAvailable, "Demodulate a EM4x05/EM4x69 tag from the GraphBuffer"}, + {"dump", CmdEM4x05Dump, IfPm3Lf, "Dump EM4x05/EM4x69 tag"}, + {"info", CmdEM4x05Info, IfPm3Lf, "Tag information"}, + {"read", CmdEM4x05Read, IfPm3Lf, "Read word data from EM4x05/EM4x69"}, + {"sniff", CmdEM4x05Sniff, AlwaysAvailable, "Attempt to recover em4x05 commands from sample buffer"}, + {"unlock", CmdEM4x05Unlock, IfPm3Lf, "Execute tear off against EM4x05/EM4x69"}, + {"view", CmdEM4x05View, AlwaysAvailable, "Display content from tag dump file"}, + {"wipe", CmdEM4x05Wipe, IfPm3Lf, "Wipe EM4x05/EM4x69 tag"}, + {"write", CmdEM4x05Write, IfPm3Lf, "Write word data to EM4x05/EM4x69"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlffdxb.c b/client/src/cmdlffdxb.c index 25b8cdfcc..694423095 100644 --- a/client/src/cmdlffdxb.c +++ b/client/src/cmdlffdxb.c @@ -889,7 +889,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "this help"}, {"demod", CmdFdxBDemod, AlwaysAvailable, "demodulate a FDX-B ISO11784/85 tag from the GraphBuffer"}, {"reader", CmdFdxBReader, IfPm3Lf, "attempt to read at 134kHz and extract tag data"}, - {"clone", CmdFdxBClone, IfPm3Lf, "clone animal ID tag to T55x7 or Q5/T5555"}, + {"clone", CmdFdxBClone, IfPm3Lf, "clone animal ID tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdFdxBSim, IfPm3Lf, "simulate Animal ID tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfgallagher.c b/client/src/cmdlfgallagher.c index d715e949e..f2bd45af3 100644 --- a/client/src/cmdlfgallagher.c +++ b/client/src/cmdlfgallagher.c @@ -380,7 +380,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdGallagherDemod, AlwaysAvailable, "demodulate an GALLAGHER tag from the GraphBuffer"}, {"reader", CmdGallagherReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdGallagherClone, IfPm3Lf, "clone GALLAGHER tag to T55x7"}, + {"clone", CmdGallagherClone, IfPm3Lf, "clone GALLAGHER tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdGallagherSim, IfPm3Lf, "simulate GALLAGHER tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfhid.c b/client/src/cmdlfhid.c index 87680635c..b5ae61d6a 100644 --- a/client/src/cmdlfhid.c +++ b/client/src/cmdlfhid.c @@ -679,7 +679,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "this help"}, {"demod", CmdHIDDemod, AlwaysAvailable, "demodulate HID Prox tag from the GraphBuffer"}, {"reader", CmdHIDReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdHIDClone, IfPm3Lf, "clone HID tag to T55x7"}, + {"clone", CmdHIDClone, IfPm3Lf, "clone HID tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdHIDSim, IfPm3Lf, "simulate HID tag"}, {"brute", CmdHIDBrute, IfPm3Lf, "bruteforce facility code or card number against reader"}, {"watch", CmdHIDWatch, IfPm3Lf, "continuously watch for cards. Reader mode"}, diff --git a/client/src/cmdlfjablotron.c b/client/src/cmdlfjablotron.c index 2f873e2bf..2651ebe51 100644 --- a/client/src/cmdlfjablotron.c +++ b/client/src/cmdlfjablotron.c @@ -310,7 +310,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdJablotronDemod, AlwaysAvailable, "demodulate an Jablotron tag from the GraphBuffer"}, {"reader", CmdJablotronReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdJablotronClone, IfPm3Lf, "clone jablotron tag to T55x7 or Q5/T5555"}, + {"clone", CmdJablotronClone, IfPm3Lf, "clone jablotron tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdJablotronSim, IfPm3Lf, "simulate jablotron tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfkeri.c b/client/src/cmdlfkeri.c index bd8b1b220..b21a2deb4 100644 --- a/client/src/cmdlfkeri.c +++ b/client/src/cmdlfkeri.c @@ -369,7 +369,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdKeriDemod, AlwaysAvailable, "demodulate an KERI tag from the GraphBuffer"}, {"reader", CmdKeriReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdKeriClone, IfPm3Lf, "clone KERI tag to T55x7 or Q5/T5555"}, + {"clone", CmdKeriClone, IfPm3Lf, "clone KERI tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdKeriSim, IfPm3Lf, "simulate KERI tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfnedap.c b/client/src/cmdlfnedap.c index 600f55fc1..a844711d9 100644 --- a/client/src/cmdlfnedap.c +++ b/client/src/cmdlfnedap.c @@ -563,7 +563,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdLFNedapDemod, AlwaysAvailable, "demodulate Nedap tag from the GraphBuffer"}, {"reader", CmdLFNedapReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdLFNedapClone, IfPm3Lf, "clone Nedap tag to T55x7 or Q5/T5555"}, + {"clone", CmdLFNedapClone, IfPm3Lf, "clone Nedap tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdLFNedapSim, IfPm3Lf, "simulate Nedap tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfnexwatch.c b/client/src/cmdlfnexwatch.c index b943db9c3..06a1dce44 100644 --- a/client/src/cmdlfnexwatch.c +++ b/client/src/cmdlfnexwatch.c @@ -569,7 +569,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdNexWatchDemod, AlwaysAvailable, "demodulate a NexWatch tag (nexkey, quadrakey) from the GraphBuffer"}, {"reader", CmdNexWatchReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdNexWatchClone, IfPm3Lf, "clone NexWatch tag to T55x7"}, + {"clone", CmdNexWatchClone, IfPm3Lf, "clone NexWatch tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdNexWatchSim, IfPm3Lf, "simulate NexWatch tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfnoralsy.c b/client/src/cmdlfnoralsy.c index f05c1a286..562cca539 100644 --- a/client/src/cmdlfnoralsy.c +++ b/client/src/cmdlfnoralsy.c @@ -281,7 +281,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdNoralsyDemod, AlwaysAvailable, "demodulate an Noralsy tag from the GraphBuffer"}, {"reader", CmdNoralsyReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdNoralsyClone, IfPm3Lf, "clone Noralsy tag to T55x7 or Q5/T5555"}, + {"clone", CmdNoralsyClone, IfPm3Lf, "clone Noralsy tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdNoralsySim, IfPm3Lf, "simulate Noralsy tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfpac.c b/client/src/cmdlfpac.c index 2f9267e92..86ffebd4c 100644 --- a/client/src/cmdlfpac.c +++ b/client/src/cmdlfpac.c @@ -391,7 +391,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdPacDemod, AlwaysAvailable, "demodulate a PAC tag from the GraphBuffer"}, {"reader", CmdPacReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdPacClone, IfPm3Lf, "clone PAC tag to T55x7"}, + {"clone", CmdPacClone, IfPm3Lf, "clone PAC tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdPacSim, IfPm3Lf, "simulate PAC tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfparadox.c b/client/src/cmdlfparadox.c index 85832408b..937f11510 100644 --- a/client/src/cmdlfparadox.c +++ b/client/src/cmdlfparadox.c @@ -471,7 +471,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdParadoxDemod, AlwaysAvailable, "demodulate a Paradox FSK tag from the GraphBuffer"}, {"reader", CmdParadoxReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdParadoxClone, IfPm3Lf, "clone paradox tag"}, + {"clone", CmdParadoxClone, IfPm3Lf, "clone paradox tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdParadoxSim, IfPm3Lf, "simulate paradox tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfpresco.c b/client/src/cmdlfpresco.c index f256726ca..bc816a79f 100644 --- a/client/src/cmdlfpresco.c +++ b/client/src/cmdlfpresco.c @@ -357,7 +357,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdPrescoDemod, AlwaysAvailable, "demodulate Presco tag from the GraphBuffer"}, {"reader", CmdPrescoReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdPrescoClone, IfPm3Lf, "clone presco tag to T55x7 or Q5/T5555"}, + {"clone", CmdPrescoClone, IfPm3Lf, "clone presco tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdPrescoSim, IfPm3Lf, "simulate presco tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfpyramid.c b/client/src/cmdlfpyramid.c index 2ec65657c..3d711c23d 100644 --- a/client/src/cmdlfpyramid.c +++ b/client/src/cmdlfpyramid.c @@ -444,7 +444,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "this help"}, {"demod", CmdPyramidDemod, AlwaysAvailable, "demodulate a Pyramid FSK tag from the GraphBuffer"}, {"reader", CmdPyramidReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdPyramidClone, IfPm3Lf, "clone pyramid tag to T55x7 or Q5/T5555"}, + {"clone", CmdPyramidClone, IfPm3Lf, "clone pyramid tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdPyramidSim, IfPm3Lf, "simulate pyramid tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfsecurakey.c b/client/src/cmdlfsecurakey.c index 3c3983005..e20968a5e 100644 --- a/client/src/cmdlfsecurakey.c +++ b/client/src/cmdlfsecurakey.c @@ -294,7 +294,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdSecurakeyDemod, AlwaysAvailable, "demodulate an Securakey tag from the GraphBuffer"}, {"reader", CmdSecurakeyReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdSecurakeyClone, IfPm3Lf, "clone Securakey tag to T55x7"}, + {"clone", CmdSecurakeyClone, IfPm3Lf, "clone Securakey tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdSecurakeySim, IfPm3Lf, "simulate Securakey tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfviking.c b/client/src/cmdlfviking.c index 50facc9b7..3ed4c83fb 100644 --- a/client/src/cmdlfviking.c +++ b/client/src/cmdlfviking.c @@ -242,7 +242,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdVikingDemod, AlwaysAvailable, "demodulate a Viking tag from the GraphBuffer"}, {"reader", CmdVikingReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdVikingClone, IfPm3Lf, "clone Viking tag to T55x7 or Q5/T5555"}, + {"clone", CmdVikingClone, IfPm3Lf, "clone Viking tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdVikingSim, IfPm3Lf, "simulate Viking tag"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdlfvisa2000.c b/client/src/cmdlfvisa2000.c index 2c77fa1d3..681598c69 100644 --- a/client/src/cmdlfvisa2000.c +++ b/client/src/cmdlfvisa2000.c @@ -295,7 +295,7 @@ static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, {"demod", CmdVisa2kDemod, AlwaysAvailable, "demodulate an VISA2000 tag from the GraphBuffer"}, {"reader", CmdVisa2kReader, IfPm3Lf, "attempt to read and extract tag data"}, - {"clone", CmdVisa2kClone, IfPm3Lf, "clone Visa2000 tag to T55x7 or Q5/T5555"}, + {"clone", CmdVisa2kClone, IfPm3Lf, "clone Visa2000 tag to T55x7, Q5/T5555 or EM4305/4469"}, {"sim", CmdVisa2kSim, IfPm3Lf, "simulate Visa2000 tag"}, {NULL, NULL, NULL, NULL} };