#!/usr/bin/env python3
import sys, json, re

def split_path(p):
    parts, buf, depth = [], '', 0
    for ch in p:
        if ch == '[':
            depth += 1; buf += ch
        elif ch == ']':
            depth -= 1; buf += ch
        elif ch == '.' and depth == 0:
            parts.append(buf); buf = ''
        else:
            buf += ch
    parts.append(buf)
    return [x for x in parts if x != '']

def evaluate(root, expr):
    cur = [root]
    parts = split_path(expr)
    if parts and parts[0] == '@':
        parts = parts[1:]
    for part in parts:
        m = re.match(r'^([^\[]*)((?:\[[^\]]*\])*)$', part)
        if not m:
            return []
        name, brs = m.group(1), re.findall(r'\[([^\]]*)\]', m.group(2))
        if name and not re.match(r'^[A-Za-z0-9_]+$', name):
            return []
        if name:
            nxt = []
            for n in cur:
                if isinstance(n, dict) and name in n:
                    nxt.append(n[name])
            cur = nxt
        for b in brs:
            b = b.strip()
            nxt = []
            if b == '*':
                for n in cur:
                    if isinstance(n, list):
                        nxt.extend(n)
                    elif isinstance(n, dict):
                        nxt.extend(n.values())
            elif re.match(r'^(".*"|\'.*\')$', b):
                k = b[1:-1]
                for n in cur:
                    if isinstance(n, dict) and k in n:
                        nxt.append(n[k])
            elif re.match(r'^-?\d+$', b):
                k = int(b)
                for n in cur:
                    if isinstance(n, list) and -len(n) <= k < len(n):
                        nxt.append(n[k])
            else:
                f = re.match(r'^@\.([A-Za-z0-9_.\-]+)\s*=\s*"?([^"]*)"?$', b)
                if f:
                    key, val = f.group(1), f.group(2)
                    for n in cur:
                        items = n if isinstance(n, list) else [n]
                        for it in items:
                            if isinstance(it, dict) and str(it.get(key)) == val:
                                nxt.append(it)
            cur = nxt
    return cur

def show(v):
    if isinstance(v, bool):
        print('true' if v else 'false')
    elif v is None:
        print('null')
    elif isinstance(v, (dict, list)):
        print(json.dumps(v, ensure_ascii=False, separators=(',', ':')))
    else:
        print(v)

args, exprs, infile, inline = sys.argv[1:], [], None, None
i = 0
while i < len(args):
    if args[i] == '-i' and i + 1 < len(args):
        infile = args[i + 1]; i += 2
    elif args[i] == '-e' and i + 1 < len(args):
        exprs.append(args[i + 1]); i += 2
    elif args[i] == '-s' and i + 1 < len(args):
        inline = args[i + 1]; i += 2
    else:
        i += 1

raw = open(infile).read() if infile else (inline if inline is not None else sys.stdin.read())
try:
    root = json.loads(raw)
except Exception:
    sys.exit(1)
for e in exprs:
    for v in evaluate(root, e):
        show(v)
