private Map<Pattern,String> loadPatterns(InputStream is) {
		Properties p = new Properties();
		try {
			p.load(is);
		} catch (IOException e) {
			throw new RuntimeException("Error loading patterns", e);
		}
		
		Map<Pattern,String> pattMap = new HashMap<Pattern,String>();
		for (Object k : p.keySet()) {
			String key = (String)k;
			String repl = p.getProperty(key);
			log.finer("load: " + key + "->" + repl);
			// If key begins with ${...}, substitute key now
			// ("now" == at program start-up).
			if (key.charAt(0) == '$') {
				String propName = key.substring(2, key.length() - 1);
				String newKey = sysProps.getProperty(propName);
				log.fine(String.format(
					"loadPatterns(): prop %s -> %s", propName, newKey));
				key = newKey;
			}
			log.fine(String.format("loadPatterns() key '%s' value '%s'", key, repl));
			Pattern pat = Pattern.compile(key);
			pattMap.put(pat, repl);
		}
		return pattMap;
	}