public String apply(String in1, int idx1, String in2, int idx2) throws ChangesetException {
            OpIterator iter1 = new OpIterator(in1, idx1);
            OpIterator iter2 = new OpIterator(in2, idx2);
            SmartOpAssembler assem = new SmartOpAssembler();

            MutableOperation op1 = new MutableOperation();
            MutableOperation op2 = new MutableOperation();

            while (op1.isValid() || iter1.hasNext() || op2.isValid() || iter2.hasNext()) {
                if (!op1.isValid() && iter1.hasNext()) op1.gets(iter1.next());
                if (!op2.isValid() && iter2.hasNext()) op2.gets(iter2.next());

                Operation opOut = func_interface.func(op1, op2);

                if (opOut != null) {
                    assem.append(opOut);
                }
            }

            assem.endDocument();
            return assem.toString();
        }