| #!/bin/bash | 
 | # Copyright 2021 The Fuchsia Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | #### CATEGORY=Device management | 
 | ### find other names for the same node | 
 |  | 
 | ## usage: fx node-names HOSTNAME | 
 | ## | 
 | ## Prints other names a node may have had based on the generated hostnames. | 
 | ## hostname can be: | 
 | ##   -  a gen 1 name like fs-0123-4567-89ab | 
 | ## | 
 | ## Gen 0 names (step-atom-yard-juicy) aren't forward-mappable into new name. | 
 |  | 
 | set -euo pipefail | 
 |  | 
 | # matches //src/bringup/bin/device-name-provider/name_tokens.h | 
 | nameTokens=( | 
 |     "acid"   "acorn"  "acre"   "acts"   "afar"   "affix"  "aged"   "agent"  "agile"  "aging" | 
 |     "agony"  "ahead"  "aide"   "aids"   "aim"    "ajar"   "alarm"  "alias"  "alibi"  "alien" | 
 |     "alike"  "alive"  "aloe"   "aloft"  "aloha"  "alone"  "amend"  "amino"  "ample"  "amuse" | 
 |     "angel"  "anger"  "angle"  "ankle"  "apple"  "april"  "apron"  "aqua"   "area"   "arena" | 
 |     "argue"  "arise"  "armed"  "armor"  "army"   "aroma"  "array"  "arson"  "art"    "ashen" | 
 |     "ashes"  "atlas"  "atom"   "attic"  "audio"  "avert"  "avoid"  "awake"  "award"  "awoke" | 
 |     "axis"   "bacon"  "badge"  "bagel"  "baggy"  "baked"  "baker"  "balmy"  "banjo"  "barge" | 
 |     "barn"   "bash"   "basil"  "bask"   "batch"  "bath"   "baton"  "bats"   "blade"  "blank" | 
 |     "blast"  "blaze"  "bleak"  "blend"  "bless"  "blimp"  "blink"  "bloat"  "blob"   "blog" | 
 |     "blot"   "blunt"  "blurt"  "blush"  "boast"  "boat"   "body"   "boil"   "bok"    "bolt" | 
 |     "boned"  "boney"  "bonus"  "bony"   "book"   "booth"  "boots"  "boss"   "botch"  "both" | 
 |     "boxer"  "breed"  "bribe"  "brick"  "bride"  "brim"   "bring"  "brink"  "brisk"  "broad" | 
 |     "broil"  "broke"  "brook"  "broom"  "brush"  "buck"   "bud"    "buggy"  "bulge"  "bulk" | 
 |     "bully"  "bunch"  "bunny"  "bunt"   "bush"   "bust"   "busy"   "buzz"   "cable"  "cache" | 
 |     "cadet"  "cage"   "cake"   "calm"   "cameo"  "canal"  "candy"  "cane"   "canon"  "cape" | 
 |     "card"   "cargo"  "carol"  "carry"  "carve"  "case"   "cash"   "cause"  "cedar"  "chain" | 
 |     "chair"  "chant"  "chaos"  "charm"  "chase"  "cheek"  "cheer"  "chef"   "chess"  "chest" | 
 |     "chew"   "chief"  "chili"  "chill"  "chip"   "chomp"  "chop"   "chow"   "chuck"  "chump" | 
 |     "chunk"  "churn"  "chute"  "cider"  "cinch"  "city"   "civic"  "civil"  "clad"   "claim" | 
 |     "clamp"  "clap"   "clash"  "clasp"  "class"  "claw"   "clay"   "clean"  "clear"  "cleat" | 
 |     "cleft"  "clerk"  "click"  "cling"  "clink"  "clip"   "cloak"  "clock"  "clone"  "cloth" | 
 |     "cloud"  "clump"  "coach"  "coast"  "coat"   "cod"    "coil"   "coke"   "cola"   "cold" | 
 |     "colt"   "coma"   "come"   "comic"  "comma"  "cone"   "cope"   "copy"   "coral"  "cork" | 
 |     "cost"   "cot"    "couch"  "cough"  "cover"  "cozy"   "craft"  "cramp"  "crane"  "crank" | 
 |     "crate"  "crave"  "crawl"  "creek"  "creme"  "crepe"  "crept"  "crib"   "cried"  "crisp" | 
 |     "crook"  "crop"   "cross"  "crowd"  "crown"  "crumb"  "crush"  "crust"  "cub"    "cult" | 
 |     "cupid"  "cure"   "curl"   "curry"  "curse"  "curve"  "curvy"  "cushy"  "cut"    "cycle" | 
 |     "dab"    "dad"    "daily"  "dairy"  "daisy"  "dance"  "dandy"  "darn"   "dart"   "dash" | 
 |     "data"   "date"   "dawn"   "deaf"   "deal"   "dean"   "debit"  "debt"   "debug"  "decaf" | 
 |     "decal"  "decay"  "deck"   "decor"  "decoy"  "deed"   "delay"  "denim"  "dense"  "dent" | 
 |     "depth"  "derby"  "desk"   "dial"   "diary"  "dice"   "dig"    "dill"   "dime"   "dimly" | 
 |     "diner"  "dingy"  "disco"  "dish"   "disk"   "ditch"  "ditzy"  "dizzy"  "dock"   "dodge" | 
 |     "doing"  "doll"   "dome"   "donor"  "donut"  "dose"   "dot"    "dove"   "down"   "dowry" | 
 |     "doze"   "drab"   "drama"  "drank"  "draw"   "dress"  "dried"  "drift"  "drill"  "drive" | 
 |     "drone"  "droop"  "drove"  "drown"  "drum"   "dry"    "duck"   "duct"   "dude"   "dug" | 
 |     "duke"   "duo"    "dusk"   "dust"   "duty"   "dwarf"  "dwell"  "eagle"  "early"  "earth" | 
 |     "easel"  "east"   "eaten"  "eats"   "ebay"   "ebony"  "ebook"  "echo"   "edge"   "eel" | 
 |     "eject"  "elbow"  "elder"  "elf"    "elk"    "elm"    "elope"  "elude"  "elves"  "email" | 
 |     "emit"   "empty"  "emu"    "enter"  "entry"  "envoy"  "equal"  "erase"  "error"  "erupt" | 
 |     "essay"  "etch"   "evade"  "even"   "evict"  "evil"   "evoke"  "exact"  "exit"   "fable" | 
 |     "faced"  "fact"   "fade"   "fall"   "false"  "fancy"  "fang"   "fax"    "feast"  "feed" | 
 |     "femur"  "fence"  "fend"   "ferry"  "feta"   "fetch"  "fever"  "fiber"  "fifth"  "fifty" | 
 |     "film"   "filth"  "final"  "finch"  "fit"    "five"   "flag"   "flaky"  "flame"  "flap" | 
 |     "flask"  "fled"   "flick"  "fling"  "flint"  "flip"   "flirt"  "float"  "flock"  "flop" | 
 |     "floss"  "flyer"  "foam"   "foe"    "fog"    "foil"   "folic"  "folk"   "food"   "fool" | 
 |     "found"  "fox"    "foyer"  "frail"  "frame"  "fray"   "fresh"  "fried"  "frill"  "frisk" | 
 |     "from"   "front"  "frost"  "froth"  "frown"  "froze"  "fruit"  "gag"    "gains"  "gala" | 
 |     "game"   "gap"    "gas"    "gave"   "gear"   "gecko"  "geek"   "gem"    "genre"  "gift" | 
 |     "gig"    "gills"  "given"  "giver"  "glad"   "glass"  "glide"  "gloss"  "glove"  "glow" | 
 |     "glue"   "goal"   "going"  "golf"   "gong"   "good"   "gooey"  "goofy"  "gore"   "gown" | 
 |     "grab"   "grain"  "grant"  "grape"  "graph"  "grasp"  "grass"  "grave"  "gravy"  "gray" | 
 |     "green"  "greet"  "grew"   "grid"   "grief"  "grill"  "grip"   "grit"   "groom"  "grope" | 
 |     "growl"  "grub"   "grunt"  "guide"  "gulf"   "gulp"   "gummy"  "guru"   "gush"   "gut" | 
 |     "guy"    "habit"  "half"   "halo"   "halt"   "happy"  "harm"   "hash"   "hasty"  "hatch" | 
 |     "hate"   "haven"  "hazel"  "hazy"   "heap"   "heat"   "heave"  "hedge"  "hefty"  "help" | 
 |     "herbs"  "hers"   "hub"    "hug"    "hula"   "hull"   "human"  "humid"  "hump"   "hung" | 
 |     "hunk"   "hunt"   "hurry"  "hurt"   "hush"   "hut"    "ice"    "icing"  "icon"   "icy" | 
 |     "igloo"  "image"  "ion"    "iron"   "islam"  "issue"  "item"   "ivory"  "ivy"    "jab" | 
 |     "jam"    "jaws"   "jazz"   "jeep"   "jelly"  "jet"    "jiffy"  "job"    "jog"    "jolly" | 
 |     "jolt"   "jot"    "joy"    "judge"  "juice"  "juicy"  "july"   "jumbo"  "jump"   "junky" | 
 |     "juror"  "jury"   "keep"   "keg"    "kept"   "kick"   "kilt"   "king"   "kite"   "kitty" | 
 |     "kiwi"   "knee"   "knelt"  "koala"  "kung"   "ladle"  "lady"   "lair"   "lake"   "lance" | 
 |     "land"   "lapel"  "large"  "lash"   "lasso"  "last"   "latch"  "late"   "lazy"   "left" | 
 |     "legal"  "lemon"  "lend"   "lens"   "lent"   "level"  "lever"  "lid"    "life"   "lift" | 
 |     "lilac"  "lily"   "limb"   "limes"  "line"   "lint"   "lion"   "lip"    "list"   "lived" | 
 |     "liver"  "lunar"  "lunch"  "lung"   "lurch"  "lure"   "lurk"   "lying"  "lyric"  "mace" | 
 |     "maker"  "malt"   "mama"   "mango"  "manor"  "many"   "map"    "march"  "mardi"  "marry" | 
 |     "mash"   "match"  "mate"   "math"   "moan"   "mocha"  "moist"  "mold"   "mom"    "moody" | 
 |     "mop"    "morse"  "most"   "motor"  "motto"  "mount"  "mouse"  "mousy"  "mouth"  "move" | 
 |     "movie"  "mower"  "mud"    "mug"    "mulch"  "mule"   "mull"   "mumbo"  "mummy"  "mural" | 
 |     "muse"   "music"  "musky"  "mute"   "nacho"  "nag"    "nail"   "name"   "nanny"  "nap" | 
 |     "navy"   "near"   "neat"   "neon"   "nerd"   "nest"   "net"    "next"   "niece"  "ninth" | 
 |     "nutty"  "oak"    "oasis"  "oat"    "ocean"  "oil"    "old"    "olive"  "omen"   "onion" | 
 |     "only"   "ooze"   "opal"   "open"   "opera"  "opt"    "otter"  "ouch"   "ounce"  "outer" | 
 |     "oval"   "oven"   "owl"    "ozone"  "pace"   "pagan"  "pager"  "palm"   "panda"  "panic" | 
 |     "pants"  "panty"  "paper"  "park"   "party"  "pasta"  "patch"  "path"   "patio"  "payer" | 
 |     "pecan"  "penny"  "pep"    "perch"  "perky"  "perm"   "pest"   "petal"  "petri"  "petty" | 
 |     "photo"  "plank"  "plant"  "plaza"  "plead"  "plot"   "plow"   "pluck"  "plug"   "plus" | 
 |     "poach"  "pod"    "poem"   "poet"   "pogo"   "point"  "poise"  "poker"  "polar"  "polio" | 
 |     "polka"  "polo"   "pond"   "pony"   "poppy"  "pork"   "poser"  "pouch"  "pound"  "pout" | 
 |     "power"  "prank"  "press"  "print"  "prior"  "prism"  "prize"  "probe"  "prong"  "proof" | 
 |     "props"  "prude"  "prune"  "pry"    "pug"    "pull"   "pulp"   "pulse"  "puma"   "punch" | 
 |     "punk"   "pupil"  "puppy"  "purr"   "purse"  "push"   "putt"   "quack"  "quake"  "query" | 
 |     "quiet"  "quill"  "quilt"  "quit"   "quota"  "quote"  "rabid"  "race"   "rack"   "radar" | 
 |     "radio"  "raft"   "rage"   "raid"   "rail"   "rake"   "rally"  "ramp"   "ranch"  "range" | 
 |     "rank"   "rant"   "rash"   "raven"  "reach"  "react"  "ream"   "rebel"  "recap"  "relax" | 
 |     "relay"  "relic"  "remix"  "repay"  "repel"  "reply"  "rerun"  "reset"  "rhyme"  "rice" | 
 |     "rich"   "ride"   "rigid"  "rigor"  "rinse"  "riot"   "ripen"  "rise"   "risk"   "ritzy" | 
 |     "rival"  "river"  "roast"  "robe"   "robin"  "rock"   "rogue"  "roman"  "romp"   "rope" | 
 |     "rover"  "royal"  "ruby"   "rug"    "ruin"   "rule"   "runny"  "rush"   "rust"   "rut" | 
 |     "sadly"  "sage"   "said"   "saint"  "salad"  "salon"  "salsa"  "salt"   "same"   "sandy" | 
 |     "santa"  "satin"  "sauna"  "saved"  "savor"  "sax"    "say"    "scale"  "scam"   "scan" | 
 |     "scare"  "scarf"  "scary"  "scoff"  "scold"  "scoop"  "scoot"  "scope"  "score"  "scorn" | 
 |     "scout"  "scowl"  "scrap"  "scrub"  "scuba"  "scuff"  "sect"   "sedan"  "self"   "send" | 
 |     "sepia"  "serve"  "set"    "seven"  "shack"  "shade"  "shady"  "shaft"  "shaky"  "sham" | 
 |     "shape"  "share"  "sharp"  "shed"   "sheep"  "sheet"  "shelf"  "shell"  "shine"  "shiny" | 
 |     "ship"   "shirt"  "shock"  "shop"   "shore"  "shout"  "shove"  "shown"  "showy"  "shred" | 
 |     "shrug"  "shun"   "shush"  "shut"   "shy"    "sift"   "silk"   "silly"  "silo"   "sip" | 
 |     "siren"  "sixth"  "size"   "skate"  "skew"   "skid"   "skier"  "skies"  "skip"   "skirt" | 
 |     "skit"   "sky"    "slab"   "slack"  "slain"  "slam"   "slang"  "slash"  "slate"  "slaw" | 
 |     "sled"   "sleek"  "sleep"  "sleet"  "slept"  "slice"  "slick"  "slimy"  "sling"  "slip" | 
 |     "slit"   "slob"   "slot"   "slug"   "slum"   "slurp"  "slush"  "small"  "smash"  "smell" | 
 |     "smile"  "smirk"  "smog"   "snack"  "snap"   "snare"  "snarl"  "sneak"  "sneer"  "sniff" | 
 |     "snore"  "snort"  "snout"  "snowy"  "snub"   "snuff"  "speak"  "speed"  "spend"  "spent" | 
 |     "spew"   "spied"  "spill"  "spiny"  "spoil"  "spoke"  "spoof"  "spool"  "spoon"  "sport" | 
 |     "spot"   "spout"  "spray"  "spree"  "spur"   "squad"  "squat"  "squid"  "stack"  "staff" | 
 |     "stage"  "stain"  "stall"  "stamp"  "stand"  "stank"  "stark"  "start"  "stash"  "state" | 
 |     "stays"  "steam"  "steep"  "stem"   "step"   "stew"   "stick"  "sting"  "stir"   "stock" | 
 |     "stole"  "stomp"  "stony"  "stood"  "stool"  "stoop"  "stop"   "storm"  "stout"  "stove" | 
 |     "straw"  "stray"  "strut"  "stuck"  "stud"   "stuff"  "stump"  "stung"  "stunt"  "suds" | 
 |     "sugar"  "sulk"   "surf"   "sushi"  "swab"   "swan"   "swarm"  "sway"   "swear"  "sweat" | 
 |     "sweep"  "swell"  "swept"  "swim"   "swing"  "swipe"  "swirl"  "swoop"  "swore"  "syrup" | 
 |     "tacky"  "taco"   "tag"    "take"   "tall"   "talon"  "tamer"  "tank"   "taper"  "taps" | 
 |     "tarot"  "tart"   "task"   "taste"  "tasty"  "taunt"  "thank"  "thaw"   "theft"  "theme" | 
 |     "thigh"  "thing"  "think"  "third"  "thorn"  "those"  "throb"  "thud"   "thumb"  "thump" | 
 |     "thus"   "tiara"  "tidal"  "tidy"   "tiger"  "tile"   "tilt"   "tint"   "tiny"   "trace" | 
 |     "track"  "trade"  "train"  "trait"  "trap"   "trash"  "tray"   "treat"  "tree"   "trek" | 
 |     "trend"  "trial"  "tribe"  "trick"  "trio"   "trout"  "truce"  "truck"  "trump"  "trunk" | 
 |     "try"    "tug"    "tulip"  "tummy"  "turf"   "tusk"   "tutor"  "tutu"   "tux"    "tweak" | 
 |     "tweet"  "twice"  "twine"  "twins"  "twirl"  "twist"  "uncle"  "uncut"  "undo"   "unify" | 
 |     "union"  "unit"   "untie"  "upon"   "upper"  "urban"  "used"   "user"   "usher"  "utter" | 
 |     "value"  "vapor"  "vegan"  "venue"  "verse"  "vest"   "veto"   "vice"   "video"  "view" | 
 |     "viral"  "virus"  "visa"   "visor"  "vixen"  "vocal"  "voice"  "void"   "volt"   "voter" | 
 |     "vowel"  "wad"    "wafer"  "wager"  "wages"  "wagon"  "wake"   "walk"   "wand"   "wasp" | 
 |     "watch"  "water"  "wavy"   "wheat"  "whiff"  "whole"  "whoop"  "wick"   "widen"  "widow" | 
 |     "width"  "wife"   "wifi"   "wilt"   "wimp"   "wind"   "wing"   "wink"   "wipe"   "wired" | 
 |     "wiry"   "wise"   "wish"   "wispy"  "wok"    "wolf"   "womb"   "wool"   "woozy"  "word" | 
 |     "work"   "worry"  "wound"  "woven"  "wrath"  "wreck"  "wrist"  "xerox"  "yahoo"  "yam" | 
 |     "yard"   "year"   "yeast"  "yelp"   "yield"  "yo-yo"  "yodel"  "yoga"   "yoyo"   "yummy" | 
 |     "zebra"  "zero"   "zesty"  "zippy"  "zone"   "zoom" | 
 | ); | 
 |  | 
 | hex_chars="0123456789abcdef"; | 
 |  | 
 | function chars_from_index { | 
 |     num=$1; | 
 |     token=""; | 
 |     for (( i = 0; i < 4; i++)); do | 
 |         left=$((num >> ((2 - i) * 4))); | 
 |         idx=$((left & 15)); | 
 |         token="$token${hex_chars:$idx:1}"; | 
 |     done | 
 |     echo $token; | 
 | } | 
 |  | 
 | function index_from_chars { | 
 |     arg=$1; | 
 |     total=0; | 
 |     for (( i = 0; i < 3; i++)); do | 
 |         letter=${arg:$i:1}; | 
 |         multiplier=$((1 << ((2 - i) * 4))); | 
 |         for (( j = 0; j < 16; j++ )); do | 
 |             if [[ "$letter" == "${hex_chars:$j:1}" ]]; then | 
 |                 total=$((total + (j * multiplier))); | 
 |                 break; | 
 |             fi | 
 |         done | 
 |     done | 
 |     echo $total; | 
 | } | 
 |  | 
 | function hex_from_word { | 
 |     for (( i = 0; i < ${#nameTokens[@]}; i++ )); do | 
 |         if [ "x${nameTokens[$i]}" == "x$1" ]; then | 
 |             chars_from_index "$i"; | 
 |             return; | 
 |         fi | 
 |     done | 
 |     echo ""; | 
 | } | 
 |  | 
 | function translations { | 
 |     IFS='-' read -ra PARTS <<< "$1"; | 
 |     index=$(hex_from_word "${PARTS[0]}"); | 
 |     if [[ $index != "" ]]; then | 
 |         # Found in the word list, probably four-word-node-name | 
 |         echo "Can't forward convert from a four-word-node-name."; | 
 |         exit 1; | 
 |     else | 
 |         # probably fs- a hex name | 
 |         mac=( | 
 |             $((16#${PARTS[1]:0:2})) $((16#${PARTS[1]:2:2})) | 
 |             $((16#${PARTS[2]:0:2})) $((16#${PARTS[2]:2:2})) | 
 |             $((16#${PARTS[3]:0:2})) $((16#${PARTS[3]:2:2})) | 
 |         ); | 
 |         indexes=( | 
 |             $(( ((mac[4] << 8) & 0xF00) + mac[0])) | 
 |             $(( ((mac[5] << 8) & 0xF00) + mac[1])) | 
 |             $(( ((mac[4] << 4) & 0xF00) + mac[2])) | 
 |             $(( ((mac[5] << 4) & 0xF00) + mac[3])) | 
 |         ); | 
 |         wordname=""; | 
 |         for index in "${indexes[@]}"; do | 
 |             index=$((index % 1296)); | 
 |             word=${nameTokens[$index]}; | 
 |             wordname="$wordname-$word"; | 
 |         done | 
 |         echo "${wordname:1}"; | 
 |     fi | 
 | } | 
 |  | 
 | while (( $# )); do | 
 |     names=$(translations "$1"); | 
 |     echo "other node-name generations for $1 are ${names}"; | 
 |     shift | 
 | done |