/*
 * SDK Pullenti Lingvo, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved. 
 * Non-Commercial Freeware and Commercial Software.
 * This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C# project. 
 * The latest version of the code is available on the site www.pullenti.ru
 */

package com.pullenti.ner.vacance.internal;

public class VacanceToken extends com.pullenti.ner.MetaToken {

    public VacanceToken(com.pullenti.ner.Token b, com.pullenti.ner.Token e) {
        super(b, e, null);
    }

    public VacanceTokenType typ = VacanceTokenType.UNDEFINED;

    public java.util.ArrayList<com.pullenti.ner.Referent> refs = new java.util.ArrayList<com.pullenti.ner.Referent>();

    public String value;

    public String value2;

    private boolean isSkill() {
        return (((typ == VacanceTokenType.EXPIERENCE || typ == VacanceTokenType.EDUCATION || typ == VacanceTokenType.SKILL) || typ == VacanceTokenType.LANGUAGE || typ == VacanceTokenType.PLUS) || typ == VacanceTokenType.MORAL || typ == VacanceTokenType.LICENSE) || typ == VacanceTokenType.DRIVING;
    }


    @Override
    public String toString() {
        StringBuilder tmp = new StringBuilder();
        if (typ != VacanceTokenType.UNDEFINED) 
            tmp.append(typ.toString()).append(": ");
        if (value != null) 
            tmp.append("\"").append(value).append("\" ");
        if (value2 != null) 
            tmp.append("\"").append(value2).append("\" ");
        for (com.pullenti.ner.Referent r : refs) {
            tmp.append("[").append(r.toString()).append("] ");
        }
        tmp.append(" ").append(this.getSourceText());
        return tmp.toString();
    }

    public static java.util.ArrayList<VacanceToken> tryParseList(com.pullenti.ner.Token t) {
        java.util.ArrayList<VacanceToken> res = new java.util.ArrayList<VacanceToken>();
        for (; t != null; t = t.getNext()) {
            VacanceToken prev = null;
            if (res.size() > 0 && res.get(res.size() - 1).getEndToken().getNext() == t) 
                prev = res.get(res.size() - 1);
            VacanceToken vv = tryParse(t, prev);
            if (vv == null) 
                break;
            if (vv.getLengthChar() > 3) 
                res.add(vv);
            t = vv.getEndToken();
        }
        for (int i = 0; i < res.size(); i++) {
            VacanceToken it = res.get(i);
            if (it.typ == VacanceTokenType.DATE) {
                it.typ = VacanceTokenType.UNDEFINED;
                continue;
            }
            if (it.typ == VacanceTokenType.DUMMY) 
                continue;
            if (it.typ == VacanceTokenType.UNDEFINED && it.refs.size() > 0) {
                if (it.refs.get(0) instanceof com.pullenti.ner.uri.UriReferent) 
                    continue;
            }
            if (it.typ == VacanceTokenType.SKILL && ((i + 1) < res.size()) && res.get(i + 1).typ == VacanceTokenType.MONEY) 
                it.typ = VacanceTokenType.UNDEFINED;
            if (it.typ == VacanceTokenType.EXPIRED) 
                continue;
            if (it.typ != VacanceTokenType.UNDEFINED) 
                break;
            it.typ = VacanceTokenType.NAME;
            if (((i + 2) < res.size()) && ((res.get(i + 1).typ == VacanceTokenType.UNDEFINED || res.get(i + 1).typ == VacanceTokenType.SKILL))) {
                if (res.get(i + 2).typ == VacanceTokenType.MONEY) {
                    it.setEndToken(res.get(i + 1).getEndToken());
                    res.remove(i + 1);
                }
                else if (res.get(i + 2).typ == VacanceTokenType.MONEY) {
                    if (res.get(i + 2)._tryParseMoney()) {
                        it.setEndToken(res.get(i + 1).getEndToken());
                        res.remove(i + 1);
                    }
                }
            }
            it._getValue();
            if (((i + 1) < res.size()) && res.get(i + 1).typ == VacanceTokenType.UNDEFINED) {
                if (res.get(i + 1)._tryParseMoney()) {
                    for (int j = i + 2; j < res.size(); j++) {
                        if (res.get(j).typ == VacanceTokenType.MONEY) 
                            res.get(j).typ = VacanceTokenType.UNDEFINED;
                    }
                }
            }
            break;
        }
        for (int i = 1; i < res.size(); i++) {
            VacanceToken it = res.get(i);
            if (it.typ != VacanceTokenType.UNDEFINED) 
                continue;
            if (!res.get(i - 1).isSkill()) 
                continue;
            for (int j = i + 1; (j < res.size()) && (j < (i + 2)); j++) {
                if (res.get(j).isSkill()) {
                    if (res.get(j).typ == VacanceTokenType.PLUS || res.get(j).typ == VacanceTokenType.MORAL) 
                        res.get(i).typ = res.get(j).typ;
                    else 
                        res.get(i).typ = VacanceTokenType.SKILL;
                    break;
                }
            }
        }
        for (int i = 0; i < res.size(); i++) {
            VacanceToken it = res.get(i);
            if (it.isSkill() && it.value == null) 
                it._getValue();
            if (it.typ == VacanceTokenType.SKILL || it.typ == VacanceTokenType.MORAL || it.typ == VacanceTokenType.PLUS) {
                for (int j = i + 1; j < res.size(); j++) {
                    if (res.get(j).typ != it.typ) 
                        break;
                    else {
                        it.setEndToken(res.get(j).getEndToken());
                        res.remove(j);
                        j--;
                    }
                }
                java.util.ArrayList<VacanceToken> li = _tryParseSkills(it.getBeginToken(), it.getEndToken());
                if (li != null && li.size() > 0) {
                    res.remove(i);
                    com.pullenti.unisharp.Utils.insertToArrayList(res, li, i);
                }
            }
        }
        return res;
    }

    public static VacanceToken tryParse(com.pullenti.ner.Token t, VacanceToken prev) {
        if (t == null) 
            return null;
        if (t.isValue2("НА", "ПОСТОЯННУЮ")) {
        }
        VacanceToken res = new VacanceToken(t, t);
        int skills = 0;
        int dummy = 0;
        int lang = 0;
        int edu = 0;
        int moral = 0;
        int lic = 0;
        int plus = 0;
        for (com.pullenti.ner.Token tt = t; tt != null; tt = tt.getNext()) {
            if (tt.isNewlineBefore() && tt != t) {
                if (com.pullenti.ner.core.MiscHelper.canBeStartOfSentence(tt)) 
                    break;
                if (tt.isHiphen()) 
                    break;
                boolean cr = true;
                com.pullenti.ner.core.NounPhraseToken npt = com.pullenti.ner.core.NounPhraseHelper.tryParse(tt.getPrevious(), com.pullenti.ner.core.NounPhraseParseAttr.NO, 0, null);
                if (npt != null && npt.getEndChar() >= tt.getBeginChar()) 
                    cr = false;
                else if (tt.getPrevious().getMorphClassInDictionary().isNoun() && tt.chars.isAllLower()) {
                    npt = com.pullenti.ner.core.NounPhraseHelper.tryParse(tt, com.pullenti.ner.core.NounPhraseParseAttr.NO, 0, null);
                    if (npt != null && npt.getMorph().getCase().isGenitive() && !npt.getMorph().getCase().isNominative()) 
                        cr = false;
                }
                else if (tt.getPrevious() instanceof com.pullenti.ner.NumberToken) {
                    if (tt.isValue("РАЗРЯД", null)) 
                        cr = false;
                }
                if (cr) 
                    break;
            }
            if (tt.isChar(';')) 
                break;
            res.setEndToken(tt);
            com.pullenti.ner.core.TerminToken tok = M_TERMINS.tryParse(tt, com.pullenti.ner.core.TerminParseAttr.NO);
            if (tok != null) {
                VacanceTokenType ty = (VacanceTokenType)tok.termin.tag;
                if (ty == VacanceTokenType.STOP && tt == res.getBeginToken()) 
                    return null;
                res.setEndToken((tt = tok.getEndToken()));
                if (ty == VacanceTokenType.EXPIRED) {
                    res.typ = VacanceTokenType.EXPIRED;
                    continue;
                }
                if (ty == VacanceTokenType.DUMMY) {
                    dummy++;
                    continue;
                }
                if (ty == VacanceTokenType.EDUCATION) {
                    edu++;
                    continue;
                }
                if (ty == VacanceTokenType.LANGUAGE) {
                    lang++;
                    for (com.pullenti.ner.Token ttt = tt.getPrevious(); ttt != null && ttt.getBeginChar() >= t.getBeginChar(); ttt = ttt.getPrevious()) {
                        if ((ttt.isValue("ПЕДАГОГ", null) || ttt.isValue("УЧИТЕЛЬ", null) || ttt.isValue("РЕПЕТИТОР", null)) || ttt.isValue("ПРЕПОДАВАТЕЛЬ", null)) {
                            lang--;
                            break;
                        }
                    }
                    continue;
                }
                if (ty == VacanceTokenType.MORAL) {
                    moral++;
                    continue;
                }
                if (ty == VacanceTokenType.PLUS) {
                    plus++;
                    continue;
                }
                if (ty == VacanceTokenType.LICENSE) {
                    lic++;
                    com.pullenti.ner.Token ttt = tok.getBeginToken().getPrevious();
                    if (ttt != null) {
                        if (ttt.isValue("ОФОРМЛЯТЬ", null) || ttt.isValue("ОФОРМИТЬ", null) || ttt.isValue("ОФОРМЛЕНИЕ", null)) 
                            lic--;
                    }
                    continue;
                }
                if (ty == VacanceTokenType.SKILL) {
                    if (tok.termin.tag2 != null && (tok.getBeginChar() - res.getBeginChar()) > 3) 
                        continue;
                    skills++;
                    if (tt.isValue("ОПЫТ", null) || tt.isValue("СТАЖ", null)) {
                        if (res._tryParseExp()) 
                            tt = res.getEndToken();
                        else if (prev != null && prev.typ == VacanceTokenType.PLUS) {
                            skills--;
                            plus++;
                        }
                    }
                    continue;
                }
                if (ty == VacanceTokenType.EXPIERENCE) {
                    if (res._tryParseExp()) 
                        tt = res.getEndToken();
                    else 
                        skills++;
                    continue;
                }
                if (ty == VacanceTokenType.MONEY) {
                    if (res._tryParseMoney()) 
                        tt = res.getEndToken();
                    continue;
                }
                if (ty == VacanceTokenType.DRIVING) {
                    if (res._tryParseDriving()) {
                        tt = res.getEndToken();
                        break;
                    }
                    else 
                        lic++;
                }
                continue;
            }
            com.pullenti.ner.Referent r = tt.getReferent();
            if (r instanceof com.pullenti.ner.date.DateReferent) {
                com.pullenti.ner.date.DateReferent dd = (com.pullenti.ner.date.DateReferent)com.pullenti.unisharp.Utils.cast(r, com.pullenti.ner.date.DateReferent.class);
                if (dd.getYear() > 0 && dd.getMonth() > 0 && dd.getDay() > 0) 
                    res.refs.add(dd);
            }
            else if (r instanceof com.pullenti.ner.uri.UriReferent) 
                dummy++;
            else if (r != null && !res.refs.contains(r)) {
                if ((r instanceof com.pullenti.ner.money.MoneyReferent) && (((t.getBeginChar() - res.getBeginChar())) < 10)) {
                    if (res._tryParseMoney()) {
                        t = res.getEndToken();
                        continue;
                    }
                }
                res.refs.add(r);
            }
        }
        if (res.typ == VacanceTokenType.UNDEFINED) {
            if (dummy > 0) 
                res.typ = VacanceTokenType.DUMMY;
            else if (lang > 0) 
                res.typ = VacanceTokenType.LANGUAGE;
            else if (edu > 0) {
                res.typ = VacanceTokenType.EDUCATION;
                res._tryParseEducation();
            }
            else if (res.refs.size() > 0 && (res.refs.get(0) instanceof com.pullenti.ner.date.DateReferent)) 
                res.typ = VacanceTokenType.DATE;
            else if (moral > 0) 
                res.typ = VacanceTokenType.MORAL;
            else if (lic > 0) 
                res.typ = VacanceTokenType.LICENSE;
            else if (plus > 0) 
                res.typ = VacanceTokenType.PLUS;
            else if (skills > 0) 
                res.typ = VacanceTokenType.SKILL;
        }
        return res;
    }

    private void _getValue() {
        com.pullenti.ner.Token t0 = getBeginToken();
        com.pullenti.ner.Token t1 = getEndToken();
        for (com.pullenti.ner.Token t = t0; t != null && (t.getEndChar() < getEndChar()); t = t.getNext()) {
            if ((t instanceof com.pullenti.ner.TextToken) && t.getLengthChar() == 1 && !t.chars.isLetter()) 
                t0 = t.getNext();
            else if (t.isValue("ИМЕТЬ", null) || t.isValue("ВЛАДЕТЬ", null) || t.isValue("ЕСТЬ", null)) 
                t0 = t.getNext();
            else if (t.isValue2("У", "ВАС") && t.getNext().getNext() != null && t.getNext().getNext().isValue("ЕСТЬ", null)) {
                t = t.getNext().getNext().getNext();
                t0 = t.getNext();
            }
            else {
                com.pullenti.ner.core.TerminToken tok = M_TERMINS.tryParse(t, com.pullenti.ner.core.TerminParseAttr.NO);
                if (tok != null && tok.termin.tag2 != null) {
                    t = tok.getEndToken();
                    t0 = t.getNext();
                    continue;
                }
                break;
            }
        }
        if (t1.isCharOf(".;:,") || t1.isHiphen()) 
            t1 = t1.getPrevious();
        if (typ == VacanceTokenType.NAME) {
            for (com.pullenti.ner.Token t = t0.getNext(); t != null && (t.getEndChar() < getEndChar()); t = t.getNext()) {
                if (t.isCharOf("(,") && t.getNext() != null) {
                    if ((t.getNext().getReferent() != null || t.getNext().isValue("М", null) || t.getNext().isValue("СТ", null)) || t.getNext().isValue("СТАНЦИЯ", null) || t.getNext().chars.isCapitalUpper()) 
                        t1 = t.getPrevious();
                    break;
                }
            }
        }
        else 
            for (com.pullenti.ner.Token t = t1; t != null && t.getBeginChar() > t0.getBeginChar(); t = t.getPrevious()) {
                com.pullenti.ner.core.TerminToken tok = M_TERMINS.tryParse(t, com.pullenti.ner.core.TerminParseAttr.NO);
                if (tok != null && tok.termin.tag2 != null && tok.getEndToken() == t1) {
                    t1 = t.getPrevious();
                    VacanceTokenType ty = (VacanceTokenType)tok.termin.tag;
                    if (ty == VacanceTokenType.PLUS && typ == VacanceTokenType.SKILL) 
                        typ = VacanceTokenType.PLUS;
                    for (; t1 != null && t1 != t0; t1 = t1.getPrevious()) {
                        if (t1.isValue("БЫТЬ", null) || t1.isValue("ЯВЛЯТЬСЯ", null)) {
                        }
                        else 
                            break;
                    }
                    break;
                }
            }
        int attr = (com.pullenti.ner.core.GetTextAttr.KEEPREGISTER.value()) | (com.pullenti.ner.core.GetTextAttr.KEEPQUOTES.value());
        if (typ == VacanceTokenType.MORAL) {
            com.pullenti.ner.core.TerminToken tok1 = M_TERMINS.tryParse(t0, com.pullenti.ner.core.TerminParseAttr.NO);
            if (tok1 != null && tok1.termin.tag2 == null && ((VacanceTokenType)tok1.termin.tag) == typ) {
                value = tok1.termin.getCanonicText().toLowerCase();
                if (tok1.getEndChar() < t1.getEndChar()) 
                    value = (value + " " + com.pullenti.ner.core.MiscHelper.getTextValue(tok1.getEndToken().getNext(), t1, com.pullenti.ner.core.GetTextAttr.of(attr)));
            }
        }
        if (value == null) {
            if (t0.isValue("ПРАВО", null)) {
            }
            else 
                (attr) |= (com.pullenti.ner.core.GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE.value());
            value = com.pullenti.ner.core.MiscHelper.getTextValue(t0, t1, com.pullenti.ner.core.GetTextAttr.of(attr));
        }
        if (!com.pullenti.unisharp.Utils.isNullOrEmpty(value) && !t0.chars.isAllUpper() && Character.isLowerCase(value.charAt(0))) 
            value = (String.valueOf(Character.toUpperCase(value.charAt(0))) + value.substring(1));
    }

    private boolean _tryParseExp() {
        com.pullenti.ner.Token t = getEndToken().getNext();
        for (; t != null; t = t.getNext()) {
            if (t.isValue("РАБОТА", null) || t.isHiphen() || t.isChar(':')) {
            }
            else 
                break;
        }
        if (t == null) 
            return false;
        if (t.isValue2("НЕ", "ТРЕБОВАТЬСЯ")) {
            setEndToken(t.getNext());
            typ = VacanceTokenType.EXPIERENCE;
            value = "0";
            return true;
        }
        com.pullenti.ner.measure.internal.NumbersWithUnitToken uni = com.pullenti.ner.measure.internal.NumbersWithUnitToken.tryParse(t, null, com.pullenti.ner.measure.internal.NumberWithUnitParseAttr.NO);
        if (uni == null) 
            return false;
        if (uni.units.size() != 1 || uni.units.get(0).unit == null || uni.units.get(0).unit.kind != com.pullenti.ner.measure.MeasureKind.TIME) 
            return false;
        setEndToken(uni.getEndToken());
        typ = VacanceTokenType.EXPIERENCE;
        if (uni.singleVal != null) 
            value = com.pullenti.ner.core.NumberHelper.doubleToString(uni.singleVal);
        else if (uni.fromVal != null) {
            value = com.pullenti.ner.core.NumberHelper.doubleToString(uni.fromVal);
            if (uni.toVal != null) 
                value = (value + "-" + ((value = com.pullenti.ner.core.NumberHelper.doubleToString(uni.toVal))));
        }
        else if (uni.toVal != null) 
            value = com.pullenti.ner.core.NumberHelper.doubleToString(uni.toVal);
        return true;
    }

    private boolean _tryParseMoney() {
        for (com.pullenti.ner.Token t = getBeginToken(); t != null; t = t.getNext()) {
            com.pullenti.ner.money.MoneyReferent m = (com.pullenti.ner.money.MoneyReferent)com.pullenti.unisharp.Utils.cast(t.getReferent(), com.pullenti.ner.money.MoneyReferent.class);
            if (m != null) {
                if (t.getEndChar() > getEndChar()) 
                    setEndToken(t);
                if (!refs.contains(m)) 
                    refs.add(m);
                typ = VacanceTokenType.MONEY;
                if (t.getNext() != null && ((t.getNext().isHiphen() || t.getNext().isValue("ДО", null)))) {
                    if (t.getNext().getNext() != null && (t.getNext().getNext().getReferent() instanceof com.pullenti.ner.money.MoneyReferent)) {
                        if (t.getNext().getNext().getEndChar() > getEndToken().getEndChar()) {
                            setEndToken(t.getNext().getNext());
                            refs.add(this.getEndToken().getReferent());
                        }
                    }
                }
                return true;
            }
            if (t.isNewlineBefore() && t != getBeginToken()) 
                break;
            if ((t.getBeginChar() - getBeginChar()) > 20) 
                break;
        }
        return false;
    }

    private boolean _tryParseDriving() {
        for (com.pullenti.ner.Token t = getEndToken().getNext(); t != null; t = t.getNext()) {
            if ((t.isHiphen() || t.isCharOf(":.") || t.isValue("КАТЕГОРИЯ", null)) || t.isValue("КАТ", null)) 
                continue;
            if ((t instanceof com.pullenti.ner.TextToken) && t.getLengthChar() <= 3 && t.chars.isLetter()) {
                typ = VacanceTokenType.DRIVING;
                value = ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term;
                setEndToken(t);
                for (t = t.getNext(); t != null; t = t.getNext()) {
                    if (t.isChar('.') || t.isCommaAnd()) 
                        continue;
                    else if (t.getLengthChar() == 1 && t.chars.isAllUpper() && t.chars.isLetter()) {
                        value = (value + ((com.pullenti.ner.TextToken)com.pullenti.unisharp.Utils.cast(t, com.pullenti.ner.TextToken.class)).term);
                        setEndToken(t);
                    }
                    else 
                        break;
                }
                value = value.replace("А", "A").replace("В", "B").replace("С", "C");
                return true;
            }
            break;
        }
        return false;
    }

    private boolean _tryParseEducation() {
        boolean hi = false;
        boolean middl = false;
        boolean prof = false;
        boolean spec = false;
        boolean tech = false;
        for (com.pullenti.ner.Token t = getBeginToken(); t != null && t.getEndChar() <= getEndChar(); t = t.getNext()) {
            if (t.isValue("СРЕДНИЙ", null) || t.isValue("СРЕДНЕ", null) || t.isValue("СРЕДН", null)) 
                middl = true;
            else if (t.isValue("ВЫСШИЙ", null) || t.isValue("ВЫСШ", null)) 
                hi = true;
            else if (t.isValue("ПРОФЕССИОНАЛЬНЫЙ", null) || t.isValue("ПРОФ", null) || t.isValue("ПРОФИЛЬНЫЙ", null)) 
                prof = true;
            else if ((t.isValue("СПЕЦИАЛЬНЫЙ", null) || t.isValue("СПЕЦ", null) || t.isValue2("ПО", "СПЕЦИАЛЬНОСТЬ")) || t.isValue2("ПО", "НАПРАВЛЕНИЕ")) 
                spec = true;
            else if ((t.isValue("ТЕХНИЧЕСКИЙ", null) || t.isValue("ТЕХ", null) || t.isValue("ТЕХН", null)) || t.isValue("ТЕХНИЧ", null)) 
                tech = true;
        }
        if (!hi && !middl) {
            if (spec || prof || tech) 
                middl = true;
        }
        if (hi || middl) {
            value = (hi ? "ВО" : "СО");
            if (spec) 
                value += ",спец";
            if (prof) 
                value += ",проф";
            if (tech) 
                value += ",тех";
            return true;
        }
        this._getValue();
        return false;
    }

    private static java.util.ArrayList<VacanceToken> _tryParseSkills(com.pullenti.ner.Token t0, com.pullenti.ner.Token t1) {
        java.util.ArrayList<VacanceToken> res = new java.util.ArrayList<VacanceToken>();
        VacanceToken ski = null;
        boolean hasVerb = false;
        VacanceTokenType ty0 = VacanceTokenType.UNDEFINED;
        for (com.pullenti.ner.Token t = t0; t != null && t.getEndChar() <= t1.getEndChar(); t = t.getNext()) {
            boolean _keyword = false;
            com.pullenti.ner.core.TerminToken tok = M_TERMINS.tryParse(t, com.pullenti.ner.core.TerminParseAttr.NO);
            if (tok == null) {
                com.pullenti.ner.core.NounPhraseToken npt1 = com.pullenti.ner.core.NounPhraseHelper.tryParse(t, com.pullenti.ner.core.NounPhraseParseAttr.NO, 0, null);
                if (npt1 != null && npt1.getEndToken() != t) 
                    tok = M_TERMINS.tryParse(npt1.getEndToken(), com.pullenti.ner.core.TerminParseAttr.NO);
            }
            if (tok != null) {
                VacanceTokenType ty = (VacanceTokenType)tok.termin.tag;
                if (ty == VacanceTokenType.SKILL || ty == VacanceTokenType.MORAL || ty == VacanceTokenType.PLUS) {
                    _keyword = true;
                    ty0 = ty;
                }
            }
            if (com.pullenti.ner.core.MiscHelper.canBeStartOfSentence(t)) 
                ski = null;
            else if (ski != null && ski.getBeginToken() != t && _keyword) {
                if (t.chars.isCapitalUpper()) 
                    ski = null;
                else if (t.getPrevious() != null && t.getPrevious().isCommaAnd()) {
                    ski.setEndToken(ski.getEndToken().getPrevious());
                    ski = null;
                }
            }
            if (ski == null) {
                ski = _new3636(t, t, (ty0 == VacanceTokenType.UNDEFINED ? VacanceTokenType.SKILL : ty0));
                hasVerb = false;
                res.add(ski);
            }
            com.pullenti.ner.core.NounPhraseToken npt = com.pullenti.ner.core.NounPhraseHelper.tryParse(t, com.pullenti.ner.core.NounPhraseParseAttr.NO, 0, null);
            if (npt != null) {
                ski.setEndToken((t = npt.getEndToken()));
                continue;
            }
            com.pullenti.ner.core.VerbPhraseToken verb = com.pullenti.ner.core.VerbPhraseHelper.tryParse(t, false, false, false);
            if (verb != null) {
                ski.setEndToken((t = verb.getEndToken()));
                hasVerb = true;
                continue;
            }
            if (t.isChar(';')) {
                ski = null;
                continue;
            }
            if (t.isComma()) {
            }
            ski.setEndToken(t);
        }
        for (int i = 0; i < res.size(); i++) {
            res.get(i)._getValue();
            if (res.get(i).getLengthChar() < 5) {
                res.remove(i);
                i--;
            }
        }
        return res;
    }

    public static com.pullenti.ner.core.TerminCollection M_TERMINS;

    public static void initialize() {
        if (M_TERMINS != null) 
            return;
        M_TERMINS = new com.pullenti.ner.core.TerminCollection();
        com.pullenti.ner.core.Termin t;
        t = com.pullenti.ner.core.Termin._new96("ЗАРАБОТНАЯ ПЛАТА", VacanceTokenType.MONEY);
        t.addAbridge("З/П");
        M_TERMINS.add(t);
        t = com.pullenti.ner.core.Termin._new96("ОПЫТ РАБОТЫ", VacanceTokenType.EXPIERENCE);
        t.addVariant("СТАЖ РАБОТЫ", false);
        t.addVariant("РАБОЧИЙ СТАЖ", false);
        M_TERMINS.add(t);
        t = com.pullenti.ner.core.Termin._new96("ОБРАЗОВАНИЕ", VacanceTokenType.EDUCATION);
        M_TERMINS.add(t);
        for (String s : new String[] {"АНГЛИЙСКИЙ", "НЕМЕЦКИЙ", "ФРАНЦУЗСКИЙ", "ИТАЛЬЯНСКИЙ", "ИСПАНСКИЙ", "КИТАЙСКИЙ"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.LANGUAGE));
        }
        for (String s : new String[] {"ВОДИТЕЛЬСКИЕ ПРАВА", "ПРАВА КАТЕГОРИИ", "ВОДИТЕЛЬСКОЕ УДОСТОВЕРЕНИЕ", "УДОСТОВЕРЕНИЕ ВОДИТЕЛЯ", "ПРАВА ВОДИТЕЛЯ"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.DRIVING));
        }
        for (String s : new String[] {"УДОСТОВЕРЕНИЕ", "ВОДИТЕЛЬСКАЯ МЕДСПРАВКА", "ВОДИТЕЛЬСКАЯ МЕД.СПРАВКА", "ВОЕННЫЙ БИЛЕТ", "МЕДИЦИНСКАЯ КНИЖКА", "МЕДКНИЖКА", "МЕД.КНИЖКА", "АТТЕСТАТ", "АТТЕСТАЦИЯ", "СЕРТИФИКАТ", "ДОПУСК", "ГРУППА ДОПУСКА"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.LICENSE));
        }
        for (String s : new String[] {"ЖЕЛАНИЕ;ЖЕЛАТЬ", "ЖЕЛАНИЕ И СПОСОБНОСТЬ", "ГОТОВНОСТЬ К;ГОТОВЫЙ К", "ДОБРОСОВЕСТНОСТЬ;ДОБРОСОВЕСТНЫЙ", "ГИБКОСТЬ", "РАБОТА В КОМАНДЕ;УМЕНИЕ РАБОТАТЬ В КОМАНДЕ", "ОБЩИТЕЛЬНОСТЬ;ОБЩИТЕЛЬНЫЙ;УМЕНИЕ ОБЩАТЬСЯ С ЛЮДЬМИ;УМЕНИЕ ОБЩАТЬСЯ;КОНТАКТ С ЛЮДЬМИ", "ОТВЕТСТВЕННОСТЬ;ОТВЕТСТВЕННЫЙ", "АКТИВНАЯ ЖИЗНЕННАЯ ПОЗИЦИЯ", "КОММУНИКАБЕЛЬНОСТЬ;КОММУНИКАБЕЛЬНЫЙ", "ЛОЯЛЬНОСТЬ;ЛОЯЛЬНЫЙ", "ИСПОЛНИТЕЛЬНОСТЬ;ИСПОЛНИТЕЛЬНЫЙ", "РЕЗУЛЬТАТИВНОСТЬ;РЕЗУЛЬТАТИВНЫЙ", "ПУНКТУАЛЬНОСТЬ;ПУНКТУАЛЬНЫЙ", "ДИСЦИПЛИНИРОВАННОСТЬ;ДИСЦИПЛИНИРОВАННЫЙ", "ТРУДОЛЮБИЕ;ТРУДОЛЮБИВЫЙ", "ЦЕЛЕУСТРЕМЛЕННОСТЬ;ЦЕЛЕУСТРЕМЛЕННЫЙ", "РАБОТОСПОСОБНОСТЬ;РАБОТОСПОСОБНЫЙ", "ОПРЯТНОСТЬ;ОПРЯТНЫЙ", "ВЕЖЛИВОСТЬ;ВЕЖЛИВЫЙ", "ВЫНОСЛИВОСТЬ;ВЫНОСЛИВЫЙ", "АКТИВНОСТЬ;АКТИВНЫЙ", "УСИДЧИВОСТЬ;УСИДЧИВЫЙ", "НАХОДЧИВОСТЬ;НАХОДЧИВЫЙ", "ОПТИМИЗМ;ОПТИМИСТИЧНЫЙ", "СТРЕМЛЕНИЕ ПОЗНАТЬ НОВОЕ;СТРЕМИТЬСЯ ПОЗНАТЬ НОВОЕ;СТРЕМЛЕНИЕ УЗНАТЬ НОВОЕ;СТРЕМИТЬСЯ УЗНАТИТЬ НОВОЕ", "ОБУЧАЕМОСТЬ;ОБУЧАЕМЫЙ;СПОСОБНОСТЬ К ОБУЧЕНИЮ;ЛЕГКО ОБУЧАЕМЫЙ;ЛЕГКООБУЧАЕМЫЙ;БЫСТРО ОБУЧАТЬСЯ", "ОБРАЗОВАННОСТЬ", "СТРЕССОУСТОЙЧИВОСТЬ;СТРЕССОУСТОЙЧИВЫЙ", "ОТЛИЧНОЕ НАСТРОЕНИЕ", "ХОРОШЕЕ НАСТРОЕНИЕ", "ГРАМОТНАЯ РЕЧЬ", "ГРАМОТНОЕ ПИСЬМО", "ГРАМОТНОЕ ПИСЬМО И РЕЧЬ", "НАЦЕЛЕННОСТЬ НА РЕЗУЛЬТАТ;НАЦЕЛЕННЫЙ НА РЕЗУЛЬТАТ", "ОПТИМИЗМ;ОПТИМИСТИЧНЫЙ", "КОММУНИКАБЕЛЬНОСТЬ;КОММУНИКАБЕЛЬНЫЙ", "ПРИВЕТЛИВОСТЬ;ПРИВЕТЛИВЫЙ", "ЖЕЛАНИЕ РАБОТАТЬ;ЖЕЛАТЬ РАБОТАТЬ", "ЖЕЛАНИЕ ЗАРАБАТЫВАТЬ;ЖЕЛАТЬ ЗАРАБАТЫВАТЬ", "ОБЯЗАТЕЛЬНОСТЬ", "ПУНКТУАЛЬНОСТЬ;ПУНКТУАЛЬНЫЙ", "ГРАМОТНОСТЬ", "ИНИЦИАТИВНОСТЬ;ИНИЦИАТИВНЫЙ", "ОРГАНИЗОВАННОСТЬ", "АККУРАТНОСТЬ;АККУРАТНЫЙ", "ВНИМАТЕЛЬНОСТЬ;ВНИМАТЕЛЬНЫЙ", "ДИСЦИПЛИНИРОВАННОСТЬ;ДИСЦИПЛИНИРОВАННЫЙ;ПОВЫШЕННЫЕ ТРЕБОВАНИЯ К ДИСЦИПЛИНЕ", "БЕЗ ВРЕДНЫХ ПРИВЫЧЕК;ОТСУТСТВИЕ ВРЕДНЫХ ПРИВЫЧЕК;ВРЕДНЫЕ ПРИВЫЧКИ ОТСУТСТВУЮТ"}) {
            String[] pp = com.pullenti.unisharp.Utils.split(s, String.valueOf(';'), false);
            com.pullenti.ner.core.Termin te = com.pullenti.ner.core.Termin._new96(pp[0], VacanceTokenType.MORAL);
            for (int ii = 1; ii < pp.length; ii++) {
                te.addVariant(pp[ii], false);
            }
            M_TERMINS.add(te);
        }
        for (String s : new String[] {"ОПЫТ", "ЗНАНИЕ", "ВЛАДЕНИЕ", "НАВЫК", "УМЕНИЕ", "ПОНИМАНИЕ", "ОРГАНИЗАТОРСКИЕ НАВЫКИ", "ОРГАНИЗАТОРСКИЕ СПОСОБНОСТИ", "ПОЛЬЗОВАТЕЛЬ ПК"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.SKILL));
        }
        for (String s : new String[] {"НУЖНО", "НЕОБХОДИМО", "ТРЕБОВАТЬСЯ", "НАЛИЧИЕ", "ДЛЯ РАБОТЫ ТРЕБУЕТСЯ", "ОБЯЗАТЕЛЬНО", "ОБЯЗАТЕЛЕН"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new98(s, VacanceTokenType.SKILL, true));
        }
        for (String s : new String[] {"ЖЕЛАТЕЛЬНО", "ПРИВЕТСТВОВАТЬСЯ", "ЯВЛЯТЬСЯ ПРЕИМУЩЕСТВОМ", "КАК ПЛЮС", "БУДЕТ ПРЕИМУЩЕСТВОМ", "БУДЕТ ЯВЛЯТЬСЯ ПРЕИМУЩЕСТВОМ", "МЫ ЦЕНИМ"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new3646(s, VacanceTokenType.PLUS, true, true));
        }
        for (String s : new String[] {"НЕЗАМЕНИМЫЙ ОПЫТ", "ОСТАВИТЬ ОТЗЫВ", "КЛЮЧЕВЫЕ НАВЫКИ", "ПОЛНАЯ ЗАНЯТОСТЬ", "КОРПОРАТИВНЫЕ ЗАНЯТИЯ", "КОМПЕНСАЦИЯ", "ОПЛАТА БОЛЬНИЧНЫХ", "ПРЕМИЯ", "ВОЗМОЖНОСТЬ ПОЛУЧИТЬ", "УСЛОВИЯ ДЛЯ", "СПЕЦИАЛЬНЫЕ НАВЫКИ И ЗНАНИЯ", "ПРОГРАММА ЛОЯЛЬНОСТИ", "СИСТЕМА ЛОЯЛЬНОСТИ", "КОРПОРАТИВНЫЙ", "ИНТЕРЕСНАЯ РАБОТА", "НА ПОСТОЯННУЮ РАБОТУ", "ПРОФСОЮЗ"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.DUMMY));
        }
        for (String s : new String[] {"ВАКАНСИЯ В АРХИВЕ", "В АРХИВЕ С"}) {
            M_TERMINS.add(com.pullenti.ner.core.Termin._new96(s, VacanceTokenType.EXPIRED));
        }
        M_SKILLITEMS = new com.pullenti.ner.core.TerminCollection();
        for (String s : new String[] {"Microsoft Office;MS Office;Микрософт офис", "1С Предприятие;1C Предприятие;1С:Предприятие"}) {
            String[] vv = com.pullenti.unisharp.Utils.split(s, String.valueOf(';'), false);
            com.pullenti.ner.core.Termin te = com.pullenti.ner.core.Termin._new1469(vv[0], vv[0]);
            for (int i = 1; i < vv.length; i++) {
                te.addVariant(vv[i], false);
            }
            M_SKILLITEMS.add(te);
        }
    }

    public static com.pullenti.ner.core.TerminCollection M_SKILLITEMS;

    public static VacanceToken _new3636(com.pullenti.ner.Token _arg1, com.pullenti.ner.Token _arg2, VacanceTokenType _arg3) {
        VacanceToken res = new VacanceToken(_arg1, _arg2);
        res.typ = _arg3;
        return res;
    }
    public VacanceToken() {
        super();
    }
}
