public static void encode(Map<Integer, ZState> states) throws Exception{
        
        int places = getPower(states)[0];
        int [][][] table = initTransitionTable(states);
        List<SynchroState> template = initTamplate(places);
        
        addToTemplate(template, states.get(0), 0);
        
        Map<Integer, ZState> trueStates = new HashMap<>(states);
        for (Map.Entry<Integer, ZState> entry : trueStates.entrySet()) {
            Integer id = entry.getKey();
            ZState zState = entry.getValue();
            
            if(zState.code == null){
                addToTemplate(template, zState);
            }
            
            ZState trueState = new ZState(zState);
            for(Connection conn:trueState.fromConnections){
                if(states.get(conn.to).code == null){
                     // пошук місця серед сусідів
                    int [] neibs = template.get(states.get(conn.from).code).getNeighbors();
                    for (int i = 0; i < neibs.length; i++) {
                        if(template.get(neibs[i]).state == null){
                            addToTemplate(template, states.get(conn.to), neibs[i]);   
                            break;
                        }
                    }
                }
                List<List> path = new ArrayList<>();
                int length = 0;
                int from = states.get(conn.from).code;
                int step = from;
                int to = states.get(conn.to).code;
                while(path.isEmpty()){
                    
                    createPath(from, step, to,
                            length, 0, places, new ArrayList<Integer>(), path, template);
                    length++;
                    if (length > places+1){
                        throw new  Exception("Problem with analysys. Don`t lounch it more than once on the same graph");
                    }
                    //TODO визначити можливість не виконання асерта
                }
                if(path.get(0).size()>2){  //отже - потрібні доп вершини
                    fillPath(path.get(0), template, states, places);
                }
            }
        }
    }