Full Code of teni-ime/ibus-teni for AI

master a3824854c0f5 cached
131 files
880.7 KB
423.2k tokens
708 symbols
1 requests
Download .txt
Showing preview only (1,032K chars total). Download the full file or copy to clipboard to get everything.
Repository: teni-ime/ibus-teni
Branch: master
Commit: a3824854c0f5
Files: 131
Total size: 880.7 KB

Directory structure:
gitextract_j5e35vq7/

├── .github/
│   └── ISSUE_TEMPLATE/
│       └── bug_report.md
├── .gitignore
├── .travis.yml
├── GPLv3_vi.md
├── LICENSE
├── MAINTAINERS
├── Makefile
├── PKGBUILD
├── README.md
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── rules
│   └── source/
│       └── options
├── deploy.bash
├── dict/
│   ├── LICENSE
│   ├── vietnamese.cm.dict
│   ├── vietnamese.new.dict
│   ├── vietnamese.sp.dict
│   └── vietnamese.std.dict
├── except.tmpl.txt
├── ibus-teni.dsc
├── ibus-teni.spec
├── src/
│   ├── dict-gen/
│   │   ├── Gopkg.toml
│   │   ├── dump.go
│   │   ├── extract.go
│   │   ├── main.go
│   │   └── vnsort.go
│   ├── ibus-teni/
│   │   ├── cache-wm.go
│   │   ├── config.go
│   │   ├── debug.go
│   │   ├── engine.go
│   │   ├── except.go
│   │   ├── ibus-const.go
│   │   ├── main.go
│   │   ├── mice.go
│   │   ├── proc.go
│   │   ├── prop.go
│   │   ├── runes.go
│   │   ├── vendor/
│   │   │   └── github.com/
│   │   │       ├── godbus/
│   │   │       │   └── dbus/
│   │   │       │       ├── .travis.yml
│   │   │       │       ├── CONTRIBUTING.md
│   │   │       │       ├── LICENSE
│   │   │       │       ├── MAINTAINERS
│   │   │       │       ├── README.markdown
│   │   │       │       ├── auth.go
│   │   │       │       ├── auth_external.go
│   │   │       │       ├── auth_sha1.go
│   │   │       │       ├── call.go
│   │   │       │       ├── conn.go
│   │   │       │       ├── conn_darwin.go
│   │   │       │       ├── conn_other.go
│   │   │       │       ├── dbus.go
│   │   │       │       ├── decoder.go
│   │   │       │       ├── default_handler.go
│   │   │       │       ├── doc.go
│   │   │       │       ├── encoder.go
│   │   │       │       ├── export.go
│   │   │       │       ├── homedir.go
│   │   │       │       ├── homedir_dynamic.go
│   │   │       │       ├── homedir_static.go
│   │   │       │       ├── message.go
│   │   │       │       ├── object.go
│   │   │       │       ├── server_interfaces.go
│   │   │       │       ├── sig.go
│   │   │       │       ├── transport_darwin.go
│   │   │       │       ├── transport_generic.go
│   │   │       │       ├── transport_tcp.go
│   │   │       │       ├── transport_unix.go
│   │   │       │       ├── transport_unixcred_dragonfly.go
│   │   │       │       ├── transport_unixcred_freebsd.go
│   │   │       │       ├── transport_unixcred_linux.go
│   │   │       │       ├── transport_unixcred_openbsd.go
│   │   │       │       ├── variant.go
│   │   │       │       ├── variant_lexer.go
│   │   │       │       └── variant_parser.go
│   │   │       └── sarim/
│   │   │           └── goibus/
│   │   │               ├── README.md
│   │   │               └── ibus/
│   │   │                   ├── bus.go
│   │   │                   ├── common.go
│   │   │                   ├── component.go
│   │   │                   ├── engine.go
│   │   │                   ├── engineDesc.go
│   │   │                   ├── factory.go
│   │   │                   ├── lookupTable.go
│   │   │                   ├── property.go
│   │   │                   └── text.go
│   │   ├── version.go
│   │   └── x11.go
│   └── teni/
│       ├── teni.go
│       ├── teni_coverage_test.go
│       ├── teni_type_rule_test.go
│       ├── tone_charset.go
│       ├── typerule_change_char.go
│       ├── typerule_downlvl.go
│       ├── typerule_replace.go
│       ├── typerule_replace_char.go
│       ├── typerule_replace_str.go
│       ├── typerule_replace_vni.go
│       ├── typerule_swap.go
│       └── wordtrie.go
├── teni.xml
├── test-data/
│   ├── LICENSE
│   ├── nodict.tdata
│   ├── nodict.telexw.tdata
│   ├── test-data-gen.go
│   ├── vietnamese.cm.dict.telex1.tdata
│   ├── vietnamese.cm.dict.telex2.tdata
│   ├── vietnamese.cm.dict.telex3.tdata
│   ├── vietnamese.cm.dict.telexw.tdata
│   ├── vietnamese.cm.dict.vni1.tdata
│   ├── vietnamese.cm.dict.vni2.fix.tdata
│   ├── vietnamese.cm.dict.vni3.tdata
│   ├── vietnamese.new.dict.telex1.tdata
│   ├── vietnamese.new.dict.telex2.tdata
│   ├── vietnamese.new.dict.telex3.tdata
│   ├── vietnamese.new.dict.vni1.tdata
│   ├── vietnamese.new.dict.vni2.tdata
│   ├── vietnamese.new.dict.vni3.tdata
│   ├── vietnamese.sp.dict.telex1.fix.tdata
│   ├── vietnamese.sp.dict.telex2.fix.tdata
│   ├── vietnamese.sp.dict.telex3.fix.tdata
│   ├── vietnamese.sp.dict.telexw.fix.tdata
│   ├── vietnamese.sp.dict.vni1.tdata
│   ├── vietnamese.sp.dict.vni2.tdata
│   ├── vietnamese.sp.dict.vni3.tdata
│   ├── vietnamese.std.dict.telex1.tdata
│   ├── vietnamese.std.dict.telex2.tdata
│   ├── vietnamese.std.dict.telex3.tdata
│   ├── vietnamese.std.dict.vni1.tdata
│   ├── vietnamese.std.dict.vni2.tdata
│   └── vietnamese.std.dict.vni3.tdata
└── wm.bash

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Báo lỗi
about: Tạo một báo lỗi

---

**Mô tả lỗi**
Một mô tả ngắn gọn về lỗi đang xảy ra

**Các bước tái hiện lỗi**
(Mở chương trình gì, click chỗ nào, gõ những gì, điều gì xảy ra,...)
Ví dụ:
1. Mở gedit
2. Gõ abc
...
4. Thấy xyz

**Kết quả mong muốn**
Mô tả điều đáng ra phải xảy ra thay vì phát sinh lỗi bên trên.
Ví dụ: Gõ abc thì phải thấy abc chứ không phải xyz

**Ảnh chụp màn hình, hoặc clip quay màn hình**
Nếu cần thiết, hãy [đính kèm hình ảnh](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/) hoặc gửi link youtube [quay lại màn hình](https://www.youtube.com/watch?v=N8M4zsqTkr4) tái hiện lỗi.

**Môi trường**
 - OS và version: (ví dụ: Ubuntu 18.10)
 - Desktop: (Xfce, KDE, Gnome,... hoặc **mặc định**)
 - Phiên bản ibus-teni: (click chuột trái vào icon VI tại góc màn hình để xem phiên bản ibus-teni, bản mới nhất là v1.5.3)
 - Phiên bản IBus: (chạy command `ibus version` để xem phiên bản ibus)
 - Ứng dụng có lỗi khi gõ: (ví dụ: Chrome, Firefox,...)

**Thông tin thêm**
Các nội dung khác có liên quan đến lỗi đang xảy ra (nếu ứng dụng có lỗi trên kia không phổ biến thì hãy thêm hướng dẫn cài đặt)



================================================
FILE: .gitignore
================================================
.idea/
pkg/
*_linux
*.tar.gz
ibus-engine-*
src/dict-gen/vendor/

================================================
FILE: .travis.yml
================================================
sudo: required
language: go

install:
  - make test
  - make build
  - bash deploy.bash
  
script:
  - echo END


================================================
FILE: GPLv3_vi.md
================================================
# Tóm tắt giấy phép GNU GPLv3
GNU General Public License v3.0

## Bạn được phép
-   Tự do chạy chương trình cho bất cứ mục đích nào
-   Tự do sao chép, phân phối chương trình
-   Tự do sửa đổi, cải tiến và tái phát hành chương trình

## Với điều kiện
-   Phải mở mã nguồn dưới giấy phép GPLv3 và giữ nguyên file LICENSE
-   Phải ghi chú nội dung chỉnh sửa, cải tiến của bạn

## Và chấp nhận
-   Từ chối trách nhiệm pháp lý
-   Từ chối bảo hành


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: MAINTAINERS
================================================
Nguyen Cong Hoang <hoangnc.jp@gmail.com>

================================================
FILE: Makefile
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#

engine_name=teni
ibus_e_name=ibus-engine-$(engine_name)
pkg_name=ibus-$(engine_name)
version=1.5.3

engine_dir=/usr/share/$(pkg_name)
ibus_dir=/usr/share/ibus

rpm_src_dir=~/rpmbuild/SOURCES
tar_file=$(pkg_name)-$(version).tar.gz
rpm_src_tar=$(rpm_src_dir)/$(tar_file)
tar_options_src=--transform "s/^\./$(pkg_name)-$(version)/" --exclude={"*.tar.gz",".git",".idea"} .

test:
	GOPATH=$(CURDIR) GOCACHE=/tmp go test teni


cover:
	GOPATH=$(CURDIR) GOCACHE=/tmp go test --cover -c -o test_teni_linux teni
	./test_teni_linux -test.coverprofile=teni_cover.out
	GOPATH=$(CURDIR) GOCACHE=/tmp go tool cover -html=teni_cover.out -o teni_cover.html
	rm -f test_teni_linux teni_cover.out


build:
	GOPATH=$(CURDIR) GOCACHE=/tmp go build -ldflags "-w -s" -o $(ibus_e_name) ibus-$(engine_name)


dict-gen:
	cd src/dict-gen && dep ensure -update
	GOPATH=$(CURDIR) GOCACHE=/tmp go build -o dict_gen_linux dict-gen
	./dict_gen_linux
	rm -f dict_gen_linux


tdata-gen:
	go run test-data/test-data-gen.go
	rm test-data/vietnamese.new.dict.telexw.tdata
	rm test-data/vietnamese.sp.dict.telex1.tdata
	rm test-data/vietnamese.sp.dict.telex2.tdata
	rm test-data/vietnamese.sp.dict.telex3.tdata
	rm test-data/vietnamese.sp.dict.telexw.tdata
	rm test-data/vietnamese.std.dict.telexw.tdata


clean:
	rm -f ibus-engine-* *_linux *_cover.html go_test_* go_build_* test *.gz test
	rm -f debian/files
	rm -rf debian/debhelper*
	rm -rf debian/.debhelper
	rm -rf debian/ibus-teni*


install: build
	mkdir -p $(DESTDIR)$(engine_dir)
	mkdir -p $(DESTDIR)/usr/lib/
	mkdir -p $(DESTDIR)$(ibus_dir)/component/

	cp -R -f except.tmpl.txt icon.png wm.bash dict $(DESTDIR)$(engine_dir)
	cp -f $(ibus_e_name) $(DESTDIR)/usr/lib/
	cp -f $(engine_name).xml $(DESTDIR)$(ibus_dir)/component/


uninstall:
	sudo rm -rf $(DESTDIR)$(engine_dir)
	sudo rm -f $(DESTDIR)/usr/lib/$(ibus_e_name)
	sudo rm -f $(DESTDIR)$(ibus_dir)/component/$(engine_name).xml


src: clean
	tar -zcf $(DESTDIR)/$(tar_file) $(tar_options_src)
	cp -f $(pkg_name).spec $(DESTDIR)/
	cp -f $(pkg_name).dsc $(DESTDIR)/
	cp -f debian/changelog $(DESTDIR)/debian.changelog
	cp -f debian/control $(DESTDIR)/debian.control
	cp -f debian/rules $(DESTDIR)/debian.rules
	cp -f PKGBUILD $(DESTDIR)/PKGBUILD


rpm: clean
	tar -zcf $(rpm_src_tar) $(tar_options_src)
	rpmbuild $(pkg_name).spec -ba


#start ubuntu docker:   docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu bash
#install buildpackages: apt update && apt install dh-make golang libx11-dev -y
deb: clean
	dpkg-buildpackage


.PHONY: test build clean build install uninstall src rpm deb


================================================
FILE: PKGBUILD
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#

# Maintainer: Nguyen Cong Hoang <hoangnc.jp@gmail.com>
pkgname=ibus-teni
pkgver=1.5.3
pkgrel=1
pkgdesc='A Vietnamese IME for IBus'
arch=(any)
license=(GPL3)
url="https://github.com/teni-ime/ibus-teni"
depends=(ibus)
makedepends=('go' 'libx11')
source=($pkgname-$pkgver.tar.gz)
md5sums=('SKIP')
options=('!strip')

build() {
  cd "$pkgname-$pkgver"

  make
}


package() {
  cd "$pkgname-$pkgver"

  make DESTDIR="$pkgdir/" install
}


================================================
FILE: README.md
================================================
[IBus Teni - a Vietnamese Input Method Editor for IBus](https://github.com/teni-ime/ibus-teni)
===================================
[![Build Status](https://travis-ci.org/teni-ime/ibus-teni.svg?branch=master)](https://travis-ci.org/teni-ime/ibus-teni)
[![GitHub release](https://img.shields.io/github/release/teni-ime/ibus-teni.svg)](https://github.com/teni-ime/ibus-teni/releases/latest)
[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://opensource.org/licenses/GPL-3.0)
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/teni-ime/ibus-teni/wiki/H%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-g%C3%B3p-%C3%BD%2C-b%C3%A1o-l%E1%BB%97i)

Copyright 2018, Nguyen Cong Hoang <<hoangnc.jp@gmail.com>>.

IBus Teni is a Vietnamese Input Method Editor (IME) for IBus.

IBus Teni là một bộ gõ tiếng Việt cho IBus.


Teni là gì ?
------------
* Teni là kết hợp **Te**lex và V**ni** - 2 kiểu gõ tiếng Việt phổ biến nhất.
* Teni cũng là kiểu gõ mặc định của bộ gõ này, vừa gõ được Telex, vừa gõ được Vni.


### Sơ lược tính năng
* Chỉ bảng mã Unicode
* 3 kiểu gõ: 
  * **Kiểu gõ Teni** (Telex + Vni, không cho phép gõ nhanh ư, ơ bằng w, [, ])
  * **Kiểu gõ Vni**
  * **Kiểu gõ Telex** (cho phép gõ nhanh ư, ơ bằng w, [, ])
* 2 kiểu đánh dấu thanh:
  * **Dấu thanh chuẩn**
  * **Dấu thanh kiểu mới**
* Gõ dấu tự do, đánh dấu thanh bằng từ điển
* Có danh sách loại trừ ứng dụng không dùng bộ gõ

Cài đặt và cấu hình
------------------

### Cài đặt (Ubuntu)

```sh
sudo add-apt-repository ppa:teni-ime/ibus-teni
sudo apt-get update
sudo apt-get install ibus-teni
ibus restart
```

**Lệnh bên dưới cho phép đọc event chuột, không bắt buộc nhưng cần để ibus-teni hoạt động tốt**
```sh
sudo usermod -a -G input $USER
```


*Cài đặt cho các bản Linux khác và hướng dẫn cài đặt từ mã nguồn: [wiki](https://github.com/teni-ime/ibus-teni/wiki/H%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-c%C3%A0i-%C4%91%E1%BA%B7t)*
    
### Cấu hình
1. [Keyboard input method system: IBus](https://github.com/teni-ime/ibus-teni/wiki/H%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-c%E1%BA%A5u-h%C3%ACnh#1-keyboard-input-method-system-ibus)
2. [Add an input source: Vietnamese(Teni)](https://github.com/teni-ime/ibus-teni/wiki/H%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-c%E1%BA%A5u-h%C3%ACnh#2-add-an-input-source-vietnameseteni)
    
### Gỡ bỏ
```
sudo apt remove ibus-teni
ibus restart
```

Sử dụng
-------------
* Dùng phím tắt mặc định của IBus (thường là ⊞Win+Space) để chuyển đổi giữa các bộ gõ
* IBus-Teni dùng pre-edit để xử lý phím gõ, mặc định sẽ có gạch chân chữ khi đang gõ
* **Khi pre-edit chưa kết thúc mà nhấn chuột vào chỗ khác thì có 3 khả năng xảy ra tùy chương trình**
    * **Chữ đang gõ bị mất**
    * **Chữ đang gõ được commit vào vị trí mới con trỏ**
    * **Chữ đang gõ được commit vào vị trí cũ**
* **Vì vậy đừng quên commit: khi gõ chỉ một chữ, hoặc chữ cuối câu, hoặc sửa chữ giữa câu: nhấn phím *Ctrl* để commit.**
         

Các phiên bản
------------
* Phiên bản thử nghiệm không công khai hoàn thành vào cuối tháng 5/2018
* Phiên bản thử nghiệm công khai phát hành vào đầu tháng 7/2018
* Phiên bản chính thức phát hành vào ngày 29/7/2018

Xem trang [release](https://github.com/teni-ime/ibus-teni/releases) để biết chi tiết các phiên bản đã phát hành.

Góp ý và báo lỗi
--------------
Xem [hướng dẫn](https://github.com/teni-ime/ibus-teni/wiki/H%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-g%C3%B3p-%C3%BD%2C-b%C3%A1o-l%E1%BB%97i)

Giấy phép
-------
Toàn bộ code IBus Teni được viết bởi Nguyen Cong Hoang và những người đóng góp được phát hành dưới giấy phép 
[GNU General Public License version 3](https://opensource.org/licenses/GPL-3.0).

Code trong thư mục [src/ibus-teni/vendor](src/ibus-teni/vendor) là của các bên thứ 3,
xem các thông báo bản quyền trong từng thư mục con.

* godbus: xem [src/ibus-teni/vendor/github.com/godbus/dbus/README.markdown](src/ibus-teni/vendor/github.com/godbus/dbus/README.markdown)
* goibus: xem [src/ibus-teni/vendor/github.com/sarim/goibus/README.md](src/ibus-teni/vendor/github.com/sarim/goibus/README.md)

Dữ liệu từ điển trong thư mục [dict](dict): xem [dict/LICENSE](dict/LICENSE)
* [Dữ liệu từ điển tiếng Việt của Ho Ngoc Duc](http://www.informatik.uni-leipzig.de/~duc/Dict/)
* [Wiktionary tiếng Việt](https://vi.wiktionary.org/wiki/Trang_Chính)
* [Danh sách viết tắt trong tiếng Việt của QUOC-HUNG NGO](https://sites.google.com/site/ngo2uochung/research/dsviettat-tieng-viet)


================================================
FILE: debian/changelog
================================================
ibus-teni (1.5.3-1) stable; urgency=low

  * Release 1.5.3
    - Build cho Ubuntu 20.04

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sat, 10 Apr 2020 00:00:00 +0900

ibus-teni (1.5.2-1) stable; urgency=low

  * Release 1.5.2
    - Sửa kiểu gõ tự do không kiểm tra chính tả

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sat, 24 Nov 2018 00:00:00 +0900


ibus-teni (1.5.1-1) stable; urgency=low

  * Release 1.5.1
    - Sửa kiểu gõ tự do không kiểm tra chính tả

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Fri, 23 Nov 2018 00:00:00 +0900


ibus-teni (1.5.0-1) stable; urgency=low

  * Release 1.5.0
    - Thêm kiểu gõ [Telex] (kiểu gõ này cho phép dùng phím [])
    - Sửa lỗi không xóa hết chữ trên Telegram
    - Sửa lỗi con trỏ chuột nhảy về đầu dòng trên Facebook chat

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 4 Nov 2018 00:00:00 +0900

ibus-teni (1.4.2-1) stable; urgency=low

  * Release 1.4.2
    - Sửa lỗi mất chữ khi đang gõ
    - Sửa lỗi con trỏ chuột nhảy về đầu dòng trên Facebook chat

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Mon, 22 Oct 2018 00:00:00 +0900

ibus-teni (1.4.1-1) stable; urgency=low

  * Release 1.4.1
    - Cập nhật từ điển
    - Sửa lỗi mất chữ khi đang gõ

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 21 Oct 2018 00:00:00 +0900

ibus-teni (1.4.0-1) stable; urgency=low

  * Release 1.4.0
    - Thêm lựa chọn "Giữ nhiều chữ", cho phép sửa dấu những chữ đã gõ xong
    - Thêm lựa chọn "Đúng chính tả", cho phép bỏ qua kiểm tra chính tả

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 7 Oct 2018 00:00:00 +0900

ibus-teni (1.3.3-1) stable; urgency=low

  * Release 1.3.3
    - Tối ưu chức năng "Loại trừ ứng dụng"
    - Sửa lỗi không gõ được sau khi click chuột đi chỗ khác
    - Thêm xử lý xóa pre-edit khi click chuột

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 23 Sep 2018 00:00:00 +0900

ibus-teni (1.3.2-1) stable; urgency=low

  * Release 1.3.2
    - Tối ưu chức năng "Loại trừ ứng dụng"
    - Sửa lỗi không gõ được trên FreeOffice và Wine

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sat, 15 Sep 2018 00:00:00 +0900

ibus-teni (1.3.1-1) stable; urgency=low

  * Release 1.3.1
    - Sửa lỗi chức năng "Loại trừ ứng dụng"

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 9 Sep 2018 00:00:00 +0900

ibus-teni (1.3.0-1) stable; urgency=low

  * Release 1.3.0
    - Thêm chức năng "Loại trừ ứng dụng"
    - Cập nhật từ điển (bổ sung ~700 từ)

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Tue, 4 Sep 2018 00:00:00 +0900

ibus-teni (1.2.2-1) stable; urgency=low

  * Release 1.2.2
    - Thay đổi xử lý commit: forward tất cả các phím khi commit
    - Sửa lỗi khôi phục phím khi nhấn phím dấu 2 lần

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 26 Aug 2018 00:00:00 +0900

ibus-teni (1.2.1-1) stable; urgency=low

  * Release 1.2.1
    - Sửa lỗi khôi phục phím w, [, ] trên kiểu gõ Telex
    - Bổ sung danh sách từ tiếng Việt: xịn

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Tue, 21 Aug 2018 00:00:00 +0900

ibus-teni (1.2.0-1) stable; urgency=low

  * Release 1.2.0
    - Thêm kiểu gõ Telex (cho phép gõ nhanh bằng w, [,])
    - Sửa lỗi mất gợi ý khi gõ trên thanh địa chỉ của Chrome

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Fri, 17 Aug 2018 00:00:00 +0900

ibus-teni (1.1.0-1) stable; urgency=low

  * Release 1.1.0
    - Thêm xử lý nhanh chóng khôi phục phím khi gõ từ không có trong tiếng Việt
    - Sửa lỗi mất space khi gõ trên Dropbox Paper

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Thu, 9 Aug 2018 00:00:00 +0900

ibus-teni (1.0.0-1) stable; urgency=low

  * Release 1.0.0
    - Phiên bản hoàn thiện chính thức: ibus-teni 1.0.0

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 29 Jul 2018 00:00:00 +0900

ibus-teni (0.1-1) stable; urgency=low

  * Release 0.1
    - Phiên bản chính thức đầu tiên: ibus-teni 0.1

 -- Nguyen Cong Hoang <hoangnc.jp@gmail.com>  Sun, 24 Jun 2018 00:00:00 +0900


================================================
FILE: debian/compat
================================================
10

================================================
FILE: debian/control
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#
Source: ibus-teni
Section: utils
Priority: extra
Maintainer: Nguyen Cong Hoang <hoangnc.jp@gmail.com>
Build-Depends: debhelper, golang, libx11-dev
Standards-Version: 1.5.3
Homepage: https://github.com/teni-ime/ibus-teni

Package: ibus-teni
Architecture: any
Depends: ibus
Description: A Vietnamese IME for IBus using Teni-IME.
 Bộ gõ tiếng Việt cho IBus sử dụng Teni-IME.


================================================
FILE: debian/rules
================================================
#!/usr/bin/make -f
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#

%:
	dh $@


================================================
FILE: debian/source/options
================================================
tar-ignore=.git
tar-ignore=.idea
tar-ignore=*.gz
tar-ignore=debian/ibus-teni*
tar-ignore=debian/.debhelper
tar-ignore=debian/debhelper-build-stamp
tar-ignore=debian/ibus-teni.substvars
tar-ignore=debian/files

================================================
FILE: deploy.bash
================================================
#!/bin/bash
echo "Check tag -------------------------------------------------------------------------------------------------------"
if [[ $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then
  echo "Release tag: $TRAVIS_TAG detected"
else
  echo "Release tag not found ($TRAVIS_TAG), do not deploy"
  exit 0
fi

echo "Check OSC ENV ---------------------------------------------------------------------------------------------------"
if [ -z "$OSC_USER" ] || [ -z "$OSC_PASS" ] || [ -z "$OSC_PATH" ]
then
  echo "OSC_USER|OSC_PASS|OSC_PATH is not defined, do not deploy"
  exit 0
fi

echo "Install OSC -----------------------------------------------------------------------------------------------------"
sudo apt-get update
sudo apt-get install -y osc
osc --version

echo "Make OSC config -------------------------------------------------------------------------------------------------"
echo "[general]" >> ~/.oscrc
echo "apiurl = https://api.opensuse.org" >> ~/.oscrc
echo "[https://api.opensuse.org]" >> ~/.oscrc
echo "user = $OSC_USER" >> ~/.oscrc
echo "pass = $OSC_PASS" >> ~/.oscrc

echo "OSC checkout ----------------------------------------------------------------------------------------------------"
mkdir ../obs
cd ../obs
osc checkout $OSC_PATH
cd $TRAVIS_BUILD_DIR

echo "Build new OSC source --------------------------------------------------------------------------------------------"
rm -rf ../obs/$OSC_PATH/*
make build src DESTDIR=../obs/$OSC_PATH
cd ../obs/$OSC_PATH

echo "OSC status ------------------------------------------------------------------------------------------------------"
osc addremove
osc st

echo "OSC commit ------------------------------------------------------------------------------------------------------"
osc ci -m "$TRAVIS_TAG" 


================================================
FILE: dict/LICENSE
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#


########################################################################################################################
Bộ dữ liệu từ tiếng Việt này được trích xuất từ:
- Dữ liệu từ điển tiếng Việt của Hồ Ngọc Đức (http://www.informatik.uni-leipzig.de/~duc/Dict/),
  phát hành dưới giấy phép GPL.

- Wiktionary tiếng Việt (https://vi.wiktionary.org/wiki/Trang_Chính) phát hành dưới giấy phép CC-BY-SA

- Danh sách viết tắt trong tiếng Việt của Ngô Quốc Hưng (https://sites.google.com/site/ngo2uochung/research/dsviettat-tieng-viet),
  đã được tác giả cho phép sử dụng.

Bộ dữ liệu này là một phần của ibus-teni, được phát hành dưới giấy phép GPLv3.
Để rõ các điều khoản và điều kiện khi sử dụng bộ dữ liệu này, xin hãy xem tại:
https://www.gnu.org/licenses/gpl-3.0.en.html


########################################################################################################################
Free Vietnamese Dictionary Project's database license
------------------------------------------------------------------------------------------------------------------------
This is the English-Vietnamese dictionary database of the Free Vietnamese Dictionary Project.
It contains more than 109.000 entries with definitions and illustrative examples.
This database was compiled by Ho Ngoc Duc and other members of
the Free Vietnamese Dictionary Project (http://www.informatik.uni-leipzig.de/~duc/Dict/)
About 5.000 technical terms were imported from VACETS Dictionary Project (http://www.saigon.com/~diction/)
Copyright (C) 1997-2003 The Free Vietnamese Dictionary Project
Last updated 2004-07-01
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software Foundation
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY
See the GNU General Public License for more details.
------------------------------------------------------------------------------------------------------------------------


================================================
FILE: dict/vietnamese.cm.dict
================================================
à
ả
ã
á
ạ
ác
ạc
ácbon
ách
ạch
ácxtơ
ađai
ảh
ài
ải
ãi
ái
ại
alô
àm
ảm
ãm
ám
ạm
àn
ản
ãn
án
ạn
àng
ảng
ãng
áng
ạng
ành
ảnh
ãnh
ánh
ạnh
ào
ảo
ão
áo
ạo
aỏi
àp
áp
ạp
át
ạt
àu
ảu
áu
ạu
ày
ảy
ãy
áy
ạy
ă
ằ
ẳ
ẵ
ắ
ặ
ăc
ắc
ặc
ăcr
ăh
ăk
ắk
ăm
ằm
ẳm
ẵm
ắm
ặm
ăn
ằn
ẳn
ẵn
ắn
ặn
ăng
ằng
ẳng
ẵng
ắng
ặng
ăngten
ăngtim
ắp
ặp
ắt
ặt
ằu
â
ầ
ẩ
ẫ
ấ
ậ
ấc
ậc
âm
ầm
ẩm
ẫm
ấm
ậm
ân
ần
ẩn
ẫn
ấn
ận
âng
ầng
ẩng
ẫng
ấng
ậng
âp
ấp
ập
ất
ật
âu
ầu
ẩu
ẫu
ấu
ậu
ây
ầy
ẩy
ẫy
ấy
ậy
bà
bả
bã
bá
bạ
bác
bạc
bách
bạch
bài
bải
bãi
bái
bại
bàm
bãm
bám
bạm
bàn
bản
bán
bạn
bàng
bảng
bãng
báng
bạng
bành
bảnh
bánh
bạnh
bào
bảo
bão
báo
bạo
báp
bạp
bát
bạt
bàu
bảu
báu
bạu
bày
bảy
báy
bayơ
bắc
bặc
băm
bằm
bẳm
bẵm
bặm
băn
bằn
bẳn
bắn
bặn
băng
bằng
bẳng
bẵng
bắng
bặng
bắp
bặp
bắt
bặt
bấc
bậc
bâm
bầm
bẩm
bẫm
bấm
bậm
bân
bần
bẩn
bấn
bận
bâng
bầng
bẩng
bẫng
bấp
bập
bất
bật
bâu
bầu
bẩu
bẫu
bấu
bậu
bây
bầy
bẩy
bẫy
bấy
bậy
bè
bẻ
bẽ
bé
bẹ
béc
bèm
bẻm
bèn
bẽn
bén
bẹn
béng
bẻnh
bèo
bẻo
bẽo
béo
bẹo
bép
bẹp
bét
bẹt
bê
bề
bể
bễ
bế
bệ
bệch
bên
bền
bến
bện
bênh
bềnh
bệnh
bếp
bêt
bết
bệt
bête
bêu
bều
bễu
bếu
bệu
bhallê
bì
bỉ
bĩ
bí
bị
bìa
bịa
bích
bịch
biếc
biêm
biểm
biếm
biên
biền
biển
biến
biện
biêng
biếng
biêt
biết
biệt
biêu
biều
biểu
biễu
biếu
bìh
bìm
bỉm
bím
bìn
bín
bịn
bình
bỉnh
bĩnh
bính
bịnh
bịp
bít
bịt
bìu
bỉu
bĩu
bíu
bịu
blá
blái
blăng
blâu
blóm
blóma
blọn
blô
blúc
bluộm
bnđc
bò
bỏ
bõ
bó
bọ
boạt
bóc
bọc
bòi
bỏi
bõi
bói
bòm
bỏm
bõm
bòn
bỏn
bón
bọn
bòng
bỏng
bõng
bóng
bọng
bóp
bọp
bót
bọt
bô
bồ
bổ
bỗ
bố
bộ
bốc
bộc
bôi
bồi
bổi
bối
bội
bôm
bồm
bôn
bồn
bổn
bốn
bộn
bông
bồng
bổng
bỗng
bống
bộng
bốp
bộp
bốt
bột
bơ
bờ
bở
bỡ
bớ
bợ
bớc
bơi
bời
bởi
bỡi
bới
bơm
bờm
bợm
bơn
bờn
bởn
bỡn
bớn
bợn
bớp
bợp
bớt
bợt
bợu
brâu
brôm
brơ
bù
bủ
bú
bụ
bùa
bủa
búa
bụa
búc
bục
bùi
bủi
búi
bụi
búk
bulông
bùm
bủm
bũm
bụm
bùn
bủn
bún
bùng
bủng
búng
bụng
buộc
buồi
buổi
buối
buội
buồm
buôn
buồn
buông
buồng
buốt
buột
búp
bụp
bút
bụt
buýt
bư
bứ
bự
bưa
bừa
bửa
bữa
bứa
bựa
bức
bực
bưng
bừng
bửng
bứng
bựng
bước
bươi
bưởi
bươm
bướm
bươn
bương
bường
bướng
bướp
bượt
bươu
bướu
bứt
bựt
bưu
bửu
cà
cả
cá
cạ
các
cạc
cácbon
cách
cạch
cácxt
cacxtơ
cácxtơ
café
cài
cải
cãi
cái
cại
calô
càm
cảm
cãm
cám
cạm
campôt
càn
cản
cán
cạn
càng
cảng
cáng
cành
cảnh
cánh
cạnh
canô
canxít
cào
cảo
cão
cáo
cạo
cáp
cạp
carbón
cartón
cát
cạt
càu
cảu
cáu
cạu
cày
cảy
cáy
cạy
că
cắc
cặc
căm
cằm
cắm
cặm
căn
cằn
cẳn
cắn
cặn
căng
cằng
cẳng
cẵng
cắng
căo
cắp
cặp
cắt
cặt
câ
cầ
câble
cấc
câm
cầm
cẩm
cẫm
cấm
cân
cần
cẩn
cẫn
cấn
cận
câng
cẫng
cấp
cập
cất
cật
câu
cầu
cẩu
cẫu
cấu
cậu
cây
cầy
cẩy
cấy
cậy
céng
cê
chà
chả
chã
chá
chạ
chác
chạc
chách
chạch
chài
chải
chãi
chái
chàm
chảm
chãm
chám
chạm
chán
chạn
chàng
chảng
cháng
chạng
chành
chảnh
chánh
chạnh
chào
chảo
chão
cháo
chạo
cháp
chạp
chát
chạt
chàu
chảu
cháu
chày
chảy
cháy
chạy
chắc
chặc
chăm
chằm
chẳm
chắm
chặm
chăn
chằn
chẳn
chẵn
chắn
chặn
chăng
chằng
chẳng
chắng
chặng
chắp
chặp
chắt
chặt
chấ
chậc
châm
chầm
chẩm
chẫm
chấm
chậm
chân
chần
chẩn
chấn
chận
chẩng
chấng
chấp
chập
chất
chật
châu
chầu
chẩu
chẫu
chấu
chậu
chây
chầy
chẩy
chấy
chậy
chè
chẻ
chẽ
ché
chẹ
chèm
chẻm
chém
chèn
chẻn
chẽn
chén
chẹn
chéng
chèo
chẻo
chẽo
chéo
chẹo
chép
chẹp
chét
chẹt
chê
chề
chễ
chế
chệ
chệc
chếch
chệch
chêm
chềm
chễm
chên
chện
chênh
chềnh
chểnh
chễnh
chếnh
chệnh
chếp
chệp
chết
chệt
chêu
chì
chỉ
chĩ
chí
chị
chìa
chỉa
chĩa
chịa
chích
chịch
chiếc
chiêm
chiểm
chiếm
chiên
chiền
chiển
chiến
chiện
chiêng
chiềng
chiếng
chiếp
chiệp
chiết
chiệt
chiêu
chiều
chiểu
chiếu
chìm
chỉm
chím
chỉn
chĩn
chín
chình
chỉnh
chĩnh
chính
chíp
chít
chịt
chìu
chĩu
chíu
chịu
chò
chỏ
chõ
chó
chọ
chỏa
chõa
chóa
choác
choạc
choách
choài
choãi
choái
choại
choán
choàng
choảng
choáng
choạng
choãnh
choạp
choắc
choăn
choắt
chóc
chọc
choèn
choẻn
choét
choẹt
chòi
chỏi
chõi
chói
chọi
chòm
chỏm
chõm
chỏn
chõn
chón
chọn
chòng
chỏng
chõng
chóng
chóp
chót
chọt
chô
chồ
chổ
chỗ
chộ
chốc
chôi
chồi
chổi
chỗi
chối
chội
chôm
chồm
chổm
chỗm
chôn
chồn
chổn
chốn
chộn
chông
chồng
chổng
chống
chốp
chộp
chốt
chột
chơ
chờ
chở
chớ
chợ
chơi
chời
chới
chơm
chờm
chởm
chớm
chơn
chờn
chớn
chợn
chớp
chợp
chớt
chợt
chù
chủ
chú
chụ
chùa
chúa
chuáng
chuân
chuẩn
chuất
chuật
chúc
chục
chuế
chuếch
chuệch
chuếnh
chuệnh
chùi
chủi
chũi
chúi
chùm
chủm
chũm
chúm
chụm
chùn
chủn
chũn
chùng
chủng
chúng
chuốc
chuộc
chuôi
chuồi
chuỗi
chuối
chuội
chuôm
chuốm
chuồn
chuông
chuồng
chuộng
chuốt
chuột
chụp
chút
chụt
chuyên
chuyền
chuyển
chuyến
chuyện
chuyết
chư
chừ
chử
chữ
chứ
chưa
chừa
chửa
chữa
chứa
chức
chực
chửi
chưn
chưng
chừng
chửng
chững
chứng
chựng
chước
chược
chưởi
chườm
chương
chường
chưởng
chưỡng
chướng
chượp
chứt
chưu
chửu
chữu
chựu
cì
cí
cịt
clé
clông
cò
cỏ
cõ
có
cọ
cóc
cọc
còi
cỏi
cõi
cói
còm
cỏm
cọm
còn
cỏn
cón
cọn
còng
cỏng
cõng
cóng
cọng
cóp
cọp
cót
cọt
cô
cồ
cổ
cỗ
cố
cộ
cốc
cộc
côi
cồi
cổi
cỗi
cối
cội
côm
cồm
cốm
cộm
côn
cồn
cổn
cốn
cộn
cône
công
cồng
cổng
cống
cộng
cốp
cộp
côt
cốt
cột
cơ
cờ
cỡ
cớ
cơi
cời
cởi
cỡi
cới
cơm
cỡm
cớm
cợm
cơn
cờn
cởn
cỡn
cớn
cợn
cợp
cớt
cợt
crô
crôm
crông
crưm
cù
củ
cũ
cú
cụ
cùa
của
cúa
cúc
cục
cùi
củi
cũi
cúi
cụi
cùm
củm
cúm
cụm
cùn
củn
cũn
cùng
củng
cũng
cúng
cụng
cuốc
cuộc
cuồi
cuối
cuội
cuỗm
cuồn
cuốn
cuộn
cuông
cuồng
cuống
cuộng
cuôr
cúp
cụp
cút
cụt
cư
cừ
cử
cữ
cứ
cự
cưa
cửa
cứa
cựa
cức
cực
cửi
cưng
cửng
cứng
cước
cược
cười
cưỡi
cưới
cườm
cương
cường
cưỡng
cướp
cứt
cưu
cừu
cửu
cữu
cứu
cựu
dà
dả
dã
dá
dạ
dác
dạc
dách
dạch
dài
dải
dãi
dái
dại
dàm
dảm
dám
dạm
dàn
dản
dãn
dán
dạn
dàng
dáng
dạng
dành
dảnh
dánh
dào
dáo
dạo
dáp
dát
dạt
dàu
dáu
dày
dảy
dãy
dáy
dạy
dắc
dặc
dăm
dằm
dặm
dăn
dằn
dẳn
dẵn
dặn
dăng
dằng
dẳng
dẵng
dắng
dặng
dắt
dặt
dâ
dậ
dâm
dầm
dẩm
dẫm
dấm
dậm
dân
dần
dẩn
dẫn
dấn
dận
dâne
dâng
dậng
dấp
dập
dật
dâu
dầu
dẩu
dẫu
dấu
dậu
dây
dầy
dẩy
dẫy
dấy
dậy
dè
dẻ
dẽ
dé
dẹ
déc
dèm
dẻm
dém
dẹm
dèn
dèo
dẻo
déo
dẹo
dép
dẹp
dẹt
dê
dề
dể
dễ
dế
dệ
dềm
dền
dện
dềng
dênh
dềnh
dết
dệt
dêu
dều
dệu
dì
dỉ
dĩ
dí
dị
dìa
dĩa
día
dịa
dích
dịch
diếc
diệc
diêm
diềm
diễm
diếm
diệm
diên
diển
diễn
diến
diện
diềng
diếp
diệp
diết
diệt
diêu
diều
diểu
diễu
diếu
diệu
dìm
dím
dĩn
dín
dĩnh
dính
dịnh
díp
dịp
dìt
dít
dịt
dìu
díu
dịu
dliê
dò
dỏ
dó
dọ
doãi
doãn
doãng
doạng
doành
dóc
dọc
dòi
dỏi
dõi
dói
dọi
dòm
dỏm
dóm
dòn
dón
dọn
dòng
dỏng
dõng
dóng
dọng
dọp
dót
dô
dồ
dổ
dỗ
dộ
dốc
dộc
dôi
dồi
dổi
dỗi
dối
dội
dôn
dồn
dốn
dộn
dông
dỗng
dống
dộng
dộp
dốt
dột
dơ
dờ
dở
dỡ
dớ
dợ
dơi
dời
dới
dợi
dởm
dơn
dờn
dỡn
dớn
dợn
dớp
dợp
dớt
drăm
drăng
dù
dủ
dũ
dú
dụ
dùa
dũa
dúa
dụa
duân
duẩn
duẫn
duật
dục
duệ
duềnh
dùi
dủi
dũi
dúi
dụi
dùm
dúm
dụm
dùn
dún
dùng
dũng
dúng
dụng
duốc
duộc
duôi
duổi
duỗi
duối
duồn
duông
duồng
duơ
duơn
dút
dụt
dụy
duyên
duyến
duyện
duyệt
dư
dừ
dử
dữ
dứ
dự
dưa
dừa
dứa
dựa
dức
dực
dưng
dừng
dửng
dững
dứng
dựng
dược
dười
dưới
dượi
dương
dường
dưỡng
dướng
dượng
dượt
dứt
dựt
dửu
dữu
dứu
dựu
dýn
đ
đa
đà
đả
đã
đá
đạ
đac
đác
đạc
đách
đạch
đai
đài
đãi
đái
đại
đam
đàm
đảm
đám
đạm
đan
đàn
đản
đán
đạn
đang
đàng
đảng
đãng
đáng
đanh
đành
đảnh
đánh
đao
đào
đảo
đáo
đạo
đáp
đạp
đát
đạt
đau
đáu
đay
đày
đảy
đãy
đáy
đẵ
đắc
đặc
đăk
đắk
đăm
đằm
đẵm
đắm
đằn
đẵn
đắn
đặn
đăng
đằng
đẳng
đẵng
đắng
đặng
đắp
đắt
đặt
đằu
đâm
đầm
đẫm
đấm
đậm
đần
đẫn
đấn
đận
đâng
đấng
đập
đất
đật
đâu
đầu
đẩu
đấu
đậu
đây
đầy
đẩy
đẫy
đấy
đậy
đe
đè
đẻ
đẽ
đéc
đem
đèm
đen
đèn
đẹn
đeng
đeo
đèo
đẽo
đéo
đẹp
đét
đẹt
đê
đề
để
đễ
đế
đệ
đếch
đêh
đêm
đềm
đếm
đệm
đên
đền
đến
đênh
đềnh
đểnh
đễnh
đệp
đêu
đều
đểu
đg
đgt
đhur
đi
đì
đĩ
đị
đìa
đỉa
đĩa
đía
địa
đích
địch
đien
điếc
điềm
điểm
điếm
điệm
điên
điền
điển
điện
điêng
điếng
điệp
điệt
điêu
điều
điểu
điếu
điệu
đin
đìn
đinh
đình
đỉnh
đĩnh
đính
định
đip
đít
địt
điu
đìu
địu
đo
đò
đỏ
đõ
đó
đọ
đoa
đoác
đoài
đoái
đoan
đoàn
đoản
đoán
đoạn
đoàng
đoảng
đoãng
đoành
đoạt
đoc
đóc
đọc
đoi
đòi
đỏi
đói
đọi
đom
đòm
đỏm
đóm
đon
đòn
đón
đọn
đong
đòng
đỏng
đóng
đọng
đọp
đót
đọt
đô
đồ
đổ
đỗ
đố
độ
đôc
đốc
độc
đôi
đồi
đổi
đỗi
đối
đội
đôm
đồm
đốm
đôn
đồn
đốn
độn
đông
đồng
đổng
đỗng
đống
động
đốp
độp
đốt
đột
đơ
đờ
đở
đỡ
đớ
đợ
đời
đới
đợi
đơm
đờm
đởm
đơn
đờn
đởn
đớn
đớp
đợp
đớt
đợt
đpcm
đpctntư
đph
đphg
đqg
đqgtnn
đqt
đr
đrá
đrao
đrăk
đrắk
đrong
đrô
đrung
đs
đsp
đt
đtb
đtbxh
đtl
đtla
đtlx
đtm
đtntl
đtpt
đts
đtt
đttp
đttpmt
đttqg
đu
đù
đủ
đú
đụ
đua
đùa
đũa
đúa
đúc
đục
đuểnh
đui
đùi
đủi
đũi
đum
đùm
đúm
đun
đùn
đún
đụn
đung
đùng
đủng
đũng
đúng
đụng
đuốc
đuôi
đuổi
đuối
đuồn
đuỗn
đuống
đuột
đup
đúp
đụp
đút
đụt
đừ
đử
đứ
đưa
đừa
đứa
đức
đực
đưng
đừng
đứng
đựng
đước
được
đười
đượm
đườn
đưỡn
đương
đường
đứt
đv
đvn
đvqg
đxx
è
ẻ
ẽ
é
ẹ
éc
ẹc
éct
ẻh
éh
èm
ẻm
ẽm
ém
ẹm
èn
ẻn
ẽn
én
ẹn
èng
ẻng
éng
èo
ẻo
ẽo
éo
ẹo
ép
ẹp
ét
ẹt
ê
ề
ể
ễ
ế
ệ
êa
êbur
êc
ếc
ệc
ếch
ệch
êcle
êga
êh
êm
ềm
ểm
ễm
ếm
ệm
ên
ền
ển
ễn
ến
ện
êng
ềng
ểng
ễng
ếng
ệng
ênh
ềnh
ểnh
ễnh
ếnh
ệnh
ếp
ệp
êpôc
êpốc
êr
êt
ết
ệt
êtan
ête
êu
ều
ểu
ễu
ếu
ệu
êxim
êy
fà
frăng
fría
fù
fú
fútbol
gà
gả
gã
gá
gạ
gác
gạc
gạch
gài
gãi
gái
galông
gàn
gán
gạn
gàng
gành
gảnh
gánh
gạnh
gào
gáo
gạo
gáp
gát
gạt
gàu
gáu
gày
gảy
gãy
gáy
gạy
gặc
găm
gằm
gắm
gặm
găn
gằn
gắn
gặn
găng
gắng
gặng
gắp
gặp
gắt
gặt
gấc
gâm
gầm
gẩm
gẫm
gấm
gậm
gân
gần
gấn
gận
gầng
gấp
gập
gất
gật
gâu
gầu
gẫu
gấu
gây
gầy
gẩy
gẫy
gấy
gậy
gẻ
gém
gép
gềnh
gệt
ghè
ghẻ
ghẽ
ghé
ghẹ
ghém
ghèn
ghẹn
ghẹo
ghép
ghét
ghê
ghề
ghế
ghệ
ghếch
ghềnh
ghểnh
ghệt
ghì
ghĩa
ghiếc
ghiền
ghìm
ghín
ghinê
ghình
gì
gỉ
gĩ
gí
già
giả
giã
giá
giạ
giác
giạc
giải
giãi
giái
giại
giàm
giảm
giám
giạm
giàn
giản
giãn
gián
giàng
giảng
giáng
giạng
giành
giảnh
giào
giảo
giáo
giáp
giát
giạt
giàu
giảu
giavê
giày
giãy
giáy
giặc
giăm
giằm
giẵm
giắm
giặm
giằn
giẵn
giắn
giặn
giăng
giằng
giắng
giặng
giặp
giắt
giặt
giâ
giấc
giâm
giầm
giẫm
giấm
giậm
giân
giần
giấn
giận
giầng
giẩng
giầnh
giấp
giập
giất
giật
giâu
giầu
giấu
giậu
giây
giầy
giẩy
giẫy
giấy
gíc
gích
giẻ
giẽ
gié
giéc
gièm
giém
giẻo
giéo
giẹo
giép
giẹp
giẹt
giê
giề
giếc
giệch
giếm
giền
giêng
giềng
giếng
giềnh
giệnh
giết
giệt
giễu
giếu
giệu
gìm
gìn
giò
giỏ
giõ
gió
giọ
gióc
giọc
giòi
giỏi
giõi
giói
giọi
giòn
giỏn
gión
giọn
giòng
giỏng
giõng
gióng
giọng
giót
giọt
giô
giồ
giổ
giỗ
giộ
giốc
giôi
giồi
giổi
giỗi
giối
giội
giôn
giông
giồng
giống
giộng
giộp
giốt
giột
giơ
giờ
giở
giỡ
giớ
giời
giới
giớm
giợm
giờn
giởn
giỡn
giợn
giợt
gíp
gít
gịt
giù
giũ
giú
giùa
giũa
giụa
giục
giùi
giủi
giúi
giụi
giùm
giúm
giụm
giùn
giún
giùng
giủng
giuộc
giuỗi
giuộm
giúp
giư
giừ
giữ
giưa
giữa
giứa
giương
giường
giướng
giượng
giựt
glây
gò
gõ
gó
gọ
góc
gòi
gỏi
gõi
gói
gọi
gỏl
gòn
gón
gọn
gòng
gỏng
gọng
góp
gót
gọt
goục
gô
gồ
gổ
gỗ
gộ
gốc
gộc
gồi
gối
gội
gôm
gồm
gốm
gôn
gông
gồng
gống
gốp
gộp
gột
gơ
gờ
gở
gỡ
gớc
gởi
gới
gợi
gờm
gớm
gơn
gờn
gợn
gợt
grát
gù
gũ
gú
gụ
gục
guê
gùi
gũi
gụi
gùn
gún
gùng
gúng
guó
guốc
guộc
guồi
guồng
guột
gút
gụt
gư
gừ
gừa
gửi
gừng
gứng
gươm
gườm
gượm
gương
gường
gưỡng
gượng
gỵa
hà
hả
há
hạ
hác
hạc
hách
hạch
hài
hải
hãi
hái
hại
haló
hàm
hảm
hãm
hám
hạm
hàn
hản
hãn
hán
hạn
hàng
hảng
hãng
háng
hạng
hành
hảnh
hãnh
hánh
hạnh
hào
hảo
hão
háo
hạo
háp
hạp
hát
hạt
hàu
háu
hảy
hãy
háy
hạy
hắ
hắc
hặc
hăm
hằm
hẳm
hằn
hẳn
hắn
hăng
hằng
hẵng
hắng
hắt
hấc
hậc
hâm
hầm
hẩm
hẫm
hấm
hậm
hân
hẫn
hấn
hận
hâng
hẩng
hẫng
hấng
hấp
hập
hất
hật
hâu
hầu
hẩu
hẫu
hấu
hậu
hây
hầy
hẩy
hẫy
hấy
hđbt
hè
hẻ
hẽ
hé
hẹ
héc
hẹc
hécta
hèm
hẻm
hẹm
hèn
hẻn
hẹn
hẹng
hèo
hẻo
héo
hép
hẹp
hét
hẹt
hê
hề
hể
hễ
hế
hệ
hếch
hệch
hêli
hềm
hên
hển
hến
hênh
hềnh
hểnh
hết
hệt
hêu
hều
hểu
hếu
hì
hỉ
hĩ
hí
hích
hịch
hiêm
hiềm
hiểm
hiếm
hiên
hiền
hiển
hiến
hiện
hiêng
hiểng
hiếng
hiếp
hiệp
hiết
hiệt
hiêu
hiều
hiểu
hiếu
hiệu
hĩm
hỉn
hình
hỉnh
hĩnh
híp
hít
hìu
hmông
hnđ
hò
hỏ
hó
họ
hoác
hoách
hoạch
hoài
hoải
hoãi
hoái
hoại
hoàn
hoản
hoãn
hoán
hoạn
hoàng
hoảng
hoãng
hoáng
hoành
hoảnh
hoánh
hoạnh
hoát
hoạt
hoáy
hoắc
hoặc
hoăm
hoắm
hoằn
hoẳn
hoăng
hoằng
hoẵng
hoắt
hoân
hóc
học
hoẻn
hoét
hoẹt
hòi
hỏi
hói
hòm
hỏm
hõm
hóm
hòn
hỏn
hón
hòng
hỏng
hóng
họng
hóp
họp
hót
hô
hồ
hổ
hỗ
hố
hộ
hốc
hộc
hôi
hồi
hổi
hối
hội
hôm
hồm
hổm
hỗm
hôn
hồn
hổn
hỗn
hộn
hông
hồng
hổng
hỗng
hống
hốp
hộp
hốt
hột
hôtel
hơ
hờ
hở
hớ
hơg
hơi
hời
hởi
hỡi
hới
hợi
hờm
hớm
hợm
hơn
hờn
hớn
hơng
hớp
hợp
hớt
hợt
hrê
hrệ
hù
hủ
hũ
hú
hụ
hùa
húa
huân
huẩn
huấn
huất
huầy
húc
hục
huê
huề
huế
huệ
huếch
huênh
huểnh
huếnh
hùi
hủi
húi
hụi
hùm
hũm
húm
hụm
hùn
hủn
hùng
hủng
húng
huổi
huông
huồng
huống
huơ
huờ
huơn
huờn
huỡn
húp
hụp
hút
hụt
huých
huỵch
huyên
huyền
huyển
huyễn
huyến
huyện
huyết
huyệt
huỳnh
huỷnh
huýnh
huýt
hư
hừ
hử
hữ
hứ
hự
hưa
hừa
hữa
hứa
hức
hực
hừm
hưn
hưng
hừng
hửng
hững
hứng
hước
hướm
hượm
hương
hường
hưởng
hướng
hươu
hưu
hữu
hựu
hỷ
hỹ
hý
hyđro
ì
ỉ
ĩ
í
ị
ìa
ỉa
ĩa
ía
ịa
iác
iải
iãi
iại
iảm
iám
iạm
iàn
iản
iãn
ián
iàng
iảng
iáng
iạng
iành
iảnh
iào
iảo
iáo
iáp
iát
iạt
iàu
iảu
iày
iãy
iặc
iăm
iằm
iẵm
iặm
iằn
iặn
iăng
iằng
iắt
iặt
iấc
iâm
iầm
iẫm
iấm
iậm
iần
iấn
iận
iấp
iập
iật
iâu
iầu
iấu
iậu
iây
iầy
iẫy
iấy
íc
ỉch
ích
ịch
iẻ
iẽ
ié
ièm
iẻn
iẻo
iéo
iẹo
iẹp
iê
iề
iếc
iệc
iêm
iềm
iểm
iễm
iếm
iệm
iên
iền
iển
iễn
iến
iện
iêng
iềng
iểng
iễng
iếng
iệng
iếp
iệp
iêt
iết
iệt
iêu
iều
iểu
iễu
iếu
iệu
ìh
ìi
ìm
ỉm
ĩm
ím
ịm
ìn
ỉn
ĩn
ín
ịn
ỉng
íng
ịng
ình
ỉnh
ĩnh
ính
ịnh
iò
iỏ
ió
iọ
iọc
iòi
iỏi
iói
iọi
iòn
iỏn
ión
iòng
iỏng
ióng
iọng
iọt
iô
iồ
iỗ
iộ
iốc
iồi
iổi
iỗi
iối
iội
iôl
iôn
iông
iồng
iống
iốt
iơ
iờ
iở
iời
iới
iờn
iỡn
íp
ịp
ít
ịt
ìu
ỉu
ĩu
íu
ịu
iụa
iục
iủi
iụi
iuộc
iư
iữa
iựt
iý
jà
jì
jí
jó
josé
jú
jút
jữ
kách
kađai
kài
kalá
kalú
kạn
kcách
kđrao
kè
kẻ
kẽ
ké
kẹ
kéc
kèm
kẻm
kẽm
kém
kèn
kén
kẹn
kẻng
kèo
kẻo
kẽo
kéo
kẹo
kép
kẹp
két
kẹt
kê
kề
kể
kế
kệ
kếch
kệch
kềm
kên
kền
kêng
kênh
kềnh
kễnh
kệnh
kếp
kết
kêu
kều
kgông
khà
khả
khá
khạ
khác
khạc
khách
khải
khái
khại
khảm
khám
khàn
khản
khán
khàng
khảng
kháng
khạng
khành
khảnh
khánh
khào
khảo
kháo
khạo
kháp
khạp
khát
khạt
kháu
khảy
kháy
khắ
khắc
khặc
khăm
khẳm
khắm
khăn
khằn
khẳn
khắn
khăng
khằng
khẳng
khắng
khắp
khắt
khấc
khâm
khẩm
khấm
khân
khẩn
khấn
khẩng
khấng
khấp
khập
khất
khật
khâu
khẩu
khấu
khậu
khẩy
khè
khẻ
khẽ
khé
khẹ
khẹc
khém
khèn
khén
khèo
khẻo
khéo
khép
khét
khẹt
khê
khề
khể
khế
khệ
khến
khệng
khênh
khềnh
khểnh
khệnh
khêu
khều
khểu
khì
khỉ
khí
khị
khìa
khỉa
khía
khịa
khích
khiêm
khiểm
khiếm
khiệm
khiên
khiền
khiển
khiến
khiêng
khiễng
khiếp
khiết
khiêu
khiều
khiếu
khìn
khín
khỉnh
khĩnh
khít
khịt
khìu
khỉu
khíu
khịu
khlá
khò
khỏ
khó
khoác
khoạc
khoách
khoải
khoái
khoản
khoán
khoảng
khoáng
khoảnh
khoào
khoát
khoạt
khoáy
khoắc
khoăm
khoằm
khoắm
khoăn
khoắn
khoắng
khoắt
khóc
khoèn
khoèo
khoẻo
khoét
khỏi
khói
khòm
khóm
khọm
khòn
khọn
khòng
khỏng
khót
khô
khổ
khố
khốc
khôg
khôi
khổi
khối
khôn
khổn
khốn
không
khổng
khống
khốt
khơ
khờ
khớ
khơi
khởi
khới
khơm
khớm
khơme
khờn
khớn
khớp
khù
khủ
khũ
khú
khụ
khùa
khủa
khúa
khuân
khuẩn
khuẫn
khuâng
khuất
khuây
khuấy
khúc
khục
khuê
khuể
khuếch
khúm
khùng
khủng
khuôn
khuông
khuơ
khụt
khuých
khuyên
khuyển
khuyến
khuyết
khuỳnh
khuýnh
khuỷu
khuỵu
khư
khừ
khử
khứ
khự
khừa
khứa
khựa
khừng
khửng
khứng
khựng
khước
khươi
khươm
khươn
khương
khưỡng
khướt
khướu
khưu
khứu
khyển
kì
kỉ
kĩ
kí
kị
kìa
kỉch
kích
kịch
kiệ
kiêm
kiềm
kiểm
kiếm
kiệm
kiên
kiền
kiển
kiến
kiện
kiêng
kiềng
kiểng
kiễng
kiếng
kiếp
kiệp
kiết
kiệt
kiêu
kiều
kiểu
kiếu
kiệu
kiló
kilô
kilôgam
kilôm
kilômet
kìm
kỉm
kìn
kín
kịn
kình
kỉnh
kính
kinó
kíp
kịp
kít
kịt
kitô
kĩu
kíu
kò
kó
kòp
kót
kô
kốc
kôn
kông
kơ
kơi
kpă
kpăng
kráp
krăng
krẹ
krêy
krôm
krông
ktlê
kủ
kúba
kúc
kuênh
kủo
kỳ
kỷ
kỹ
ký
kỵ
là
lả
lã
lá
lạ
lác
lạc
lách
lạch
lài
lải
lãi
lái
lại
làm
lảm
lãm
lạm
làn
lãn
lán
lạn
làng
lảng
lãng
láng
lạng
lành
lảnh
lãnh
lánh
lạnh
lào
lảo
lão
láo
lạo
láp
lạp
lát
lạt
làu
lảu
láu
lạu
lày
lảy
láy
lạy
lazăng
lắc
lặc
lăk
lắk
lăm
lằm
lẳm
lắm
lặm
lăn
lằn
lẳn
lặn
lăng
lằng
lẳng
lẵng
lắng
lặng
lắp
lặp
lắt
lặt
lấc
lâm
lầm
lẩm
lẫm
lấm
lậm
lân
lần
lẩn
lẫn
lấn
lận
lâng
lấng
lâp
lấp
lập
lất
lật
lâu
lầu
lẩu
lấu
lậu
lây
lầy
lẩy
lẫy
lấy
lậy
lè
lẻ
lẽ
lé
lẹ
léc
lèm
lẻm
lém
lẹm
lèn
lẻn
lẽn
lén
lẹn
lèng
lẻng
léng
lèo
lẻo
lẽo
léo
lẹo
lép
lẹp
lét
lẹt
lê
lề
lể
lễ
lệ
lếch
lệch
lên
lênh
lềnh
lểnh
lễnh
lệnh
lênin
lết
lệt
lêu
lều
lểu
lễu
lếu
lệu
lểy
lếy
lì
lí
lị
lìa
lía
lịa
líc
lích
lịch
liếc
liêm
liềm
liễm
liếm
liệm
liên
liền
liễn
liến
liêng
liềng
liểng
liếng
liệng
liếp
liệp
liệt
liêu
liều
liểu
liễu
liếu
liệu
lìm
lỉm
lịm
lìn
lình
lỉnh
lĩnh
lính
lịnh
líp
lịp
lít
lịt
litô
lìu
líu
lịu
lò
lõ
ló
lọ
loạc
loách
loài
loại
loàn
loán
loạn
loàng
loảng
loãng
loáng
loạng
loát
loạt
loăn
loăng
loằng
loắt
lóc
lọc
loẻn
loét
loẹt
lòi
lỏi
lõi
lói
lọi
lòm
lỏm
lõm
lóm
lọm
lòn
lỏn
lón
lọn
lòng
lỏng
lõng
lóng
lọng
lóp
lọp
lót
lọt
lô
lồ
lổ
lỗ
lố
lộ
lôc
lốc
lộc
lôgic
lôi
lồi
lỗi
lối
lội
lôm
lồm
lổm
lốm
lộm
lôn
lồn
lổn
lốn
lộn
lông
lồng
lổng
lộng
lốp
lộp
lốt
lột
lơ
lờ
lở
lỡ
lớ
lợ
lơi
lời
lởi
lỡi
lới
lợi
lờm
lởm
lỡm
lợm
lơn
lờn
lởn
lớn
lợn
lơng
lớp
lợp
lớt
lợt
lù
lủ
lũ
lú
lụ
lùa
lũa
lúa
lụa
luán
luân
luẩn
luấn
luận
luật
lúc
lục
lùi
lủi
lũi
lúi
lụi
lùm
lủm
lũm
lúm
lụm
lùn
lủn
lũn
lún
lụn
lùng
lủng
lũng
lúng
lụng
luóm
luốc
luộc
luỗi
luôm
luộm
luôn
luồn
luông
luồng
luỗng
luống
luốt
luột
lúp
lụp
lút
lụt
luyên
luyến
luyện
luyệt
luýnh
lư
lừ
lử
lữ
lự
lưa
lừa
lửa
lữa
lứa
lựa
lưc
lức
lực
lừm
lưng
lừng
lửng
lững
lứng
lựng
lược
lười
lưỡi
lưới
lươm
lườm
lượm
lươn
lườn
lượn
lương
lường
lưỡng
lướng
lượng
lướt
lượt
lứt
lưu
lữu
lựu
lỳ
lỹ
lý
lỵ
mà
mả
mã
má
mạ
mác
mạc
mách
mạch
mài
mải
mãi
mái
mại
màn
mản
mãn
mán
mạn
màng
mảng
mãng
máng
mạng
mành
mảnh
mãnh
mánh
mạnh
mào
mão
máo
mạo
mạp
mát
mạt
matê
matrác
màu
máu
mày
mảy
máy
mạy
mă
mắc
mặc
măk
măm
mắm
măn
mằn
mẳn
mắn
mặn
măng
mắng
mặp
mắt
mặt
mâm
mầm
mẩm
mẫm
mấm
mậm
mân
mần
mẩn
mẫn
mấn
mận
mâng
mầng
mâp
mấp
mập
mất
mật
mâu
mầu
mẩu
mẫu
mấu
mậu
mây
mầy
mẩy
mấy
mè
mẻ
mẽ
mé
mẹ
méc
mèm
mém
mèn
mén
mèng
méng
menú
mèo
mẻo
mẽo
méo
mẹo
mép
mẹp
mét
mẹt
mê
mề
mể
mễ
mế
mệ
mếch
mêga
mềm
mễm
mên
mền
mễn
mến
mênh
mềnh
mệnh
mết
mệt
mêtan
mểu
mếu
mì
mỉ
mĩ
mí
mị
mỉa
mĩa
mía
mích
mịch
miẻo
miên
miền
miễn
miến
miện
miêng
miểng
miếng
miệng
miết
miệt
miêu
miều
miểu
miễu
miếu
mỉm
mĩm
mím
mìn
mịn
míng
mình
mỉnh
mính
mịnh
míp
mít
mịt
mìu
míu
mlài
mlời
mluộm
mnhời
mní
mò
mỏ
mõ
mó
mọ
móc
mọc
mòi
mỏi
mõi
mói
mọi
mòm
mỏm
mõm
móm
mòn
món
mọn
moná
mòng
mỏng
móng
mọng
móp
mọp
mót
mọt
mô
mồ
mổ
mỗ
mố
mộ
môc
mốc
mộc
môi
mồi
mỗi
mối
mội
mộl
môm
mồm
mômen
môn
mồn
mông
mồng
mổng
mỗng
mống
mộng
môt
mốt
một
mơ
mờ
mở
mỡ
mớ
mợ
mơi
mời
mới
mợi
mơm
mờm
mớm
mơn
mởn
mỡn
mớn
mớp
mrơn
mù
mủ
mũ
mú
mụ
mùa
múa
múc
mục
mùi
mủi
mũi
múi
mụi
mủm
mũm
múm
mùn
mủn
mún
mụn
mùng
mủng
muôi
muồi
muỗi
muối
muội
muỗm
muôn
muốn
muộn
muông
muồng
muổng
muỗng
muống
muốt
múp
mụp
muséum
mút
mụt
mư
mự
mưa
mửa
mứa
mựa
mức
mực
mứn
mưng
mừng
mững
mược
mươi
mười
mươn
mướn
mượn
mương
mường
mướp
mướt
mượt
mưỡu
mứt
mưu
mứu
mỳ
mỹ
mỵ
nà
nả
nã
ná
nạ
nác
nạc
nách
nạch
nài
nải
nãi
nái
nại
nàm
nảm
nám
nạm
nàn
nản
nãn
nán
nạn
nàng
nãng
náng
nạng
nành
nánh
nạnh
nanôm
nào
não
náo
nạo
nạp
nát
nạt
náu
này
nảy
nãy
náy
nạy
nắc
nặc
năm
nằm
nẳm
nắm
năn
nằn
nắn
nặn
năng
nằng
nẵng
nắng
nặng
nắp
nấc
nâm
nầm
nẫm
nấm
nậm
nân
nần
nẫn
nấn
nâng
nẫng
nấng
nậng
nấp
nập
nất
nật
nâu
nẫu
nấu
nậu
nây
nầy
nẩy
nẫy
nấy
nậy
nđm
nè
nẻ
né
ném
nén
nẹn
nèo
nẻo
nẽo
néo
nẹo
nép
nẹp
nét
nẹt
nê
nề
nể
nễ
nệ
nêm
nếm
nệm
nên
nền
nến
nện
nếp
nết
nêu
nếu
nếy
ngà
ngả
ngã
ngá
ngạ
ngác
ngạc
ngách
ngạch
ngài
ngải
ngãi
ngái
ngại
ngàm
ngám
ngàn
ngán
ngạn
ngàng
ngãng
ngáng
ngạng
ngành
ngảnh
ngánh
ngạnh
ngào
ngảo
ngão
ngáo
ngạo
ngáp
ngát
ngạt
ngàu
ngáu
ngày
ngáy
ngắc
ngăm
ngằm
ngắm
ngăn
ngằn
ngắn
ngẳng
ngẵng
ngặp
ngắt
ngặt
ngấc
ngâm
ngầm
ngẩm
ngẫm
ngấm
ngậm
ngân
ngần
ngẩn
ngẫn
ngấn
ngận
ngẩng
ngẫng
ngấp
ngập
ngất
ngật
ngâu
ngầu
ngẩu
ngẫu
ngấu
ngậu
ngây
ngầy
ngấy
ngậy
ngèo
ngẹt
ngệch
nghè
nghé
nghẹ
nghèn
nghẽn
nghén
nghẹn
nghèo
nghẻo
nghẽo
nghéo
nghẹo
nghét
nghẹt
nghê
nghề
nghể
nghễ
nghế
nghệ
nghếch
nghệch
nghển
nghễn
nghến
nghện
nghênh
nghểnh
nghễnh
nghệt
nghêu
nghều
nghểu
nghễu
nghệu
nghì
nghỉ
nghĩ
nghí
nghị
nghĩa
nghía
nghích
nghịch
nghiêm
nghiễm
nghiệm
nghiên
nghiền
nghiễn
nghiến
nghiện
nghiêng
nghiênh
nghiệp
nghiệt
nghiêu
nghìm
nghỉm
nghìn
nghỉn
nghỉnh
nghĩnh
nghít
nghịt
nghỉu
nghịu
nghoèo
nghồng
ngích
ngịu
ngò
ngỏ
ngõ
ngó
ngọ
ngoác
ngoạc
ngoách
ngoạch
ngoài
ngoải
ngoái
ngoại
ngoàm
ngoảm
ngoạm
ngoãn
ngoạn
ngoảng
ngoảnh
ngoãnh
ngoáo
ngoáp
ngoạt
ngoảy
ngoáy
ngoạy
ngoắc
ngoặc
ngoằn
ngoẳn
ngoằng
ngoẵng
ngoắng
ngoắt
ngoặt
ngóc
ngọc
ngoẻm
ngoém
ngoẻn
ngoèo
ngoẻo
ngoéo
ngoẹo
ngoét
ngòi
ngõi
ngói
ngòm
ngỏm
ngóm
ngọm
ngòn
ngỏn
ngón
ngọn
ngòng
ngỏng
ngõng
ngóng
ngọng
ngóp
ngót
ngọt
ngô
ngồ
ngổ
ngỗ
ngố
ngộ
ngốc
ngộc
ngôi
ngồi
ngỗi
ngội
ngôm
ngồm
ngổm
ngôn
ngồn
ngổn
ngốn
ngộn
ngông
ngồng
ngổng
ngỗng
ngộp
ngốt
ngột
ngơ
ngờ
ngỡ
ngớ
ngợ
ngơi
ngời
ngỡi
ngợi
ngơm
ngờm
ngỡm
ngợm
ngơn
ngớn
ngớp
ngợp
ngớt
ngù
ngủ
ngũ
ngú
ngụ
ngụa
nguây
nguầy
nguẩy
nguấy
nguậy
ngúc
ngục
nguếch
nguệch
ngùi
ngủi
ngũi
ngủm
ngụm
ngùn
ngủn
ngùng
ngủng
ngúng
nguôi
nguồi
nguội
nguồn
nguơ
ngụp
ngút
ngụt
nguyên
nguyền
nguyễn
nguyện
nguyệt
nguýt
nguỷu
ngư
ngừ
ngữ
ngứ
ngự
ngưa
ngừa
ngửa
ngữa
ngứa
ngựa
ngực
ngửi
ngưng
ngừng
ngửng
ngứng
ngước
ngược
ngươi
người
ngưởi
ngươn
ngường
ngưởng
ngưỡng
ngượng
ngưt
ngứt
ngưu
nhà
nhả
nhã
nhá
nhạ
nhác
nhạc
nhách
nhài
nhải
nhãi
nhái
nhại
nhàm
nhảm
nhám
nhàn
nhản
nhãn
nhạn
nhàng
nhãng
nháng
nhạng
nhành
nhảnh
nhánh
nhạnh
nhào
nhão
nháo
nhạo
nháp
nhạp
nhát
nhạt
nhàu
nhảu
nháu
nhạu
nhày
nhảy
nháy
nhạy
nhắc
nhăm
nhằm
nhắm
nhặm
nhăn
nhằn
nhẳn
nhẵn
nhắn
nhặn
nhăng
nhằng
nhẳng
nhẵng
nhắng
nhặng
nhắp
nhắt
nhặt
nhấc
nhâm
nhầm
nhẩm
nhẫm
nhấm
nhậm
nhân
nhần
nhẩn
nhẫn
nhấn
nhận
nhâng
nhấp
nhập
nhất
nhật
nhâu
nhầu
nhẩu
nhậu
nhây
nhầy
nhẩy
nhẫy
nhấy
nhậy
nhđm
nhè
nhẻ
nhẽ
nhé
nhẹ
nhèm
nhẻm
nhém
nhẹm
nhèn
nhén
nhẹn
nhèo
nhẻo
nhẽo
nhéo
nhẹo
nhép
nhẹp
nhét
nhẹt
nhê
nhể
nhễ
nhếch
nhệch
nhện
nhênh
nhểu
nhếu
nhệu
nhì
nhỉ
nhĩ
nhí
nhị
nhía
nhích
nhiếc
nhiêm
nhiễm
nhiệm
nhiên
nhiễn
nhiếp
nhiệp
nhiêt
nhiết
nhiệt
nhiêu
nhiều
nhiểu
nhiễu
nhiếu
nhím
nhìn
nhĩn
nhín
nhịn
nhỉnh
nhíp
nhịp
nhít
nhịt
nhìu
nhíu
nhịu
nhò
nhỏ
nhõ
nhó
nhọ
nhoài
nhoái
nhoàm
nhoạm
nhoáng
nhoạng
nhoáy
nhoằng
nhóc
nhọc
nhoèn
nhoẻn
nhoét
nhoẹt
nhõi
nhói
nhọi
nhòm
nhỏm
nhõm
nhóm
nhòn
nhỏn
nhõn
nhón
nhọn
nhòng
nhỏng
nhõng
nhóng
nhóp
nhọp
nhót
nhọt
nhô
nhổ
nhỗ
nhố
nhốc
nhôi
nhồi
nhối
nhội
nhôm
nhồm
nhổm
nhộm
nhôn
nhồn
nhổn
nhốn
nhộn
nhông
nhồng
nhộng
nhốt
nhột
nhơ
nhờ
nhở
nhỡ
nhớ
nhợ
nhơi
nhời
nhởi
nhơm
nhởm
nhớm
nhơn
nhờn
nhởn
nhỡn
nhớn
nhợn
nhớp
nhớt
nhợt
nhtư
nhù
nhủ
nhũ
nhú
nhụ
nhúa
nhụa
nhuân
nhuần
nhuận
nhúc
nhục
nhuế
nhuệ
nhùi
nhủi
nhúi
nhụi
nhúm
nhùn
nhủn
nhũn
nhún
nhùng
nhủng
nhũng
nhúng
nhụng
nhuốc
nhuôm
nhuốm
nhuộm
nhuồn
nhút
nhụt
nhuyên
nhuyễn
như
nhừ
nhử
nhữ
nhứ
nhự
nhừa
nhựa
nhức
nhưng
nhửng
những
nhứng
nhựng
nhược
nhương
nhường
nhưỡng
nhướng
nhượng
nhứt
nhựt
nhữu
nhựu
nì
nỉ
ní
nị
nỉa
nĩa
ních
nịch
niêm
niềm
niệm
niên
niền
niển
niễn
niến
niện
niềng
niễng
niếp
niệp
niết
niệt
niêu
niểu
niễu
niếu
niệu
ním
nín
nình
nính
nịnh
níp
nít
nịt
níu
nịu
niutơn
nò
nỏ
nõ
nó
nọ
noản
noãn
nóc
nọc
nòi
nỏi
nói
nọi
nòm
nỏm
nỏn
nõn
nón
nọn
nòng
nóng
nọng
nóp
nót
nọt
nô
nồ
nổ
nỗ
nố
nộ
nôben
nốc
nôi
nồi
nổi
nỗi
nối
nội
nôm
nồm
nộm
nôn
nồn
nộn
nông
nồng
nỗng
nống
nốp
nộp
nốt
nột
nơ
nờ
nở
nỡ
nớ
nợ
nơi
nới
nơm
nờm
nỡm
nớp
nợp
nớt
nơtron
nũ
nú
nụ
nủa
nũa
núa
núc
nục
núcleo
nùi
nũi
núi
nụi
núm
nùn
nùng
nủng
nũng
núng
nuốc
nuộc
nuôi
nuối
nuốm
nuông
nuốt
nuột
núp
nút
nũy
nư
nử
nữ
nứ
nự
nưa
nửa
nữa
nứa
nức
nực
nưng
nừng
nứng
nựng
nước
nược
nườm
nương
nường
nướng
nượp
nướu
nứt
nưu
nữu
nứu
nựu
ò
ỏ
õ
ó
ọ
oác
oạc
oách
oạch
oài
oải
oái
oại
oàm
oạm
oàn
oản
oãn
oán
oạn
oàng
oảng
oãng
oáng
oạng
oành
oảnh
oánh
oạnh
oáo
oáp
oạp
oát
oạt
oảy
oáy
oạy
oắc
oặc
oăm
oằm
oắm
oăn
oằn
oẳn
oắn
oăng
oằng
oẳng
oẵng
oắng
oắt
oặt
óc
ọc
oẻm
oém
oèn
oẻn
oèo
oẻo
oéo
oẹo
oét
oẹt
òi
ỏi
õi
ói
ọi
olá
òm
ỏm
õm
óm
ọm
òn
ỏn
õn
ón
ọn
òng
ỏng
õng
óng
ọng
óp
ọp
ót
ọt
oục
ô
ồ
ổ
ỗ
ố
ộ
ôb
ôben
ôc
ốc
ộc
ôca
ôckinh
ôgam
ôgic
ôhai
ôi
ồi
ổi
ỗi
ối
ội
ôin
ôkinh
ôl
ộl
ôla
ôliu
ôm
ồm
ổm
ỗm
ốm
ộm
ôma
ômet
ômi
ôn
ồn
ổn
ỗn
ốn
ộn
ône
ông
ồng
ổng
ỗng
ống
ộng
ốp
ộp
ôt
ốt
ột
ôtel
ôton
ơ
ờ
ở
ỡ
ớ
ợ
ơc
ờc
ớc
ợc
ơg
ơi
ời
ởi
ỡi
ới
ợi
ờl
ơm
ờm
ởm
ỡm
ớm
ợm
ơme
ơmi
ơn
ờn
ởn
ỡn
ớn
ợn
ơng
ờng
ởng
ỡng
ớng
ợng
ơngen
ớp
ợp
ơr
ơt
ớt
ợt
ơtron
ơu
ờu
ỡu
ớu
ợu
pà
pả
pạ
pác
pạc
pảh
pài
palăng
pán
pàng
panô
pào
páo
páp
pát
pắc
păh
pằn
păng
pấc
pâu
pẻ
péc
pẻng
péo
pê
phà
phả
phá
phạ
phác
phạc
phách
phạch
phài
phải
phái
phàm
phạm
phàn
phản
phãn
phán
phạn
phàng
phảng
phạng
phành
phảnh
phạnh
phào
phảo
pháo
phaolô
pháp
phạp
phát
phạt
phảy
pháy
phắc
phăm
phăn
phắn
phăng
phẳng
phặng
phắp
phặp
phắt
phâm
phầm
phẩm
phân
phần
phẩn
phẫn
phấn
phận
phấp
phập
phất
phật
phầu
phẩu
phẫu
phấu
phây
phẩy
phè
phé
phéc
phẹc
phèn
phèng
phéng
phèo
phép
phét
phẹt
phê
phề
phế
phệ
phếch
phệch
phên
phễn
phện
phềnh
phễnh
phệnh
phết
phệt
phều
phễu
phếu
phì
phỉ
phí
phị
phìa
phía
phịa
phích
phịch
phiêm
phiếm
phiên
phiền
phiến
phiện
phiêng
phiết
phiệt
phiêu
phiểu
phiếu
phiệu
phím
phìn
phình
phỉnh
phĩnh
phính
phịt
phịu
phlạo
phlắc
phò
phó
phóc
phọc
phòi
phón
phòng
phỏng
phóng
phọng
phót
phọt
phô
phồ
phổ
phố
phốc
phộc
phôi
phổi
phối
phôm
phồm
phôn
phồn
phông
phồng
phổng
phỗng
phộng
phốp
phốt
phơ
phờ
phở
phớ
phơi
phời
phới
phơn
phởn
phỡn
phớn
phớt
phrăng
phù
phủ
phũ
phú
phụ
phúc
phục
phủi
phùn
phún
phùng
phủng
phúng
phụng
phúp
phụp
phút
phụt
phư
phứa
phựa
phức
phưng
phừng
phước
phưỡn
phướn
phương
phường
phướng
phượng
phượt
phượu
phứt
phựt
phữu
phựu
phvđ
pí
pianô
pích
pín
píp
pisát
pít
plây
plông
plơi
pó
pótay
pô
pôc
pôn
pông
pốp
pốt
pơ
pờ
pơng
prâng
prô
prông
pù
pú
pụa
púc
puộc
pút
pư
pươi
qì
quà
quả
quã
quá
quạ
quác
quạc
quách
quạch
quài
quải
quái
quại
quàn
quản
quán
quàng
quảng
quãng
quáng
quạng
quành
quảnh
quánh
quạnh
quào
quáo
quát
quạt
quàu
quảu
quáu
quạu
quày
quảy
quáy
quạy
quắc
quặc
quăm
quằm
quẳm
quắm
quặm
quăn
quằn
quẳn
quắn
quặn
quăng
quằng
quẳng
quẵng
quặng
quắp
quặp
quắt
quặt
quấc
quân
quần
quẩn
quẫn
quấn
quận
quâng
quầng
quẩng
quẫng
quất
quật
quây
quầy
quẩy
quẫy
quấy
quậy
què
quẻ
quẽ
qué
quèn
quén
quẹn
quèo
quéo
quẹo
quẹp
quét
quẹt
quê
quế
quệ
quệch
quên
quện
quềnh
quệnh
quết
quệt
quều
quếu
quì
quỉ
quĩ
quí
quị
quình
quít
quịt
quíu
quọ
quoàng
quoạng
quoắt
quốc
quơ
quờ
quở
quớ
quới
quờn
quởn
quởng
quớt
quỳ
quỷ
quỹ
quý
quỵ
quých
quyên
quyền
quyển
quyến
quyện
quyết
quyệt
quỳng
quỳnh
quỷnh
quýnh
quýt
quỵt
rà
rả
rã
rá
rạ
rác
rạc
rách
rạch
rađi
rađio
raglây
rài
rải
rãi
rái
rại
ràm
rám
rạm
ràn
rán
rạn
ràng
rảng
ráng
rạng
rành
rảnh
rãnh
rạnh
ráno
rào
rảo
rão
ráo
rạo
ráp
rạp
rápida
rápido
rát
rạt
ràu
rảu
ráu
rày
rảy
rãy
ráy
rạy
rắc
rặc
răm
rằm
rắm
rặm
răn
rằn
rắn
rặn
răng
rằng
rặng
rắp
rắt
rặt
râm
rầm
rẩm
rẫm
rấm
rậm
rân
rần
rẫn
rấn
rận
râng
rậng
rấp
rập
rất
rật
râu
rầu
rẫu
rậu
rây
rầy
rẩy
rẫy
rcăm
rè
rẻ
rẽ
ré
rẹc
rèm
rèn
rén
rẻng
rèo
rẻo
réo
rẹo
rép
rẹp
rét
rẹt
rê
rề
rể
rễ
rế
rệ
rếch
rệch
rêm
rên
rền
rến
rện
rềnh
rểnh
rếp
rệp
rết
rệt
rêu
rều
rểu
rệu
rì
rỉ
rĩ
rí
rị
rìa
rỉa
rịa
ríc
rích
rịch
riếc
riềm
riêng
riềng
riếp
riết
riệt
riêu
riếu
rím
rĩn
rịn
rình
rỉnh
rĩnh
rịp
rít
rịt
rítra
rìu
ríu
rivê
rlâm
rò
rỏ
rõ
ró
rọ
roàng
róc
rọc
ròi
rỏi
rõi
rói
rọi
ròm
rỏm
róm
rọm
ròn
rỏn
rón
rọn
ròng
rỏng
róng
rọng
rót
rọt
rô
rồ
rổ
rỗ
rố
rộ
rốc
rộc
rồi
rổi
rỗi
rối
rội
rôm
rồm
rộm
rôma
rôn
rổn
rốn
rộn
rông
rồng
rổng
rỗng
rống
rộng
rốp
rộp
rốt
rơ
rờ
rở
rỡ
rớ
rợ
rơi
rời
rợi
rơm
rờm
rởm
rớm
rợm
rơn
rờn
rởn
rỡn
rớn
rợn
rơngen
rớp
rợp
rớt
rợt
rù
rủ
rũ
rú
rùa
rủa
rũa
rụa
rúc
rục
ruê
rùi
rủi
rũi
rúi
rụi
rùm
rúm
rùn
rủn
rún
rùng
rủng
rúng
rụng
ruốc
ruồi
ruổi
ruỗi
ruối
ruộm
ruồng
ruỗng
ruộng
ruột
rúp
rút
rụt
rư
rừ
rứ
rưa
rừa
rửa
rữa
rứa
rựa
rức
rực
rưng
rừng
rửng
rước
rươi
rười
rưởi
rưỡi
rưới
rượi
rươm
rườm
rướm
rườn
rướn
rượn
rương
rường
rượt
rượu
rứt
rựt
rỵn
sà
sả
sã
sá
sạ
sác
sạc
sách
sạch
sài
sải
sãi
sái
sại
saigón
sakê
salát
salâm
sàm
sảm
sám
sạm
sàn
sản
sán
sạn
sàng
sảng
sáng
sành
sảnh
sánh
sào
sảo
são
sáo
sạo
sáp
sạp
sát
sạt
sáu
sảy
sãy
sắc
sặc
săm
sắm
sặm
săn
sằn
sẳn
sẵn
sắn
săng
sằng
sẵng
sắng
sắp
sặp
săt
sắt
sặt
sắu
sâm
sầm
sẩm
sẫm
sấm
sậm
sân
sần
sẩn
sẫn
sấn
sận
sâng
sấp
sập
sất
sật
sâu
sầu
sẩu
sấu
sậu
sây
sầy
sẩy
sấy
sậy
sè
sẻ
sẽ
sé
sẹ
séc
sém
sẹm
sèn
sẻn
sẻng
sèo
sẹo
sét
sẹt
sê
sề
sể
sễ
sế
sệ
sếch
sệch
sên
sền
sến
sênh
sềnh
sểnh
sếp
sệp
sết
sệt
sêu
sếu
sgần
sì
sỉ
sĩ
sí
sị
sỉa
sịa
sích
sịch
sidét
siđa
siêm
siểm
siên
siển
siễn
siêng
siểng
siếp
siệp
siết
siêu
siếu
sìn
sỉn
sín
síne
sình
sỉnh
sính
sịp
sít
sịt
slìn
sò
sỏ
só
sọ
soạc
soài
soải
soái
soại
soàn
soán
soạn
soảng
soạng
soát
soạt
sóc
sọc
sòi
sỏi
sõi
sói
sòm
sóm
sọm
sòn
sỏn
són
sòng
sõng
sóng
sót
sọt
sô
sồ
sổ
sỗ
số
sộ
sôc
sốc
sộc
sôi
sồi
sổi
sồm
sôn
sồn
sông
sồng
sổng
sống
sốp
sộp
sốt
sột
sôvanh
sơ
sờ
sở
sỡ
sớ
sợ
sởi
sỡi
sới
sợi
sơm
sờm
sớm
sơmi
sơn
sờn
sởn
sớn
sớt
srêpốc
sró
sù
sủ
sũ
sú
sụ
sủa
sụa
suân
suất
súc
sục
suê
sùi
sủi
sùm
sụm
sún
sụn
sùng
sủng
sũng
súng
sụng
suôi
suối
suôn
suông
suồng
suống
suốt
súp
sụp
sút
sụt
sủy
súy
suyền
suyển
suyễn
suyến
suýt
suỵt
sư
sừ
sử
sữ
sứ
sự
sưa
sửa
sữa
sứa
sức
sực
sửi
sừn
sưng
sừng
sửng
sững
sựng
sưởi
sườn
sương
sường
sướng
sượng
sướt
sượt
sứt
sựt
sưu
sửu
sứu
sỹ
sý
tà
tả
tã
tá
tạ
tác
tạc
tách
tạch
tài
tải
tãi
tái
tại
tàm
tảm
tám
tạm
tàn
tản
tán
tạn
tàng
tảng
táng
tạng
tành
tảnh
tánh
tạnh
tào
tảo
táo
tạo
táp
tạp
tát
tạt
tàu
táu
tày
tảy
táy
tạy
tắc
tặc
tăk
tăm
tằm
tắm
tăn
tằn
tẳn
tắn
tặn
tăng
tằng
tắng
tặng
tắp
tắt
tấc
tâm
tầm
tẩm
tấm
tân
tần
tẩn
tẫn
tấn
tận
tâng
tầng
tấp
tập
tất
tật
tâu
tầu
tẩu
tấu
tậu
tây
tầy
tẩy
tấy
tbuăn
tè
tẻ
tẽ
té
téc
tẻh
tèm
tẻm
tém
tèn
tẽn
tén
tèo
tẻo
téo
tẹo
tép
tẹp
tét
tẹt
tê
tề
tể
tễ
tế
tệ
tếch
têm
tên
tênh
tềnh
tểnh
tễnh
tệp
têt
tết
tête
têu
tếu
thà
thả
thá
thác
thạc
thách
thạch
thài
thải
thãi
thái
thại
thàm
thảm
thám
thản
thán
thàng
thảng
thãng
tháng
thành
thảnh
thánh
thạnh
thào
thảo
tháo
thạo
tháp
thạp
thát
thạt
tháu
thày
thảy
tháy
thắc
thặc
thăm
thẳm
thắm
thăn
thằn
thắn
thăng
thằng
thẳng
thắng
thặng
thắp
thắt
thâm
thầm
thẩm
thẫm
thấm
thậm
thân
thần
thẩn
thẫn
thấn
thận
thấp
thập
thất
thật
thâu
thầu
thẩu
thấu
thây
thầy
thẩy
thấy
thè
thẻ
thẽ
thé
thèm
thém
thèn
thẻn
thẹn
thèo
thẻo
thẹo
thép
thẹp
thét
thê
thề
thể
thế
thệ
thếch
thêm
thềm
thến
thện
thênh
thểnh
thếp
thết
thêu
thều
thểu
thì
thỉ
thĩ
thí
thị
thìa
thía
thích
thịch
thiếc
thiêm
thiềm
thiểm
thiễm
thiệm
thiên
thiền
thiển
thiến
thiện
thiêng
thiềng
thiếp
thiệp
thiết
thiệt
thiêu
thiều
thiểu
thiễu
thiếu
thiệu
thím
thìn
thín
thình
thỉnh
thính
thịnh
thíp
thít
thíu
thịt
thìu
thỉu
thịu
thò
thỏ
thó
thọ
thoải
thoái
thoại
thoàn
thoản
thoán
thoảng
thoáng
thoát
thoạt
thoăn
thoắng
thoắt
thóc
thọc
thòi
thỏi
thói
thòm
thỏm
thóm
thõn
thòng
thõng
thóp
thót
thọt
thô
thồ
thổ
thố
thộ
thốc
thộc
thôi
thồi
thổi
thối
thồm
thôn
thồn
thổn
thỗn
thốn
thộn
thông
thổng
thống
thốp
thộp
thốt
thột
thơ
thờ
thở
thớ
thợ
thơi
thời
thởi
thới
thơm
thớm
thơn
thờn
thớt
thợt
thtục
thù
thủ
thú
thụ
thùa
thủa
thuân
thuần
thuẩn
thuẫn
thuấn
thuận
thuật
thúc
thục
thuê
thuể
thuế
thùi
thủi
thúi
thụi
thùm
thủm
thùn
thùng
thủng
thũng
thúng
thụng
thuốc
thuộc
thuộm
thuôn
thuồn
thuỗn
thuốn
thuồng
thuổng
thuột
thuở
thụp
thút
thụt
thuyên
thuyền
thuyết
thư
thừ
thử
thữ
thứ
thự
thưa
thừa
thửa
thứa
thữc
thức
thực
thừi
thưng
thừng
thửng
thững
thứng
thước
thược
thưỡi
thườn
thưỡn
thương
thường
thưởng
thướng
thượng
thướt
thượt
thưu
thứu
tì
tỉ
tĩ
tí
tị
tỉa
tía
tích
tịch
tiẻn
tiếc
tiệc
tiêm
tiềm
tiếm
tiệm
tiên
tiền
tiển
tiễn
tiến
tiện
tiêng
tiềng
tiếng
tiếp
tiệp
tiết
tiệt
tiêu
tiều
tiểu
tiễu
tiếu
tiệu
tìm
tỉm
tím
tỉn
tĩn
tín
tịn
tỉng
tình
tỉnh
tĩnh
tính
tịnh
típ
tít
tịt
tĩu
tíu
tịu
tlẻ
tlộm
tnđ
tò
tỏ
tó
tọ
toác
toạc
toài
toái
toại
toàn
toản
toán
toàng
toáng
toạng
toánh
toát
toáy
toắt
tóc
tọc
toèn
toét
toẹt
tòi
tỏi
tõi
tói
tòm
tỏm
tõm
tóm
tòn
tỏn
tòng
tỏng
tọng
tóp
tọp
tót
tọt
tô
tồ
tổ
tố
tộ
tốc
tộc
tôi
tồi
tối
tội
tôm
tôn
tồn
tổn
tỗn
tốn
tông
tồng
tổng
tống
tộng
tốp
tôt
tốt
tột
tơ
tờ
tở
tớ
tợ
tơi
tời
tới
tởm
tơn
tởn
tớn
tợn
tớp
tợp
tớt
trà
trả
trã
trá
trạ
trác
trạc
trách
trạch
trài
trải
trãi
trái
trại
tràm
trảm
trám
trạm
tràn
trản
trán
trạn
tràng
trảng
tráng
trạng
trành
tránh
trạnh
trào
trảo
tráo
trạo
tráp
trát
trạt
tràu
trảu
trày
trảy
trạy
trắc
trặc
trăm
trằm
trắm
trặm
trăn
trằn
trặn
trăng
trắng
trắp
trắt
trâ
trâm
trầm
trẩm
trẫm
trấm
trậm
trân
trần
trẩn
trấn
trận
trâng
trấp
trập
trất
trật
trâu
trầu
trẩu
trấu
trây
trầy
trẩy
trè
trẻ
trẽ
trẹ
trèm
trém
trèn
trẽn
trèo
trẻo
trẽo
tréo
trẹo
trét
trẹt
trê
trề
trể
trễ
trệ
trếch
trệch
trên
trênh
trếnh
trết
trệt
trêu
trều
trếu
trệu
trì
trỉ
trĩ
trí
trị
trìa
trỉa
tría
trịa
trích
trịch
triêm
triền
triển
triến
triện
triêng
triềng
triệng
triếp
triệp
triết
triệt
triêu
triều
triệu
trịng
trình
trĩnh
trính
trịnh
trít
trịt
trìu
trĩu
tríu
trịu
trò
trỏ
trọ
tróc
trọc
tròi
trỏi
trói
trọi
tròm
trõm
tróm
tròn
trõn
trọn
tròng
trỏng
tróng
trọng
trót
trọt
trô
trồ
trổ
trỗ
trố
trộ
trốc
trộc
trôi
trồi
trổi
trỗi
trối
trội
trôm
trộm
trôn
trốn
trộn
trông
trồng
trổng
trống
trộng
trốt
trơ
trờ
trở
trớ
trợ
trơi
trời
trới
trờm
trớm
trợm
trơn
trờn
trớn
trợn
trơng
trớp
trớt
trợt
trù
trủ
trú
trụ
trụa
truân
truất
truật
trúc
trục
trùi
trũi
trụi
trùm
trũm
trúm
trụm
trùn
trụn
trùng
trủng
trũng
trúng
trụng
truồi
truông
truồng
truột
trụp
trút
trụt
truyên
truyền
truyện
trư
trừ
trử
trữ
trứ
trự
trưa
trừa
trữa
trức
trực
trưng
trừng
trửng
trứng
trước
trươi
trườn
trương
trường
trưởng
trưỡng
trướng
trượng
trượt
trừu
trửu
trữu
trứu
tryền
tù
tủ
tú
tụ
tùa
tủa
túa
tuân
tuần
tuẩn
tuẫn
tuấn
tuận
tuất
túc
tục
tuế
tuệ
tuếch
tuệch
tuềnh
tùi
tủi
túi
tụi
tùm
tủm
tũm
túm
tụm
tủn
tùng
tủng
túng
tụng
tuốc
tuộc
tuồi
tuổi
tuồm
tuôn
tuồn
tuông
tuồng
tuốt
tuột
túp
tút
tụt
tuyên
tuyền
tuyển
tuyến
tuyết
tuyệt
tuýp
tuýt
tư
từ
tử
tữ
tứ
tự
tưa
từa
tửa
tứa
tựa
tức
tưng
từng
tửng
tước
tược
tươi
tưởi
tưới
tươm
tườm
tướn
tương
tường
tưởng
tướng
tượng
tướp
tượp
tướt
tượt
tườu
tưu
tửu
tựu
tỳ
tỷ
tý
tỵ
ù
ủ
ũ
ú
ụ
ùa
ủa
ũa
úa
ụa
uác
uạc
uách
uạch
uài
uải
uái
uại
uàn
uản
uán
uàng
uảng
uãng
uáng
uạng
uành
uánh
uạnh
uào
uáo
uát
uạt
uàu
uạu
uày
uảy
uắc
uặc
uằm
uắm
uặm
uăn
uằn
uẳn
uắn
uặn
uăng
uẳng
uặng
uắp
uặp
uắt
uặt
uân
uần
uẩn
uẫn
uấn
uận
uâng
uầng
uẩng
uất
uật
uây
uầy
uẩy
uẫy
uấy
uậy
ubtư
úc
ục
uè
uẻ
uẽ
ué
uèn
uèo
uéo
uẹo
uét
uẹt
uê
uề
uể
uế
uệ
uếch
uệch
uên
uện
uênh
uềnh
uết
uệt
uều
ùi
ủi
ũi
úi
ụi
uít
uịt
úk
ùm
ủm
ũm
úm
ụm
ùn
ủn
ũn
ún
ụn
ùng
ủng
ũng
úng
ụng
uọ
ủo
uốc
uộc
uôi
uồi
uổi
uỗi
uối
uội
uôm
uồm
uỗm
uốm
uộm
uôn
uồn
uỗn
uốn
uộn
uông
uồng
uổng
uỗng
uống
uộng
uốt
uột
uơ
uờ
uở
uớ
uới
uơn
uờn
uởn
uỡn
uờng
uởng
uớt
úp
ụp
út
ụt
uvtư
uých
uỵch
uyên
uyền
uyển
uyễn
uyến
uyện
uyết
uyệt
uỳnh
uýnh
uýt
uỷu
uỵu
ư
ừ
ử
ữ
ứ
ự
ưa
ừa
ửa
ữa
ứa
ựa
ưc
ữc
ức
ực
ưcv
ưd
ừi
ửi
ừm
ưn
ừn
ứn
ưng
ừng
ửng
ững
ứng
ựng
ước
ược
ươi
ười
ưởi
ưỡi
ưới
ượi
ươm
ườm
ướm
ượm
ươn
ườn
ưỡn
ướn
ượn
ương
ường
ưởng
ưỡng
ướng
ượng
ướp
ượp
ướt
ượt
ươu
ườu
ưỡu
ướu
ượu
ưt
ứt
ựt
ưu
ừu
ửu
ữu
ứu
ựu
và
vả
vã
vá
vạ
vác
vạc
vách
vạch
vài
vải
vãi
vái
vại
vàm
vạm
vàn
vãn
ván
vạn
vàng
vảng
vãng
váng
vạng
vành
vảnh
vãnh
vánh
vạnh
vào
váo
vàp
váp
vạp
vát
vạt
vàu
vày
vảy
vãy
váy
vạy
vắc
vặc
văm
vằm
văn
vằn
vắn
vặn
văng
vằng
vẳng
vắng
vặng
vắp
vắt
vặt
vâm
vậm
vân
vần
vẩn
vẫn
vấn
vận
vâng
vầng
vấp
vập
vất
vật
vầu
vẩu
vấu
vây
vầy
vẩy
vẫy
vấy
vậy
vè
vẻ
vẽ
vé
véc
vẹm
vèn
vẻn
vén
vẹn
vèo
vẻo
véo
vẹo
vét
vẹt
vê
về
vế
vệ
vếch
vệch
vên
vền
vện
vênh
vểnh
vết
vệt
vêtu
vêu
vều
vếu
vì
vỉ
vĩ
ví
vị
vỉa
vía
vích
viêc
việc
viêm
viên
viền
viển
viễn
viện
viêng
viếng
việp
viêt
viết
việt
vịm
vín
vịn
vĩnh
vính
vịnh
viọng
vít
vịt
víu
vò
vỏ
võ
vó
vọ
vóc
vọc
vòi
vỏi
vói
vọi
vòm
vòn
vỏn
vón
vòng
vỏng
võng
vóng
vọng
vọp
vót
vọt
vô
vồ
vổ
vỗ
vố
vốc
vôi
vồi
vối
vội
vôn
vồn
vốn
vông
vồng
vổng
vống
vốt
vơ
vờ
vở
vỡ
vớ
vợ
vơi
vời
với
vợi
vờn
vởn
vớt
vợt
vù
vũ
vú
vụ
vùa
vúc
vục
vùi
vũm
vùn
vụn
vùng
vũng
vụng
vuối
vuông
vuốt
vuột
vút
vụt
vư
vừa
vữa
vựa
vức
vực
vưng
vừng
vửng
vững
vựng
vược
vươn
vườn
vượn
vương
vưởng
vướng
vượng
vượt
vứt
vưu
vỹ
vý
xà
xả
xã
xá
xạ
xác
xạc
xách
xạch
xài
xải
xái
xàm
xảm
xám
xạm
xán
xàng
xáng
xành
xảnh
xào
xảo
xáo
xạo
xáp
xạp
xát
xàu
xảu
xạu
xảy
xáy
xắc
xăm
xắm
xăn
xắn
xăng
xằng
xẳng
xẵng
xắng
xắp
xắt
xấ
xấc
xâm
xầm
xẩm
xân
xẩn
xấn
xấp
xập
xâu
xầu
xẩu
xấu
xây
xầy
xẩy
xcô
xè
xẻ
xé
xẹ
xéc
xẹc
xém
xèn
xẻn
xén
xèng
xẻng
xèo
xẻo
xẽo
xéo
xẹo
xép
xẹp
xét
xẹt
xê
xề
xể
xễ
xế
xệ
xếch
xệch
xềm
xên
xển
xênh
xềnh
xểnh
xếp
xệp
xệt
xêu
xều
xệu
xì
xỉ
xí
xị
xỉa
xía
xịa
xích
xịch
xiếc
xiệc
xiêm
xiểm
xiên
xiển
xiễn
xiềng
xiểng
xiếp
xiệp
xiết
xiêu
xiều
xiểu
xiếu
ximăng
xỉn
xín
xịn
xinê
xíng
xình
xỉnh
xĩnh
xính
xíp
xít
xịt
xìu
xỉu
xíu
xịu
xò
xỏ
xó
xọ
xoác
xoạc
xoạch
xoài
xoải
xoàm
xoàn
xoán
xoàng
xoảng
xoạng
xoành
xoát
xoạt
xoáy
xoăn
xoẳn
xoắn
xoắt
xóc
xọc
xoèn
xoẻng
xoét
xoẹt
xòi
xói
xòm
xõm
xóm
xón
xòng
xỏng
xõng
xóng
xóp
xọp
xót
xô
xồ
xổ
xố
xộ
xốc
xộc
xôi
xồi
xổi
xối
xôm
xồm
xổm
xôn
xồn
xổn
xốn
xộn
xông
xồng
xổng
xống
xốp
xộp
xốt
xơ
xờ
xở
xỡ
xớ
xơi
xời
xởi
xới
xơm
xờm
xớm
xơn
xởn
xớn
xớp
xợp
xớt
xợt
xrê
xrêpôc
xtiêng
xtơ
xtrây
xù
xủ
xũ
xú
xụ
xùa
xúa
xuân
xuẩn
xuất
xuây
xúc
xục
xuê
xuề
xuể
xuế
xuệch
xuềnh
xùi
xủi
xúi
xụi
xùm
xúm
xùng
xủng
xúng
xuôi
xuông
xuồng
xuổng
xuống
xúp
xụp
xút
xụt
xuyên
xuyền
xuyển
xuyễn
xuyến
xuyết
xuýt
xuỵt
xư
xừ
xử
xứ
xự
xưa
xửa
xứa
xức
xực
xưng
xừng
xửng
xứng
xước
xược
xười
xương
xường
xưởng
xướng
xýt
ỳ
ỷ
ỹ
ý
ỵ
ỵa
yàm
yán
ých
ỵch
yếc
yêm
yểm
yếm
yên
yển
yến
yêng
yểng
yếng
yếp
yết
yêu
yều
yểu
yếu
yì
ýn
ỵn
ỳnh
ỷnh
ýnh
yò
yó
ýp
ýt
ỵt
yú
ỷu
ỵu
yùm
zà
zabân
zài
zắc
zăg
zăng
zép
zéro
zê
zỏm
zô

================================================
FILE: dict/vietnamese.new.dict
================================================
choá
choè
choẻ
choé
choẹ
chuỳ
chuỷ
chuý
doá
doạ
đoá
đoạ
goá
hoà
hoả
hoã
hoá
hoạ
hoè
hoé
hoẹ
huỷ
huý
khoà
khoả
khoã
khoá
khoẻ
khoé
khuỷ
loà
loả
loã
loá
loè
loé
luỹ
luý
luỵ
ngoà
ngoả
ngoã
ngoá
ngoạ
ngoè
ngoẻ
ngoẽ
ngoé
ngoẹ
nguỳ
nguỵ
nhoà
nhoá
nhoè
nhoé
nhuỵ
noạ
nuỵ
oà
oả
oã
oá
oạ
oè
oẻ
oẽ
oé
oẹ
roá
soà
soả
soã
soá
soạ
suý
thoà
thoả
thoã
thoá
thuỳ
thuỷ
thuý
thuỵ
toà
toả
toạ
toè
toẻ
toẽ
toé
truỳ
truỷ
truý
truỵ
tuỳ
tuỷ
tuý
tuỵ
uỳ
uỷ
uỹ
uý
uỵ
xoà
xoả
xoã
xoá
xoạ
xoè
xoẹ
xuỳ
xuý

================================================
FILE: dict/vietnamese.sp.dict
================================================
amiđan
anđt
atnđ
axít
bcđ
bcđpctntư
bcđqg
bcđt
bcđts
bchtư
bđ
bđn
bđs
bđvn
bêrê
bgdđt
bhalêê
bhđc
bioóc
boóng
bôxit
bvđk
café
cđ
cđsp
cđv
choòng
chơro
cnqsdđ
coóc
cqđt
cscđ
csđn
csđt
csđtlx
csđttp
csđttpmt
ctđ
ctđl
dagtđt
dđ
đatp
đb
đba
đbdt
đbđ
đbđvn
đbkvn
đbp
đbqh
đbscl
đbtn
đbtsxb
đc
đcd
đcdgs
đcdgscs
đcdgsn
đcdgsnn
đcl
đclgd
đcs
đcstq
đcsvn
đct
đgn
đh
đhbc
đhbk
đhbkhcm
đhbkhn
đhbktphcm
đhcđ
đhclc
đhcn
đhct
đhgtvt
đhhb
đhhvn
đhkh
đhkhtn
đhkhtnhn
đhkhxh
đhkt
đhktcn
đhktqd
đhn
đhnt
đhqg
đhqghn
đhsp
đk
đkđt
đkhk
đkkd
đkkh
đkt
đkvđ
đkvn
đkxt
đkz
đl
đlđ
đltp
đm
đmn
đn
đna
đná
đnd
đndtp
đnđ
đnn
đnt
đrl
đsq
đta
đtd
đtdđ
đtđ
đthvn
đtlt
đtnn
đtqg
đttx
đttxqm
đtv
đtvhd
đtvn
đtxdcb
đvht
đvtn
đvttn
đvưt
êđê
êrê
gcnđkkd
gcnqsdđ
gcnqsdđơ
gcnqshnơ
gdđh
gdđt
gđ
gđt
gđtla
gđtt
giêsu
giêxu
goòng
gplhđb
hcđ
hđ
hđba
hđcd
hđcdgs
hđcdgscs
hđcdgsn
hđcdgsnn
hđct
hđh
hđkt
hđlđ
hđnd
hđndtp
hđnt
hđqt
hđrung
hđt
hđtđ
hđts
hđtt
hđxx
hlbđ
hmnđ
hngđ
hoóc
hqđt
hsđkdt
htcđ
kađai
kdđv
kdhđc
kđcl
kđclgd
kđrao
kđs
kđt
kđtm
kđtntl
khđt
kilôoát
klđt
lđ
lđbđ
lđbđvn
lđlđ
lđtb
lđtbxh
lllđ
loỏng
ltqđtd
mđhur
moóc
môtô
mtđt
nđ
nđt
nđvn
nhđa
nhđá
nhđt
nhđtpt
nlđ
nmđ
nơron
nsưt
nxbqđnd
óoc
oọc
oòng
oọng
oốc
orăng
ốk
ôkô
ôông
ôr
ôtô
ôtôca
ôxi
ôxit
ôxy
pclbtư
pgđ
poóc
poọng
pốk
pôkô
pôồn
pôông
prôton
qđ
qđnd
qlđt
qsdđ
rđê
sdđnn
sđh
sđk
sđnđ
sđt
sđtla
skhđt
smđh
soóc
svđ
svđv
tđ
tđbkvn
tđc
tgđ
thcsnđ
thktsmđ
thoòng
tmđt
tnđh
tnđt
toòng
tơrao
tpcđ
troóc
troốc
tsdđ
ttbđs
ttđb
ttđm
tthtcđ
vđ
vđqg
vđv
vđvqg
vhgdttnnđ
voọc
xđgn
xklđ
ytcđ
ytế
zêrô

================================================
FILE: dict/vietnamese.std.dict
================================================
chóa
chòe
chỏe
chóe
chọe
chùy
chủy
chúy
dóa
dọa
đóa
đọa
góa
hòa
hỏa
hõa
hóa
họa
hòe
hóe
họe
hủy
húy
khòa
khỏa
khõa
khóa
khỏe
khóe
khủy
lòa
lỏa
lõa
lóa
lòe
lóe
lũy
lúy
lụy
ngòa
ngỏa
ngõa
ngóa
ngọa
ngòe
ngỏe
ngõe
ngóe
ngọe
ngùy
ngụy
nhòa
nhóa
nhòe
nhóe
nhụy
nọa
nụy
òa
ỏa
õa
óa
ọa
òe
ỏe
õe
óe
ọe
róa
sòa
sỏa
sõa
sóa
sọa
súy
thòa
thỏa
thõa
thóa
thùy
thủy
thúy
thụy
tòa
tỏa
tọa
tòe
tỏe
tõe
tóe
trùy
trủy
trúy
trụy
tùy
tủy
túy
tụy
ùy
ủy
ũy
úy
ụy
xòa
xỏa
xõa
xóa
xọa
xòe
xọe
xùy
xúy

================================================
FILE: except.tmpl.txt
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#
# -----------------------------------------------------------------------------

# Đây là file chứa danh sách các ứng dụng loại trừ của bộ gõ Teni.
# Khi chế độ "Loại trừ ứng dụng" được bật, bộ gõ Teni sẽ 
# không xử lý khi gõ trên các ứng dụng được liệt kê bên dưới.
# (các dòng trống hoặc bắt đầu bằng dấu # sẽ được bỏ qua)
#
# Các ứng dụng được xác định bằng WM_CLASS, để lấy WM_CLASS chạy command:
# bash ${WM.BASH}
#
# Điền WM_CLASS vào file này, mỗi WM_CLASS ghi trên một dòng,
# hãy copy hoặc gõ chính xác chữ hoa và chữ thường.
# Nếu một ứng dụng có nhiều WM_CLASS thì chỉ cần điền 1 WM_CLASS
#
# Bên dưới là một số WM_CLASS được liệt kê sẵn, bỏ dấu # đầu dòng để có hiệu lực


## Developments -----------------------
#Atom
#Code
#Eclipse
#sublime_text
#jetbrains-idea
#jetbrains-studio
#jetbrains-pycharm-ce
#jetbrains-pycharm-edu
#jetbrains-rubymine
#jetbrains-phpstorm
#jetbrains-webstorm


## Consoles ---------------------------
#console
#konsole
#XTerm
#Gnome-terminal



================================================
FILE: ibus-teni.dsc
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#
Format: 1.0
Source: ibus-teni
Binary: ibus-teni
Architecture: any
Version: 1.5.3-0
Maintainer: Nguyen Cong Hoang <hoangnc.jp@gmail.com>
Homepage: https://github.com/teni-ime/ibus-teni
Build-Depends: debhelper, golang, libx11-dev
Files:
 0 0 ibus-teni-1.5.3.tar.gz


================================================
FILE: ibus-teni.spec
================================================
#
# Teni-IME - A Vietnamese Input method editor
# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
# This file is part of Teni-IME.
#
# Teni-IME is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Teni-IME is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
#

#release info -----------------------------------------------------------------


%define engine_name  teni
%define package_name ibus-%{engine_name}
%define version      1.5.3


#install directories ----------------------------------------------------------
%define engine_dir   /usr/share/%{package_name}
%define ibus_dir     /usr/share/ibus
%define ibus_cpn_dir /usr/share/ibus/component
%define usr_lib_dir  /usr/lib


#package info -----------------------------------------------------------------
Name:           ibus-%{engine_name}
Version:        %{version}
Release:        1
Summary:        A Vietnamese IME for IBus
License:        GPL-3.0
Group:          System/Localization
URL:            https://github.com/teni-ime/ibus-teni
Packager:       Nguyen Cong Hoang <hoangnc.jp@gmail.com>
BuildRequires:  go, libX11-devel
Requires:       ibus
Provides:       locale(ibus:vi)
Source0:        %{package_name}-%{version}.tar.gz

%description
A Vietnamese IME for IBus using Teni-IME
Bộ gõ tiếng Việt cho IBus sử dụng Teni-IME

%global debug_package %{nil}
%prep
%setup


%build
make build


%install
make DESTDIR=%{buildroot} install


%files
%defattr(-,root,root)
%doc README.md LICENSE MAINTAINERS
%dir %{ibus_dir}
%dir %{ibus_cpn_dir}
%dir %{engine_dir}
%{engine_dir}/*
%{ibus_dir}/component/%{engine_name}.xml
%{usr_lib_dir}/ibus-engine-%{engine_name}


%clean
cd ..
rm -rf %{package_name}-%{version}
rm -rf %{buildroot}


%changelog
* Sat Nov 24 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.5.3
- Build cho Ubuntu 20.04
* Sat Nov 24 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.5.2
- Sửa kiểu gõ tự do không kiểm tra chính tả
* Fri Nov 23 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.5.1
- Sửa kiểu gõ tự do không kiểm tra chính tả
* Sun Nov 4 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.5.0
- Thêm kiểu gõ [Telex] (kiểu gõ này cho phép dùng phím [])
- Sửa lỗi không xóa hết chữ trên Telegram
- Sửa lỗi con trỏ chuột nhảy về đầu dòng trên Facebook chat
* Mon Oct 22 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.4.2
- Sửa lỗi mất chữ khi đang gõ
- Sửa lỗi con trỏ chuột nhảy về đầu dòng trên Facebook chat
* Sun Oct 21 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.4.1
- Cập nhật từ điển
- Sửa lỗi mất chữ khi đang gõ
* Sun Oct 7 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.4.0
- Thêm lựa chọn "Giữ nhiều chữ", cho phép sửa dấu những chữ đã gõ xong
- Thêm lựa chọn "Đúng chính tả", cho phép bỏ qua kiểm tra chính tả
* Sun Sep 23 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.3.3
- Tối ưu chức năng "Loại trừ ứng dụng"
- Sửa lỗi không gõ được sau khi click chuột đi chỗ khác
- Thêm xử lý xóa pre-edit khi click chuột
* Sat Sep 15 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.3.2
- Tối ưu chức năng "Loại trừ ứng dụng"
- Sửa lỗi không gõ được trên FreeOffice và Wine
* Sun Sep 9 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.3.1
- Sửa lỗi chức năng "Loại trừ ứng dụng"
* Tue Sep 4 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.3.0
- Thêm chức năng "Loại trừ ứng dụng"
- Cập nhật từ điển (bổ sung ~700 từ)
* Sun Aug 26 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.2.2
- Thay đổi xử lý commit: forward tất cả các phím khi commit
- Sửa lỗi khôi phục phím khi nhấn phím dấu 2 lần
* Tue Aug 21 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.2.1
- Sửa lỗi khôi phục phím w, [, ] trên kiểu gõ Telex
- Bổ sung danh sách từ tiếng Việt: xịn
* Fri Aug 17 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.2.0
- Thêm kiểu gõ Telex (cho phép gõ nhanh bằng w, [,])
- Sửa lỗi mất gợi ý khi gõ trên thanh địa chỉ của Chrome
* Thu Aug 9 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.1.0
- Thêm xử lý nhanh chóng khôi phục phím khi gõ từ không có trong tiếng Việt
- Sửa lỗi mất space khi gõ trên Dropbox Paper
* Sun Jul 29 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 1.0.0
- Phiên bản hoàn thiện chính thức: ibus-teni v1.0.0
* Fri Jun 22 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com> - 0.1
- Phiên bản chính thức đầu tiên: ibus-teni v0.1

================================================
FILE: src/dict-gen/Gopkg.toml
================================================
# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#   name = "github.com/x/y"
#   version = "2.4.0"
#
# [prune]
#   non-go = false
#   go-tests = true
#   unused-packages = true


[[constraint]]
  name = "golang.org/x/text"
  version = "0.3.0"

[prune]
  go-tests = true
  unused-packages = true


================================================
FILE: src/dict-gen/dump.go
================================================
package main

import (
	"html"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"regexp"
	"strings"
)

const (
	topPage            = "https://vi.wiktionary.org"
	firstPage          = "https://vi.wiktionary.org/wiki/Thể_loại:Mục_từ_tiếng_Việt"
	contentFromPattern = `[\(>]Trang sau[\)<]`
	nextPagePattern    = `<a href="([^"]+)" title="Thể loại:Mục từ tiếng Việt">Trang sau</a>`
	pageTitlePattern   = `<li><a href="/wiki/[^"]+" title="[^"]+">([^>]+)</a></li>`
	outputFile         = "dict/vi.wiktionary.org.txt"

	vietChars = `
 áàảãạ
ăắằẳẵặ
âấầẩẫậ
 éèẻẽẹ
êếềểễệ
 íìỉĩị
 óòỏõọ
ôốồổỗộ
ơờớởỡợ
 úùủũụ
ưứừửữự
 ýỳỷỹỵ
đ
`
)

var (
	nextPageRegex      = regexp.MustCompile(nextPagePattern)
	nextPageTitleRegex = regexp.MustCompile(pageTitlePattern)
	contentStartRegex  = regexp.MustCompile(contentFromPattern)
)

func GetHttpText(address string) string {
	uAddr, _ := url.PathUnescape(address)
	log.Println("Get " + uAddr)
	if resp, err := http.Get(address); err != nil {
		log.Println(err)
	} else {
		defer resp.Body.Close()
		if b, err := ioutil.ReadAll(resp.Body); err != nil {
			log.Println(err)
		} else {
			return string(b)
		}
	}

	return ""
}

func isVietnamese(s string) bool {
	for _, r := range []rune(s) {
		if (r >= 'a' && r <= 'z') ||
			(r >= 'A' && r <= 'Z') ||
			(r >= '0' && r <= '9') ||
			(r == ' ' || r == '.' || r == ',' || r == ';' || r == '&') ||
			strings.IndexRune(vietChars, r) >= 0 {
			continue
		} else {
			return false
		}
	}

	return true
}

func dumpWiktionary() string {
	mapWord := map[string]bool{}

	s := GetHttpText(firstPage)
	for len(s) > 0 {
		s = html.UnescapeString(s)
		startIndex := contentStartRegex.FindStringIndex(s)
		if len(startIndex) > 0 {
			content := s[startIndex[0]:]
			matches := nextPageTitleRegex.FindAllStringSubmatch(content, -1)
			for _, m := range matches {
				w := m[1]
				if isVietnamese(w) {
					mapWord[w] = true
				}
			}

		}

		nextALink := nextPageRegex.FindAllStringSubmatch(s, 1)
		if len(nextALink) > 0 && len(nextALink[0]) >= 1 {
			nextUrl := nextALink[0][1]
			s = GetHttpText(topPage + nextUrl)
		} else {
			break
		}
	}

	var wordList []string
	for k := range mapWord {
		wordList = append(wordList, k)
	}

	return strings.Join(wordList, "\n")
}


================================================
FILE: src/dict-gen/extract.go
================================================
package main

import (
	"fmt"
	"log"
	"regexp"
	"strings"
)

const vietBaseMarks = `
 áàảãạ
ăắằẳẵặ
âấầẩẫậ
 éèẻẽẹ
êếềểễệ
 íìỉĩị
 óòỏõọ
ôốồổỗộ
ơờớởỡợ
 úùủũụ
ưứừửữự
 ýỳỷỹỵ
đ
`

var (
	vietWordRegex          *regexp.Regexp
	vietWordToneStartRegex *regexp.Regexp
	rootToneStartRegex     *regexp.Regexp
)

func init() {
	vbm := strings.Replace(vietBaseMarks, " ", "", -1)
	vbm = strings.Replace(vbm, "\n", "", -1)
	VBM := strings.ToUpper(vbm)

	vietWordPattern := fmt.Sprintf(`[a-zA-Z]*[%[1]s%[2]s][a-zA-Z]*`, vbm, VBM)
	vietWordToneStartPattern := fmt.Sprintf(`[%[1]s%[2]s][a-zA-Z]*`, vbm, VBM)
	rootToneStartPattern := fmt.Sprintf(`[eyuioaEYUIOA]+[%[1]s%[2]s][a-zA-Z]*`, vbm, VBM)

	var err error
	vietWordRegex, err = regexp.Compile(vietWordPattern)
	if err != nil {
		log.Fatal(err)
	}

	vietWordToneStartRegex, err = regexp.Compile(vietWordToneStartPattern)
	if err != nil {
		log.Fatal(err)
	}

	rootToneStartRegex, err = regexp.Compile(rootToneStartPattern)
	if err != nil {
		log.Fatal(err)
	}
}

func extractVietWord(s string, toMap map[string]bool) {
	words := vietWordRegex.FindAllString(s, -1)
	words = append(words, vietWordToneStartRegex.FindAllString(s, -1)...)
	words = append(words, rootToneStartRegex.FindAllString(s, -1)...)

	for _, w := range words {
		if len(w) > 7 {
			continue
		}
		wlower := strings.ToLower(w)
		toMap[wlower] = true
	}
}


================================================
FILE: src/dict-gen/main.go
================================================
package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"strings"
)

var (
	mapStdToneWord    = loadWordMap("dict/vietnamese.std.dict")
	mapNewToneWord    = loadWordMap("dict/vietnamese.new.dict")
	mapSpecialWord    = loadWordMap("dict/vietnamese.sp.dict")
	mapCommonWord     = loadWordMap("dict/vietnamese.cm.dict")
	newCommonWordFile = "dict/vietnamese.cm.dict"
)

func loadWordMap(wordListFile string) map[string]bool {
	f, err := os.Open(wordListFile)
	if err != nil {
		log.Fatalln(err)
	}
	defer f.Close()
	rd := bufio.NewReader(f)
	m := map[string]bool{}
	for {
		line, _, err := rd.ReadLine()
		if err == io.EOF {
			break
		} else if err != nil {
			log.Fatalln(err)
		}
		if len(line) == 0 {
			continue
		}
		m[string(line)] = true
	}

	return m
}

func main() {
	fmt.Println("BEGIN")
	log.Println(len(mapCommonWord))
	log.Println(len(mapStdToneWord))
	log.Println(len(mapNewToneWord))

	allWords := dumpWiktionary()

	m := map[string]bool{}
	extractVietWord(allWords, m)

	countNewWord := 0
	for k := range m {
		if _, ok := mapStdToneWord[k]; ok {
			continue
		} else if _, ok := mapNewToneWord[k]; ok {
			continue
		} else if _, ok := mapSpecialWord[k]; ok {
			continue
		} else if _, ok := mapCommonWord[k]; ok {
			continue
		} else {
			mapCommonWord[k] = true
			countNewWord++
		}
	}

	log.Println("countNewWord:", countNewWord)
	var words []string
	for k := range mapCommonWord {
		if len(k) > 0 {
			words = append(words, k)
		}
	}

	vnsort(words)
	ioutil.WriteFile(newCommonWordFile, []byte(strings.Join(words, "\n")), 0777)

	fmt.Println("DONE")
}


================================================
FILE: src/dict-gen/vnsort.go
================================================
package main

import (
	"golang.org/x/text/collate"
	"golang.org/x/text/language"
)

func vnsort(a []string) {
	vnm := collate.New(language.Vietnamese)
	vnm.SortStrings(a)
}


================================================
FILE: src/ibus-teni/cache-wm.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"sync"
)

type CacheWM struct {
	sync.Mutex
	values   map[uint32][]string
	keyList  []uint32
	maxItems int
}

func NewCacheWM(maxItems int) *CacheWM {
	return &CacheWM{
		values:   map[uint32][]string{},
		maxItems: maxItems,
	}
}

func (c *CacheWM) Get(window uint32) ([]string, bool) {
	c.Lock()
	defer c.Unlock()
	v, ok := c.values[window]
	if ok {
		lenKeyList := len(c.keyList)
		for i := lenKeyList - 1; i >= 0; i-- {
			if c.keyList[i] == window {
				for j := i + 1; j < lenKeyList; j++ {
					c.keyList[j-1] = c.keyList[j]
				}
				c.keyList[lenKeyList-1] = window
				break
			}
		}
	}

	return v, ok
}

func (c *CacheWM) Set(window uint32, wm []string) {
	c.Lock()
	defer c.Unlock()
	c.values[window] = wm
	if len(c.keyList) < c.maxItems {
		c.keyList = append(c.keyList, window)
	} else {
		delete(c.values, c.keyList[0])
		c.keyList = append(c.keyList[1:], window)
	}
}


================================================
FILE: src/ibus-teni/config.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"os/exec"
	"os/user"
	"path/filepath"
	"strings"
	"teni"
)

const (
	configFile           = "%s/.config/ibus/ibus-%s.config.json"
	exceptListFile       = "%s/.config/ibus/ibus-%s.except.txt"
	sampleExceptListFile = "except.tmpl.txt"

	varWmBash  = "${WM.BASH}"
	wmBashFile = "wm.bash"
)

type ToneType uint8

const (
	ConfigToneStd ToneType = iota << 0
	ConfigToneNew ToneType = iota
)

type Config struct {
	InputMethod      teni.InputMethod
	ToneType         ToneType
	EnableExcept     uint32
	EnableLongText   uint32
	EnableForceSpell uint32
}

func LoadConfig(engineName string) *Config {
	c := Config{
		InputMethod:      teni.IMTeni,
		ToneType:         ConfigToneStd,
		EnableExcept:     0,
		EnableLongText:   0,
		EnableForceSpell: 1,
	}

	u, err := user.Current()
	if err == nil {
		data, err := ioutil.ReadFile(fmt.Sprintf(configFile, u.HomeDir, engineName))
		if err == nil {
			json.Unmarshal(data, &c)
		}
	}

	return &c
}

func SaveConfig(c *Config, engineName string) {
	u, err := user.Current()
	if err != nil {
		return
	}

	data, err := json.Marshal(c)
	if err != nil {
		return
	}

	err = ioutil.WriteFile(fmt.Sprintf(configFile, u.HomeDir, engineName), data, 0644)
	if err != nil {
		log.Println(err)
	}

}

func getExceptListFile(engineName string) string {
	u, err := user.Current()
	if err != nil {
		return fmt.Sprintf(exceptListFile, "~", engineName)
	}

	return fmt.Sprintf(exceptListFile, u.HomeDir, engineName)
}

func getEngineSubFile(fileName string) string {
	if _, err := os.Stat(fileName); err == nil {
		if absPath, err := filepath.Abs(fileName); err == nil {
			return absPath
		}
	}

	return filepath.Join(filepath.Dir(os.Args[0]), fileName)
}

func OpenExceptListFile(engineName string) {
	efPath := getExceptListFile(engineName)
	if _, err := os.Stat(efPath); os.IsNotExist(err) {
		sampleFile := getEngineSubFile(sampleExceptListFile)
		sample, _ := ioutil.ReadFile(sampleFile)
		if len(sample) > 0 {
			wmBashPath := getEngineSubFile(wmBashFile)
			strSample := strings.Replace(string(sample), varWmBash, wmBashPath, 1)
			sample = []byte(strSample)
		}
		ioutil.WriteFile(efPath, sample, 0644)
	}

	exec.Command("xdg-open", efPath).Start()
}


================================================
FILE: src/ibus-teni/debug.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"github.com/sarim/goibus/ibus"
	"os"
	"path/filepath"
)

const (
	DebugComponentName = ComponentName + "Debug"
	DebugEngineName    = EngineName + "-debug"
	IconFile           = "icon.png"
)

func makeDebugComponent() *ibus.Component {

	component := &ibus.Component{
		Name:          "IBusComponent",
		ComponentName: DebugComponentName,
	}

	engine := &ibus.EngineDesc{
		Name:       "IBusEngineDesc",
		EngineName: DebugEngineName,
		Icon:       filepath.Join(filepath.Dir(os.Args[0]), IconFile),
	}

	component.AddEngine(engine)

	return component
}


================================================
FILE: src/ibus-teni/engine.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"fmt"
	"github.com/godbus/dbus"
	"github.com/sarim/goibus/ibus"
	"os/exec"
	"runtime/debug"
	"sync"
	"teni"
	"time"
)

type IBusTeniEngine struct {
	sync.Mutex
	ibus.Engine
	preediter      *teni.Engine
	excepted       bool
	zeroLocation   bool
	capSurrounding bool
	engineName     string
	config         *Config
	propList       *ibus.PropList
	exceptMap      *ExceptMap
	display        CDisplay
	prevText       []rune
	ignoreNextUp   bool
}

var (
	DictStdList = []string{DictVietnameseCm, DictVietnameseSp, DictVietnameseStd}
	DictNewList = []string{DictVietnameseCm, DictVietnameseSp, DictVietnameseNew}

	printableKeyCode = map[uint32]bool{
		0x0039: true,
		0x0002: true,
		0x0003: true,
		0x0004: true,
		0x0005: true,
		0x0006: true,
		0x0007: true,
		0x0008: true,
		0x0009: true,
		0x000a: true,
		0x000b: true,
		0x000c: true,
		0x000d: true,
		0x007c: true,
		0x001a: true,
		0x001b: true,
		0x0027: true,
		0x0028: true,
		0x002b: true,
		0x0033: true,
		0x0034: true,
		0x0035: true,
		0x0059: true,
	}
)

func IBusTeniEngineCreator(conn *dbus.Conn, engineName string) dbus.ObjectPath {

	objectPath := dbus.ObjectPath(fmt.Sprintf("/org/freedesktop/IBus/Engine/Teni/%d", time.Now().UnixNano()))

	var config = LoadConfig(engineName)
	if config.ToneType == ConfigToneStd {
		teni.InitWordTrie(config.EnableForceSpell == ibus.PROP_STATE_CHECKED, DictStdList...)
	} else {
		teni.InitWordTrie(config.EnableForceSpell == ibus.PROP_STATE_CHECKED, DictNewList...)
	}

	engine := &IBusTeniEngine{
		Engine:     ibus.BaseEngine(conn, objectPath),
		preediter:  teni.NewEngine(),
		engineName: engineName,
		config:     config,
		propList:   GetPropListByConfig(config),
		exceptMap:  &ExceptMap{engineName: engineName},
	}
	engine.preediter.InputMethod = config.InputMethod
	engine.preediter.ForceSpell = config.EnableForceSpell == ibus.PROP_STATE_CHECKED
	if config.EnableExcept == ibus.PROP_STATE_CHECKED {
		engine.exceptMap.Enable()
	}
	ibus.PublishEngine(conn, objectPath, engine)

	onMouseClick = func() {
		engine.Lock()
		defer engine.Unlock()
		if engine.preediter.RawKeyLen() > 0 {
			engine.HidePreeditText()
			engine.preediter.Reset()
			engine.prevText = engine.prevText[:0]
		}
	}

	return objectPath
}

func (e *IBusTeniEngine) updatePreedit() {
	preeditText := string(e.prevText)
	preeditLen := uint32(len(e.prevText))
	preeditText += e.preediter.GetResultStr()
	preeditLen += e.preediter.ResultLen()

	e.UpdatePreeditTextWithMode(ibus.NewText(preeditText), preeditLen, true, ibus.IBUS_ENGINE_PREEDIT_COMMIT)

	if preeditLen == 0 {
		e.preediter.Reset()
	}
}

func (e *IBusTeniEngine) commitPreedit(lastKey uint32) {
	var commitStr = string(e.prevText)
	if lastKey == IBUS_Escape {
		commitStr += e.preediter.GetRawStr()
	} else if e.config.EnableForceSpell == ibus.PROP_STATE_CHECKED {
		commitStr += e.preediter.GetCommitResultStr()
	} else {
		commitStr += e.preediter.GetResultStr()
	}
	e.preediter.Reset()
	e.prevText = e.prevText[:0]

	e.HidePreeditText()
	e.CommitText(ibus.NewText(commitStr))
}

func (e *IBusTeniEngine) ProcessKeyEvent(keyVal uint32, keyCode uint32, state uint32) (bool, *dbus.Error) {
	e.Lock()
	defer e.Unlock()

	if e.zeroLocation || e.excepted ||
		(state&IBUS_SHIFT_MASK == 0 && (keyVal == IBUS_Shift_L || keyVal == IBUS_Shift_R)) { //Ignore 1 shift key
		return false, nil
	}

	if state&IBUS_RELEASE_MASK != 0 {
		//Ignore key-up event
		if e.ignoreNextUp || e.preediter.RawKeyLen() > 0 {
			return true, nil
		} else {
			return false, nil
		}
	} else {
		e.ignoreNextUp = false
	}

	if state&IBUS_CONTROL_MASK != 0 ||
		state&IBUS_MOD1_MASK != 0 ||
		state&IBUS_IGNORED_MASK != 0 ||
		state&IBUS_SUPER_MASK != 0 ||
		state&IBUS_HYPER_MASK != 0 ||
		state&IBUS_META_MASK != 0 {
		if e.preediter.RawKeyLen() == 0 && len(e.prevText) == 0 {
			//No thing left, just ignore
			return false, nil
		} else {
			//while typing, do not process control keys
			e.ignoreNextUp = true
			return true, nil
		}
	}

	if keyVal == IBUS_BackSpace {
		if e.preediter.RawKeyLen() > 0 {
			e.preediter.Backspace()
			e.updatePreedit()
			e.ignoreNextUp = true
			return true, nil
		} else if lenLongText := len(e.prevText); lenLongText > 0 {
			backLen := e.preediter.PopStateBack()
			e.prevText = e.prevText[:lenLongText-1-backLen]
			e.updatePreedit()
			e.ignoreNextUp = true
			return true, nil
		}
	}

	if keyVal == IBUS_Return || keyVal == IBUS_KP_Enter {
		if e.preediter.ResultLen() > 0 || len(e.prevText) > 0 {
			e.commitPreedit(0)
			//forward lastKey
			if !e.capSurrounding {
				e.ForwardKeyEvent(keyVal, keyCode, state)
				return true, nil
			}
		}
		return false, nil
	}

	if keyVal == IBUS_Escape {
		if e.preediter.RawKeyLen() > 0 {
			e.commitPreedit(keyVal)
			e.ignoreNextUp = true
			return true, nil
		}
	}

	if e.preediter.RawKeyLen() > 2*teni.MaxWordLength {
		e.commitPreedit(keyVal)
		e.ignoreNextUp = true
		return true, nil
	}

	if (keyVal >= 'a' && keyVal <= 'z') ||
		(keyVal >= 'A' && keyVal <= 'Z') ||
		(keyVal >= '0' && keyVal <= '9' && e.preediter.ResultLen() > 0) ||
		(e.preediter.InputMethod == teni.IMTelex && teni.InChangeCharMap(rune(keyVal))) ||
		(e.preediter.InputMethod == teni.IMTelexEx && teni.InChangeCharMapEx(rune(keyVal))) {
		if e.preediter.InputMethod == teni.IMTelex && state&IBUS_LOCK_MASK != 0 {
			keyVal = teni.SwitchCaplock(keyVal)
		}
		keyRune := rune(keyVal)
		e.preediter.AddKey(keyRune)
		e.updatePreedit()
		e.ignoreNextUp = true
		return true, nil
	} else {
		if e.preediter.ResultLen() > 0 || len(e.prevText) > 0 {
			if e.config.EnableLongText == ibus.PROP_STATE_CHECKED && printableKeyCode[keyCode] {
				if e.config.EnableForceSpell == ibus.PROP_STATE_CHECKED {
					e.prevText = append(e.prevText, e.preediter.GetCommitResult()...)
				} else {
					e.prevText = append(e.prevText, e.preediter.GetResult()...)
				}
				cutLen := e.preediter.PushStateBack()
				if cutLen > 0 {
					e.CommitText(ibus.NewText(string(e.prevText[:cutLen])))
					e.prevText = e.prevText[cutLen:]
				}
				e.prevText = append(e.prevText, rune(keyVal))
				preeditText, preeditLen := string(e.prevText), uint32(len(e.prevText))
				e.UpdatePreeditTextWithMode(ibus.NewText(preeditText), preeditLen, true, ibus.IBUS_ENGINE_PREEDIT_COMMIT)
				e.ignoreNextUp = true
				return true, nil
			}

			e.commitPreedit(keyVal)

			//forward lastKey
			if e.capSurrounding {
				return false, nil
			}
			e.ForwardKeyEvent(keyVal, keyCode, state)
			return true, nil
		} else if e.config.EnableLongText == ibus.PROP_STATE_CHECKED && printableKeyCode[keyCode] && e.preediter.LenStateBack() > 0 {
			e.preediter.PushStateBack()
			e.prevText = append(e.prevText, rune(keyVal))
			preeditText, preeditLen := string(e.prevText), uint32(len(e.prevText))
			e.UpdatePreeditTextWithMode(ibus.NewText(preeditText), preeditLen, true, ibus.IBUS_ENGINE_PREEDIT_COMMIT)
			e.ignoreNextUp = true
			return true, nil
		}
		//pre-edit empty, just forward key
		return false, nil
	}
}

func (e *IBusTeniEngine) FocusIn() *dbus.Error {
	e.Lock()
	defer e.Unlock()

	if e.config.EnableExcept == ibus.PROP_STATE_CHECKED {
		if e.display == nil {
			e.display = x11OpenDisplay()
		}
		e.excepted = e.exceptMap.Contains(x11GetFocusWindowClass(e.display))
	}

	e.RegisterProperties(e.propList)

	e.preediter.Reset()
	e.prevText = e.prevText[:0]

	return nil
}

func (e *IBusTeniEngine) FocusOut() *dbus.Error {
	e.Lock()
	defer e.Unlock()

	e.preediter.Reset()
	e.prevText = e.prevText[:0]

	return nil
}

func (e *IBusTeniEngine) Reset() *dbus.Error {
	return nil
}

func (e *IBusTeniEngine) Enable() *dbus.Error {
	e.preediter.Reset()
	e.prevText = e.prevText[:0]

	return nil
}

func (e *IBusTeniEngine) Disable() *dbus.Error {
	e.Lock()
	defer e.Unlock()

	e.preediter.Reset()
	e.prevText = e.prevText[:0]

	if e.display != nil {
		x11CloseDisplay(e.display)
		e.display = nil
	}

	return nil
}

func (e *IBusTeniEngine) SetCapabilities(cap uint32) *dbus.Error {
	e.Lock()
	defer e.Unlock()

	e.capSurrounding = cap&IBUS_CAP_SURROUNDING_TEXT != 0
	return nil
}

func (e *IBusTeniEngine) SetCursorLocation(x int32, y int32, w int32, h int32) *dbus.Error {
	e.zeroLocation = x == 0 && y == 0 && w == 0 && h == 0
	return nil
}

func (e *IBusTeniEngine) SetContentType(purpose uint32, hints uint32) *dbus.Error {
	return nil
}

//@method(in_signature="su")
func (e *IBusTeniEngine) PropertyActivate(propName string, propState uint32) *dbus.Error {
	debug.FreeOSMemory()

	if propName == PropKeyAbout {
		exec.Command("xdg-open", HomePage).Start()
		return nil
	}

	oldToneType := e.config.ToneType

	if propState == ibus.PROP_STATE_CHECKED &&
		(propName == PropKeyMethodTeni ||
			propName == PropKeyMethodVni ||
			propName == PropKeyMethodTelex ||
			propName == PropKeyMethodTelexEx ||
			propName == PropKeyToneStd ||
			propName == PropKeyToneNew) {
		switch propName {
		case PropKeyMethodTeni:
			e.config.InputMethod = teni.IMTeni
			e.preediter.InputMethod = teni.IMTeni
		case PropKeyMethodVni:
			e.config.InputMethod = teni.IMVni
			e.preediter.InputMethod = teni.IMVni
		case PropKeyMethodTelex:
			e.config.InputMethod = teni.IMTelex
			e.preediter.InputMethod = teni.IMTelex
		case PropKeyMethodTelexEx:
			e.config.InputMethod = teni.IMTelexEx
			e.preediter.InputMethod = teni.IMTelexEx
		case PropKeyToneStd:
			e.config.ToneType = ConfigToneStd
		case PropKeyToneNew:
			e.config.ToneType = ConfigToneNew
		}
		SaveConfig(e.config, e.engineName)
		e.propList = GetPropListByConfig(e.config)
		e.RegisterProperties(e.propList)
		if e.config.ToneType != oldToneType {
			if e.config.ToneType == ConfigToneStd {
				teni.InitWordTrie(e.preediter.ForceSpell, DictStdList...)
			} else {
				teni.InitWordTrie(e.preediter.ForceSpell, DictNewList...)
			}
		}
		return nil
	}

	if propName == PropKeyExcept {
		e.config.EnableExcept = propState
		SaveConfig(e.config, e.engineName)
		e.propList = GetPropListByConfig(e.config)
		e.RegisterProperties(e.propList)
		if propState == ibus.PROP_STATE_CHECKED {
			e.exceptMap.Enable()
			e.excepted = e.exceptMap.Contains(x11GetFocusWindowClass(e.display))
		} else {
			e.exceptMap.Disable()
			e.excepted = false
		}
		return nil
	}

	if propName == PropKeyExceptList {
		OpenExceptListFile(e.engineName)
		return nil
	}

	if propName == PropKeyLongText {
		e.config.EnableLongText = propState
		SaveConfig(e.config, e.engineName)
		e.propList = GetPropListByConfig(e.config)
		e.RegisterProperties(e.propList)
		return nil
	}

	if propName == PropKeyForceSpell {
		e.config.EnableForceSpell = propState
		SaveConfig(e.config, e.engineName)
		e.propList = GetPropListByConfig(e.config)
		e.RegisterProperties(e.propList)
		e.preediter.ForceSpell = e.config.EnableForceSpell == ibus.PROP_STATE_CHECKED

		if e.config.ToneType == ConfigToneStd {
			teni.InitWordTrie(e.preediter.ForceSpell, DictStdList...)
		} else {
			teni.InitWordTrie(e.preediter.ForceSpell, DictNewList...)
		}

		return nil
	}

	return nil
}


================================================
FILE: src/ibus-teni/except.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"io/ioutil"
	"log"
	"os"
	"strings"
	"sync"
	"time"
)

type ExceptMap struct {
	sync.RWMutex
	m          map[string]bool
	enable     bool
	engineName string
}

func (e *ExceptMap) Contains(ss []string) bool {
	e.RLock()
	defer e.RUnlock()

	if !e.enable || len(e.m) == 0 {
		return false
	}

	for _, s := range ss {
		if _, exist := e.m[s]; exist {
			return true
		}
	}

	return false
}

func (e *ExceptMap) update(exceptFile string) {
	b, err := ioutil.ReadFile(exceptFile)
	if err != nil {
		log.Println(err)
		return
	}

	e.Lock()
	e.m = map[string]bool{}
	for _, s := range strings.Split(string(b), "\n") {
		s = strings.TrimSpace(s)
		if len(s) > 0 && !strings.HasPrefix(s, "#") {
			e.m[s] = true
		}
	}
	e.Unlock()
}

func (e *ExceptMap) Enable() {
	e.Lock()
	e.enable = true

	go func() {
		cont := true
		modTime := time.Now()

		efPath := getExceptListFile(e.engineName)

		for cont {
			if sta, _ := os.Stat(efPath); sta != nil {
				if newModeTime := sta.ModTime(); !newModeTime.Equal(modTime) {
					modTime = newModeTime
					e.update(efPath)
				}
			}
			time.Sleep(time.Second)
			e.RLock()
			cont = e.enable
			e.RUnlock()
		}
	}()

	e.Unlock()
}

func (e *ExceptMap) Disable() {
	e.Lock()
	e.enable = false
	e.m = nil
	e.Unlock()
}


================================================
FILE: src/ibus-teni/ibus-const.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

//ibustypes — Generic types for IBus.
// http://ibus.github.io/docs/ibus-1.5/ibus-ibustypes.html

const (
	//IBusModifierType
	IBUS_SHIFT_MASK   = 1 << 0 //Shift is activated.
	IBUS_LOCK_MASK    = 1 << 1 //Cap Lock is locked.
	IBUS_CONTROL_MASK = 1 << 2 //Control key is activated.
	IBUS_MOD1_MASK    = 1 << 3 //Modifier 1 (Usually Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)) activated.
	//IBUS_MOD2_MASK     = 1 << 4            //Modifier 2 (Usually Num_Lock (0x4d)) activated.
	//IBUS_MOD3_MASK     = 1 << 5            //Modifier 3 activated.
	//IBUS_MOD4_MASK     = 1 << 6            //Modifier 4 (Usually Super_L (0xce), Hyper_L (0xcf)) activated.
	//IBUS_MOD5_MASK     = 1 << 7            //Modifier 5 (ISO_Level3_Shift (0x5c), Mode_switch (0xcb)) activated.
	//IBUS_BUTTON1_MASK  = 1 << 8            //Mouse button 1 (left) is activated.
	//IBUS_BUTTON2_MASK  = 1 << 9            //Mouse button 2 (middle) is activated.
	//IBUS_BUTTON3_MASK  = 1 << 10           //Mouse button 3 (right) is activated.
	//IBUS_BUTTON4_MASK  = 1 << 11           //Mouse button 4 (scroll up) is activated.
	//IBUS_BUTTON5_MASK  = 1 << 12           //Mouse button 5 (scroll down) is activated.
	//IBUS_HANDLED_MASK  = 1 << 24           //Handled mask indicates the event has been handled by ibus.
	IBUS_FORWARD_MASK = 1 << 25           //Forward mask indicates the event has been forward from ibus.
	IBUS_IGNORED_MASK = IBUS_FORWARD_MASK //It is an alias of IBUS_FORWARD_MASK.
	IBUS_SUPER_MASK   = 1 << 26           //Super (Usually Win) key is activated.
	IBUS_HYPER_MASK   = 1 << 27           //Hyper key is activated.
	IBUS_META_MASK    = 1 << 28           //Meta key is activated.
	IBUS_RELEASE_MASK = 1 << 30           //Key is released.
	//IBUS_MODIFIER_MASK = 0x5f001fff        //Modifier mask for the all the masks above.
)

const (
	//IBusCapability
	IBUS_CAP_PREEDIT_TEXT = 1 << 0 //UI is capable to show pre-edit text.
	//IBUS_CAP_AUXILIARY_TEXT   = 1 << 1 //UI is capable to show auxiliary text.
	//IBUS_CAP_LOOKUP_TABLE     = 1 << 2 //UI is capable to show the lookup table.
	//IBUS_CAP_FOCUS            = 1 << 3 //UI is capable to get focus.
	//IBUS_CAP_PROPERTY         = 1 << 4 //UI is capable to have property.
	IBUS_CAP_SURROUNDING_TEXT = 1 << 5 //Client can provide surround text, or IME can handle surround text.
)

// ibuskeysyms-compat
// http://ibus.github.io/docs/ibus-1.5/ibus-ibuskeysyms-compat.htm

const (
	IBUS_BackSpace   = 0xff08
	IBUS_Return      = 0xff0d
	IBUS_Escape      = 0xff1b
	IBUS_KP_Space    = 0xff80
	IBUS_KP_Enter    = 0xff8d
	IBUS_KP_Multiply = 0xffaa
	IBUS_KP_Divide   = 0xffaf
	IBUS_KP_0        = 0xffb0
	IBUS_KP_9        = 0xffb9
	IBUS_Shift_L     = 0xffe1
	IBUS_Shift_R     = 0xffe2
	IBUS_space       = 0x020
	IBUS_0           = 0x030
)


================================================
FILE: src/ibus-teni/main.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"github.com/godbus/dbus"
	"github.com/sarim/goibus/ibus"
	"log"
	"os"
)

const (
	ComponentName = "org.freedesktop.IBus.Teni"
	EngineName    = "Teni"
	HomePage      = "https://github.com/teni-ime/ibus-teni"

	DictVietnameseCm  = "dict/vietnamese.cm.dict"
	DictVietnameseSp  = "dict/vietnamese.sp.dict"
	DictVietnameseStd = "dict/vietnamese.std.dict"
	DictVietnameseNew = "dict/vietnamese.new.dict"
)

func main() {
	if isIBusDaemonChild() {
		if len(os.Args) == 3 && os.Args[1] == "cd" {
			os.Chdir(os.Args[2])
		}
		bus := ibus.NewBus()
		bus.RequestName(ComponentName, 0)

		conn := bus.GetDbusConn()
		ibus.NewFactory(conn, IBusTeniEngineCreator)

		select {}
	} else {
		log.Println("Running debug mode")
		runMode = " (debug)"

		bus := ibus.NewBus()
		bus.RegisterComponent(makeDebugComponent())

		conn := bus.GetDbusConn()
		ibus.NewFactory(conn, IBusTeniEngineCreator)

		log.Println("Setting Global Engine to", DebugEngineName)
		bus.CallMethod("SetGlobalEngine", 0, DebugEngineName)

		c := make(chan *dbus.Signal, 10)
		conn.Signal(c)

		select {
		case <-c:
		}
	}
}


================================================
FILE: src/ibus-teni/mice.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"os"
)

//sudo usermod -a -G input $USER
const (
	DevInputMice = "/dev/input/mice"
)

var onMouseClick func()

func init() {
	go func() {
		down := false
		miceDev, err := os.OpenFile(DevInputMice, os.O_RDONLY, 0)
		if err == nil {
			data := make([]byte, 3)
			for {
				n, err := miceDev.Read(data)
				if err == nil && n == 3 && data[0]&0x7 != 0 {
					if data[1] == 0 && data[2] == 0 {
						if !down {
							if onMouseClick != nil {
								go onMouseClick()
							}
							down = true
						}
					}
				} else if down {
					down = false
				}
			}
		}
	}()
}


================================================
FILE: src/ibus-teni/proc.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"fmt"
	"os"
	"strings"
)

const IBusDaemon = "ibus-daemon"

func getProcessName(pid int) string {
	pStatusFile := fmt.Sprintf("/proc/%d/status", pid)
	f, e := os.OpenFile(pStatusFile, os.O_RDONLY, os.ModePerm)
	if e == nil {
		defer f.Close()
		buf := make([]byte, len(IBusDaemon)*2)
		n, e := f.Read(buf)
		if e == nil {
			s := string(buf[:n])
			lines := strings.Split(s, "\n")
			firstLineParts := strings.Split(lines[0], "\t")
			if len(firstLineParts) >= 2 {
				return firstLineParts[1]
			}
		}
	}

	return ""
}

func isIBusDaemonChild() bool {
	ppid := os.Getppid()
	return getProcessName(ppid) == IBusDaemon
}


================================================
FILE: src/ibus-teni/prop.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

import (
	"github.com/godbus/dbus"
	"github.com/sarim/goibus/ibus"
	"teni"
)

const (
	PropKeyAbout         = "about"
	PropKeyMethodTeni    = "method_teni"
	PropKeyMethodVni     = "method_vni"
	PropKeyMethodTelex   = "method_telex"
	PropKeyMethodTelexEx = "method_telex_ex"
	PropKeyToneStd       = "tone_std"
	PropKeyToneNew       = "tone_new"
	PropKeyExcept        = "except"
	PropKeyExceptList    = "except_list"
	PropKeyLongText      = "long_text"
	PropKeyForceSpell    = "force_spell"
)

var runMode = ""

func GetPropListByConfig(c *Config) *ibus.PropList {
	teniChecked := ibus.PROP_STATE_UNCHECKED
	vniChecked := ibus.PROP_STATE_UNCHECKED
	telexChecked := ibus.PROP_STATE_UNCHECKED
	telexExChecked := ibus.PROP_STATE_UNCHECKED
	toneStdChecked := ibus.PROP_STATE_UNCHECKED
	toneNewChecked := ibus.PROP_STATE_UNCHECKED

	switch c.InputMethod {
	case teni.IMTeni:
		teniChecked = ibus.PROP_STATE_CHECKED
	case teni.IMVni:
		vniChecked = ibus.PROP_STATE_CHECKED
	case teni.IMTelex:
		telexChecked = ibus.PROP_STATE_CHECKED
	case teni.IMTelexEx:
		telexExChecked = ibus.PROP_STATE_CHECKED
	}
	switch c.ToneType {
	case ConfigToneStd:
		toneStdChecked = ibus.PROP_STATE_CHECKED
	case ConfigToneNew:
		toneNewChecked = ibus.PROP_STATE_CHECKED
	}

	return ibus.NewPropList(
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyAbout,
			Type:      ibus.PROP_TYPE_NORMAL,
			Label:     dbus.MakeVariant(ibus.NewText("Bộ gõ " + EngineName + " " + Version + runMode)),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Mở trang chủ")),
			Sensitive: true,
			Visible:   true,
			Icon:      "gtk-about",
			Symbol:    dbus.MakeVariant(ibus.NewText("B")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       "-",
			Type:      ibus.PROP_TYPE_SEPARATOR,
			Label:     dbus.MakeVariant(ibus.NewText("")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("")),
			Sensitive: true,
			Visible:   true,
			Symbol:    dbus.MakeVariant(ibus.NewText("")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyMethodTeni,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Kiểu gõ Teni")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Kết hợp Telex và Vni")),
			Sensitive: true,
			Visible:   true,
			State:     teniChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("T")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyMethodVni,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Kiểu gõ Vni")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Chỉ kiểu gõ Vni")),
			Sensitive: true,
			Visible:   true,
			State:     vniChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("V")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyMethodTelex,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Kiểu gõ Telex")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Kiểu gõ Telex không dùng []")),
			Sensitive: true,
			Visible:   true,
			State:     telexChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("X")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyMethodTelexEx,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Kiểu gõ [Telex]")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Kiểu gõ Telex có dùng []")),
			Sensitive: true,
			Visible:   true,
			State:     telexExChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("[")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       "-",
			Type:      ibus.PROP_TYPE_SEPARATOR,
			Label:     dbus.MakeVariant(ibus.NewText("")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("")),
			Sensitive: true,
			Visible:   true,
			Symbol:    dbus.MakeVariant(ibus.NewText("")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyToneStd,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Dấu thanh chuẩn")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Cân đối, nên dùng")),
			Sensitive: true,
			Visible:   true,
			State:     toneStdChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("C")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyToneNew,
			Type:      ibus.PROP_TYPE_RADIO,
			Label:     dbus.MakeVariant(ibus.NewText("Dấu thanh kiểu mới")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Lệch bên phải, không nên dùng")),
			Sensitive: true,
			Visible:   true,
			State:     toneNewChecked,
			Symbol:    dbus.MakeVariant(ibus.NewText("M")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       "-",
			Type:      ibus.PROP_TYPE_SEPARATOR,
			Label:     dbus.MakeVariant(ibus.NewText("")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("")),
			Sensitive: true,
			Visible:   true,
			Symbol:    dbus.MakeVariant(ibus.NewText("")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		}, &ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyExcept,
			Type:      ibus.PROP_TYPE_TOGGLE,
			Label:     dbus.MakeVariant(ibus.NewText("Loại trừ ứng dụng")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Loại trừ các ứng dụng không cần gõ tiếng Việt")),
			Sensitive: true,
			Visible:   true,
			State:     c.EnableExcept,
			Symbol:    dbus.MakeVariant(ibus.NewText("L")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		}, &ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyExceptList,
			Type:      ibus.PROP_TYPE_NORMAL,
			Label:     dbus.MakeVariant(ibus.NewText("Danh sách loại trừ")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Mở file danh sách các ứng dụng không cần gõ tiếng Việt")),
			Sensitive: true,
			Visible:   true,
			Symbol:    dbus.MakeVariant(ibus.NewText("D")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
		&ibus.Property{
			Name:      "IBusProperty",
			Key:       "-",
			Type:      ibus.PROP_TYPE_SEPARATOR,
			Label:     dbus.MakeVariant(ibus.NewText("")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("")),
			Sensitive: true,
			Visible:   true,
			Symbol:    dbus.MakeVariant(ibus.NewText("")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		}, &ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyLongText,
			Type:      ibus.PROP_TYPE_TOGGLE,
			Label:     dbus.MakeVariant(ibus.NewText("Giữ nhiều chữ")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Giữ nhiều chữ khi đang gõ, cho sửa dấu các từ đã gõ xong")),
			Sensitive: true,
			Visible:   true,
			State:     c.EnableLongText,
			Symbol:    dbus.MakeVariant(ibus.NewText("G")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		}, &ibus.Property{
			Name:      "IBusProperty",
			Key:       PropKeyForceSpell,
			Type:      ibus.PROP_TYPE_TOGGLE,
			Label:     dbus.MakeVariant(ibus.NewText("Đúng chính tả")),
			Tooltip:   dbus.MakeVariant(ibus.NewText("Sẽ khôi phục phím với những từ không có trong từ điển tiếng Việt")),
			Sensitive: true,
			Visible:   true,
			State:     c.EnableForceSpell,
			Symbol:    dbus.MakeVariant(ibus.NewText("G")),
			SubProps:  dbus.MakeVariant(*ibus.NewPropList()),
		},
	)
}


================================================
FILE: src/ibus-teni/runes.go
================================================
/*
 * Teni-IME - A Vietnamese Input method editor
 * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>
 * This file is part of Teni-IME.
 *
 *  Teni-IME is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Teni-IME is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Teni-IME.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package main

type Runes struct {
	buf []rune
}

func (r *Runes) Len() int {
	return len(r.buf)
}

func (r *Runes) Append(c ...rune) {
	r.buf = append(r.buf, c...)
}

func (r *Runes) AppendRunes(rs Runes) {
	r.buf = append(r.buf, rs.buf...)
}

func (r *Runes) Clear() {
	r.buf = r.buf[:0]
}

func (r *Runes) At(index int) rune {
	if index < len(r.buf) {
		return r.buf[index]
	}
	return 0
}

func (r *Runes) First() rune {
	if len(r.buf) > 0 {
		return r.buf[0]
	}
	return 0
}

func (r *Runes) Last() rune {
	if len(r.buf) > 0 {
		return r.buf[len(r.buf)-1]
	}
	return 0
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/.travis.yml
================================================
dist: precise
language: go
go_import_path: github.com/godbus/dbus
sudo: true

go:
  - 1.6.3
  - 1.7.3
  - tip

env:
  global:
  matrix:
   - TARGET=amd64
   - TARGET=arm64
   - TARGET=arm
   - TARGET=386
   - TARGET=ppc64le

matrix:
  fast_finish: true
  allow_failures:
    - go: tip
  exclude:
  - go: tip
    env: TARGET=arm
  - go: tip
    env: TARGET=arm64
  - go: tip
    env: TARGET=386
  - go: tip
    env: TARGET=ppc64le

addons:
  apt:
    packages:
    - dbus
    - dbus-x11

before_install:


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/CONTRIBUTING.md
================================================
# How to Contribute

## Getting Started

- Fork the repository on GitHub
- Read the [README](README.markdown) for build and test instructions
- Play with the project, submit bugs, submit patches!

## Contribution Flow

This is a rough outline of what a contributor's workflow looks like:

- Create a topic branch from where you want to base your work (usually master).
- Make commits of logical units.
- Make sure your commit messages are in the proper format (see below).
- Push your changes to a topic branch in your fork of the repository.
- Make sure the tests pass, and add any new tests as appropriate.
- Submit a pull request to the original repository.

Thanks for your contributions!

### Format of the Commit Message

We follow a rough convention for commit messages that is designed to answer two
questions: what changed and why. The subject line should feature the what and
the body of the commit should describe the why.

```
scripts: add the test-cluster command

this uses tmux to setup a test cluster that you can easily kill and
start for debugging.

Fixes #38
```

The format can be described more formally as follows:

```
<subsystem>: <what changed>
<BLANK LINE>
<why this change was made>
<BLANK LINE>
<footer>
```

The first line is the subject and should be no longer than 70 characters, the
second line is always blank, and other lines should be wrapped at 80 characters.
This allows the message to be easier to read on GitHub as well as in various
git tools.


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/LICENSE
================================================
Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/MAINTAINERS
================================================
Brandon Philips <brandon@ifup.org> (@philips)
Brian Waldon <brian@waldon.cc> (@bcwaldon)
John Southworth <jsouthwo@brocade.com> (@jsouthworth)


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/README.markdown
================================================
[![Build Status](https://travis-ci.org/godbus/dbus.svg?branch=master)](https://travis-ci.org/godbus/dbus)

dbus
----

dbus is a simple library that implements native Go client bindings for the
D-Bus message bus system.

### Features

* Complete native implementation of the D-Bus message protocol
* Go-like API (channels for signals / asynchronous method calls, Goroutine-safe connections)
* Subpackages that help with the introspection / property interfaces

### Installation

This packages requires Go 1.1. If you installed it and set up your GOPATH, just run:

```
go get github.com/godbus/dbus
```

If you want to use the subpackages, you can install them the same way.

### Usage

The complete package documentation and some simple examples are available at
[godoc.org](http://godoc.org/github.com/godbus/dbus). Also, the
[_examples](https://github.com/godbus/dbus/tree/master/_examples) directory
gives a short overview over the basic usage. 

#### Projects using godbus
- [notify](https://github.com/esiqveland/notify) provides desktop notifications over dbus into a library.
- [go-bluetooth](https://github.com/muka/go-bluetooth) provides a bluetooth client over bluez dbus API.

Please note that the API is considered unstable for now and may change without
further notice.

### License

go.dbus is available under the Simplified BSD License; see LICENSE for the full
text.

Nearly all of the credit for this library goes to github.com/guelfey/go.dbus.


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth.go
================================================
package dbus

import (
	"bufio"
	"bytes"
	"errors"
	"io"
	"os"
	"strconv"
)

// AuthStatus represents the Status of an authentication mechanism.
type AuthStatus byte

const (
	// AuthOk signals that authentication is finished; the next command
	// from the server should be an OK.
	AuthOk AuthStatus = iota

	// AuthContinue signals that additional data is needed; the next command
	// from the server should be a DATA.
	AuthContinue

	// AuthError signals an error; the server sent invalid data or some
	// other unexpected thing happened and the current authentication
	// process should be aborted.
	AuthError
)

type authState byte

const (
	waitingForData authState = iota
	waitingForOk
	waitingForReject
)

// Auth defines the behaviour of an authentication mechanism.
type Auth interface {
	// Return the name of the mechnism, the argument to the first AUTH command
	// and the next status.
	FirstData() (name, resp []byte, status AuthStatus)

	// Process the given DATA command, and return the argument to the DATA
	// command and the next status. If len(resp) == 0, no DATA command is sent.
	HandleData(data []byte) (resp []byte, status AuthStatus)
}

// Auth authenticates the connection, trying the given list of authentication
// mechanisms (in that order). If nil is passed, the EXTERNAL and
// DBUS_COOKIE_SHA1 mechanisms are tried for the current user. For private
// connections, this method must be called before sending any messages to the
// bus. Auth must not be called on shared connections.
func (conn *Conn) Auth(methods []Auth) error {
	if methods == nil {
		uid := strconv.Itoa(os.Getuid())
		methods = []Auth{AuthExternal(uid), AuthCookieSha1(uid, getHomeDir())}
	}
	in := bufio.NewReader(conn.transport)
	err := conn.transport.SendNullByte()
	if err != nil {
		return err
	}
	err = authWriteLine(conn.transport, []byte("AUTH"))
	if err != nil {
		return err
	}
	s, err := authReadLine(in)
	if err != nil {
		return err
	}
	if len(s) < 2 || !bytes.Equal(s[0], []byte("REJECTED")) {
		return errors.New("dbus: authentication protocol error")
	}
	s = s[1:]
	for _, v := range s {
		for _, m := range methods {
			if name, data, status := m.FirstData(); bytes.Equal(v, name) {
				var ok bool
				err = authWriteLine(conn.transport, []byte("AUTH"), []byte(v), data)
				if err != nil {
					return err
				}
				switch status {
				case AuthOk:
					err, ok = conn.tryAuth(m, waitingForOk, in)
				case AuthContinue:
					err, ok = conn.tryAuth(m, waitingForData, in)
				default:
					panic("dbus: invalid authentication status")
				}
				if err != nil {
					return err
				}
				if ok {
					if conn.transport.SupportsUnixFDs() {
						err = authWriteLine(conn, []byte("NEGOTIATE_UNIX_FD"))
						if err != nil {
							return err
						}
						line, err := authReadLine(in)
						if err != nil {
							return err
						}
						switch {
						case bytes.Equal(line[0], []byte("AGREE_UNIX_FD")):
							conn.EnableUnixFDs()
							conn.unixFD = true
						case bytes.Equal(line[0], []byte("ERROR")):
						default:
							return errors.New("dbus: authentication protocol error")
						}
					}
					err = authWriteLine(conn.transport, []byte("BEGIN"))
					if err != nil {
						return err
					}
					go conn.inWorker()
					go conn.outWorker()
					return nil
				}
			}
		}
	}
	return errors.New("dbus: authentication failed")
}

// tryAuth tries to authenticate with m as the mechanism, using state as the
// initial authState and in for reading input. It returns (nil, true) on
// success, (nil, false) on a REJECTED and (someErr, false) if some other
// error occured.
func (conn *Conn) tryAuth(m Auth, state authState, in *bufio.Reader) (error, bool) {
	for {
		s, err := authReadLine(in)
		if err != nil {
			return err, false
		}
		switch {
		case state == waitingForData && string(s[0]) == "DATA":
			if len(s) != 2 {
				err = authWriteLine(conn.transport, []byte("ERROR"))
				if err != nil {
					return err, false
				}
				continue
			}
			data, status := m.HandleData(s[1])
			switch status {
			case AuthOk, AuthContinue:
				if len(data) != 0 {
					err = authWriteLine(conn.transport, []byte("DATA"), data)
					if err != nil {
						return err, false
					}
				}
				if status == AuthOk {
					state = waitingForOk
				}
			case AuthError:
				err = authWriteLine(conn.transport, []byte("ERROR"))
				if err != nil {
					return err, false
				}
			}
		case state == waitingForData && string(s[0]) == "REJECTED":
			return nil, false
		case state == waitingForData && string(s[0]) == "ERROR":
			err = authWriteLine(conn.transport, []byte("CANCEL"))
			if err != nil {
				return err, false
			}
			state = waitingForReject
		case state == waitingForData && string(s[0]) == "OK":
			if len(s) != 2 {
				err = authWriteLine(conn.transport, []byte("CANCEL"))
				if err != nil {
					return err, false
				}
				state = waitingForReject
			}
			conn.uuid = string(s[1])
			return nil, true
		case state == waitingForData:
			err = authWriteLine(conn.transport, []byte("ERROR"))
			if err != nil {
				return err, false
			}
		case state == waitingForOk && string(s[0]) == "OK":
			if len(s) != 2 {
				err = authWriteLine(conn.transport, []byte("CANCEL"))
				if err != nil {
					return err, false
				}
				state = waitingForReject
			}
			conn.uuid = string(s[1])
			return nil, true
		case state == waitingForOk && string(s[0]) == "REJECTED":
			return nil, false
		case state == waitingForOk && (string(s[0]) == "DATA" ||
			string(s[0]) == "ERROR"):

			err = authWriteLine(conn.transport, []byte("CANCEL"))
			if err != nil {
				return err, false
			}
			state = waitingForReject
		case state == waitingForOk:
			err = authWriteLine(conn.transport, []byte("ERROR"))
			if err != nil {
				return err, false
			}
		case state == waitingForReject && string(s[0]) == "REJECTED":
			return nil, false
		case state == waitingForReject:
			return errors.New("dbus: authentication protocol error"), false
		default:
			panic("dbus: invalid auth state")
		}
	}
}

// authReadLine reads a line and separates it into its fields.
func authReadLine(in *bufio.Reader) ([][]byte, error) {
	data, err := in.ReadBytes('\n')
	if err != nil {
		return nil, err
	}
	data = bytes.TrimSuffix(data, []byte("\r\n"))
	return bytes.Split(data, []byte{' '}), nil
}

// authWriteLine writes the given line in the authentication protocol format
// (elements of data separated by a " " and terminated by "\r\n").
func authWriteLine(out io.Writer, data ...[]byte) error {
	buf := make([]byte, 0)
	for i, v := range data {
		buf = append(buf, v...)
		if i != len(data)-1 {
			buf = append(buf, ' ')
		}
	}
	buf = append(buf, '\r')
	buf = append(buf, '\n')
	n, err := out.Write(buf)
	if err != nil {
		return err
	}
	if n != len(buf) {
		return io.ErrUnexpectedEOF
	}
	return nil
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth_external.go
================================================
package dbus

import (
	"encoding/hex"
)

// AuthExternal returns an Auth that authenticates as the given user with the
// EXTERNAL mechanism.
func AuthExternal(user string) Auth {
	return authExternal{user}
}

// AuthExternal implements the EXTERNAL authentication mechanism.
type authExternal struct {
	user string
}

func (a authExternal) FirstData() ([]byte, []byte, AuthStatus) {
	b := make([]byte, 2*len(a.user))
	hex.Encode(b, []byte(a.user))
	return []byte("EXTERNAL"), b, AuthOk
}

func (a authExternal) HandleData(b []byte) ([]byte, AuthStatus) {
	return nil, AuthError
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth_sha1.go
================================================
package dbus

import (
	"bufio"
	"bytes"
	"crypto/rand"
	"crypto/sha1"
	"encoding/hex"
	"os"
)

// AuthCookieSha1 returns an Auth that authenticates as the given user with the
// DBUS_COOKIE_SHA1 mechanism. The home parameter should specify the home
// directory of the user.
func AuthCookieSha1(user, home string) Auth {
	return authCookieSha1{user, home}
}

type authCookieSha1 struct {
	user, home string
}

func (a authCookieSha1) FirstData() ([]byte, []byte, AuthStatus) {
	b := make([]byte, 2*len(a.user))
	hex.Encode(b, []byte(a.user))
	return []byte("DBUS_COOKIE_SHA1"), b, AuthContinue
}

func (a authCookieSha1) HandleData(data []byte) ([]byte, AuthStatus) {
	challenge := make([]byte, len(data)/2)
	_, err := hex.Decode(challenge, data)
	if err != nil {
		return nil, AuthError
	}
	b := bytes.Split(challenge, []byte{' '})
	if len(b) != 3 {
		return nil, AuthError
	}
	context := b[0]
	id := b[1]
	svchallenge := b[2]
	cookie := a.getCookie(context, id)
	if cookie == nil {
		return nil, AuthError
	}
	clchallenge := a.generateChallenge()
	if clchallenge == nil {
		return nil, AuthError
	}
	hash := sha1.New()
	hash.Write(bytes.Join([][]byte{svchallenge, clchallenge, cookie}, []byte{':'}))
	hexhash := make([]byte, 2*hash.Size())
	hex.Encode(hexhash, hash.Sum(nil))
	data = append(clchallenge, ' ')
	data = append(data, hexhash...)
	resp := make([]byte, 2*len(data))
	hex.Encode(resp, data)
	return resp, AuthOk
}

// getCookie searches for the cookie identified by id in context and returns
// the cookie content or nil. (Since HandleData can't return a specific error,
// but only whether an error occured, this function also doesn't bother to
// return an error.)
func (a authCookieSha1) getCookie(context, id []byte) []byte {
	file, err := os.Open(a.home + "/.dbus-keyrings/" + string(context))
	if err != nil {
		return nil
	}
	defer file.Close()
	rd := bufio.NewReader(file)
	for {
		line, err := rd.ReadBytes('\n')
		if err != nil {
			return nil
		}
		line = line[:len(line)-1]
		b := bytes.Split(line, []byte{' '})
		if len(b) != 3 {
			return nil
		}
		if bytes.Equal(b[0], id) {
			return b[2]
		}
	}
}

// generateChallenge returns a random, hex-encoded challenge, or nil on error
// (see above).
func (a authCookieSha1) generateChallenge() []byte {
	b := make([]byte, 16)
	n, err := rand.Read(b)
	if err != nil {
		return nil
	}
	if n != 16 {
		return nil
	}
	enc := make([]byte, 32)
	hex.Encode(enc, b)
	return enc
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/call.go
================================================
package dbus

import (
	"errors"
)

// Call represents a pending or completed method call.
type Call struct {
	Destination string
	Path        ObjectPath
	Method      string
	Args        []interface{}

	// Strobes when the call is complete.
	Done chan *Call

	// After completion, the error status. If this is non-nil, it may be an
	// error message from the peer (with Error as its type) or some other error.
	Err error

	// Holds the response once the call is done.
	Body []interface{}
}

var errSignature = errors.New("dbus: mismatched signature")

// Store stores the body of the reply into the provided pointers. It returns
// an error if the signatures of the body and retvalues don't match, or if
// the error status is not nil.
func (c *Call) Store(retvalues ...interface{}) error {
	if c.Err != nil {
		return c.Err
	}

	return Store(c.Body, retvalues...)
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn.go
================================================
package dbus

import (
	"errors"
	"io"
	"os"
	"reflect"
	"strings"
	"sync"
)

var (
	systemBus     *Conn
	systemBusLck  sync.Mutex
	sessionBus    *Conn
	sessionBusLck sync.Mutex
	sessionEnvLck sync.Mutex
)

// ErrClosed is the error returned by calls on a closed connection.
var ErrClosed = errors.New("dbus: connection closed by user")

// Conn represents a connection to a message bus (usually, the system or
// session bus).
//
// Connections are either shared or private. Shared connections
// are shared between calls to the functions that return them. As a result,
// the methods Close, Auth and Hello must not be called on them.
//
// Multiple goroutines may invoke methods on a connection simultaneously.
type Conn struct {
	transport

	busObj BusObject
	unixFD bool
	uuid   string

	names    []string
	namesLck sync.RWMutex

	serialLck  sync.Mutex
	nextSerial uint32
	serialUsed map[uint32]bool

	calls    map[uint32]*Call
	callsLck sync.RWMutex

	handler Handler

	out    chan *Message
	closed bool
	outLck sync.RWMutex

	signalHandler SignalHandler

	eavesdropped    chan<- *Message
	eavesdroppedLck sync.Mutex
}

// SessionBus returns a shared connection to the session bus, connecting to it
// if not already done.
func SessionBus() (conn *Conn, err error) {
	sessionBusLck.Lock()
	defer sessionBusLck.Unlock()
	if sessionBus != nil {
		return sessionBus, nil
	}
	defer func() {
		if conn != nil {
			sessionBus = conn
		}
	}()
	conn, err = SessionBusPrivate()
	if err != nil {
		return
	}
	if err = conn.Auth(nil); err != nil {
		conn.Close()
		conn = nil
		return
	}
	if err = conn.Hello(); err != nil {
		conn.Close()
		conn = nil
	}
	return
}

func getSessionBusAddress() (string, error) {
	sessionEnvLck.Lock()
	defer sessionEnvLck.Unlock()
	address := os.Getenv("DBUS_SESSION_BUS_ADDRESS")
	if address != "" && address != "autolaunch:" {
		return address, nil
	}
	return getSessionBusPlatformAddress()
}

// SessionBusPrivate returns a new private connection to the session bus.
func SessionBusPrivate() (*Conn, error) {
	address, err := getSessionBusAddress()
	if err != nil {
		return nil, err
	}

	return Dial(address)
}

// SessionBusPrivate returns a new private connection to the session bus.
func SessionBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
	address, err := getSessionBusAddress()
	if err != nil {
		return nil, err
	}
	return DialHandler(address, handler, signalHandler)
}

// SystemBus returns a shared connection to the system bus, connecting to it if
// not already done.
func SystemBus() (conn *Conn, err error) {
	systemBusLck.Lock()
	defer systemBusLck.Unlock()
	if systemBus != nil {
		return systemBus, nil
	}
	defer func() {
		if conn != nil {
			systemBus = conn
		}
	}()
	conn, err = SystemBusPrivate()
	if err != nil {
		return
	}
	if err = conn.Auth(nil); err != nil {
		conn.Close()
		conn = nil
		return
	}
	if err = conn.Hello(); err != nil {
		conn.Close()
		conn = nil
	}
	return
}

// SystemBusPrivate returns a new private connection to the system bus.
func SystemBusPrivate() (*Conn, error) {
	return Dial(getSystemBusPlatformAddress())
}

// SystemBusPrivateHandler returns a new private connection to the system bus, using the provided handlers.
func SystemBusPrivateHandler(handler Handler, signalHandler SignalHandler) (*Conn, error) {
	return DialHandler(getSystemBusPlatformAddress(), handler, signalHandler)
}

// Dial establishes a new private connection to the message bus specified by address.
func Dial(address string) (*Conn, error) {
	tr, err := getTransport(address)
	if err != nil {
		return nil, err
	}
	return newConn(tr, NewDefaultHandler(), NewDefaultSignalHandler())
}

// DialHandler establishes a new private connection to the message bus specified by address, using the supplied handlers.
func DialHandler(address string, handler Handler, signalHandler SignalHandler) (*Conn, error) {
	tr, err := getTransport(address)
	if err != nil {
		return nil, err
	}
	return newConn(tr, handler, signalHandler)
}

// NewConn creates a new private *Conn from an already established connection.
func NewConn(conn io.ReadWriteCloser) (*Conn, error) {
	return NewConnHandler(conn, NewDefaultHandler(), NewDefaultSignalHandler())
}

// NewConnHandler creates a new private *Conn from an already established connection, using the supplied handlers.
func NewConnHandler(conn io.ReadWriteCloser, handler Handler, signalHandler SignalHandler) (*Conn, error) {
	return newConn(genericTransport{conn}, handler, signalHandler)
}

// newConn creates a new *Conn from a transport.
func newConn(tr transport, handler Handler, signalHandler SignalHandler) (*Conn, error) {
	conn := new(Conn)
	conn.transport = tr
	conn.calls = make(map[uint32]*Call)
	conn.out = make(chan *Message, 10)
	conn.handler = handler
	conn.signalHandler = signalHandler
	conn.nextSerial = 1
	conn.serialUsed = map[uint32]bool{0: true}
	conn.busObj = conn.Object("org.freedesktop.DBus", "/org/freedesktop/DBus")
	return conn, nil
}

// BusObject returns the object owned by the bus daemon which handles
// administrative requests.
func (conn *Conn) BusObject() BusObject {
	return conn.busObj
}

// Close closes the connection. Any blocked operations will return with errors
// and the channels passed to Eavesdrop and Signal are closed. This method must
// not be called on shared connections.
func (conn *Conn) Close() error {
	conn.outLck.Lock()
	if conn.closed {
		// inWorker calls Close on read error, the read error may
		// be caused by another caller calling Close to shutdown the
		// dbus connection, a double-close scenario we prevent here.
		conn.outLck.Unlock()
		return nil
	}
	close(conn.out)
	conn.closed = true
	conn.outLck.Unlock()

	if term, ok := conn.signalHandler.(Terminator); ok {
		term.Terminate()
	}

	if term, ok := conn.handler.(Terminator); ok {
		term.Terminate()
	}

	conn.eavesdroppedLck.Lock()
	if conn.eavesdropped != nil {
		close(conn.eavesdropped)
	}
	conn.eavesdroppedLck.Unlock()

	return conn.transport.Close()
}

// Eavesdrop causes conn to send all incoming messages to the given channel
// without further processing. Method replies, errors and signals will not be
// sent to the appropiate channels and method calls will not be handled. If nil
// is passed, the normal behaviour is restored.
//
// The caller has to make sure that ch is sufficiently buffered;
// if a message arrives when a write to ch is not possible, the message is
// discarded.
func (conn *Conn) Eavesdrop(ch chan<- *Message) {
	conn.eavesdroppedLck.Lock()
	conn.eavesdropped = ch
	conn.eavesdroppedLck.Unlock()
}

// getSerial returns an unused serial.
func (conn *Conn) getSerial() uint32 {
	conn.serialLck.Lock()
	defer conn.serialLck.Unlock()
	n := conn.nextSerial
	for conn.serialUsed[n] {
		n++
	}
	conn.serialUsed[n] = true
	conn.nextSerial = n + 1
	return n
}

// Hello sends the initial org.freedesktop.DBus.Hello call. This method must be
// called after authentication, but before sending any other messages to the
// bus. Hello must not be called for shared connections.
func (conn *Conn) Hello() error {
	var s string
	err := conn.busObj.Call("org.freedesktop.DBus.Hello", 0).Store(&s)
	if err != nil {
		return err
	}
	conn.namesLck.Lock()
	conn.names = make([]string, 1)
	conn.names[0] = s
	conn.namesLck.Unlock()
	return nil
}

// inWorker runs in an own goroutine, reading incoming messages from the
// transport and dispatching them appropiately.
func (conn *Conn) inWorker() {
	for {
		msg, err := conn.ReadMessage()
		if err == nil {
			conn.eavesdroppedLck.Lock()
			if conn.eavesdropped != nil {
				select {
				case conn.eavesdropped <- msg:
				default:
				}
				conn.eavesdroppedLck.Unlock()
				continue
			}
			conn.eavesdroppedLck.Unlock()
			dest, _ := msg.Headers[FieldDestination].value.(string)
			found := false
			if dest == "" {
				found = true
			} else {
				conn.namesLck.RLock()
				if len(conn.names) == 0 {
					found = true
				}
				for _, v := range conn.names {
					if dest == v {
						found = true
						break
					}
				}
				conn.namesLck.RUnlock()
			}
			if !found {
				// Eavesdropped a message, but no channel for it is registered.
				// Ignore it.
				continue
			}
			switch msg.Type {
			case TypeMethodReply, TypeError:
				serial := msg.Headers[FieldReplySerial].value.(uint32)
				conn.callsLck.Lock()
				if c, ok := conn.calls[serial]; ok {
					if msg.Type == TypeError {
						name, _ := msg.Headers[FieldErrorName].value.(string)
						c.Err = Error{name, msg.Body}
					} else {
						c.Body = msg.Body
					}
					c.Done <- c
					conn.serialLck.Lock()
					delete(conn.serialUsed, serial)
					conn.serialLck.Unlock()
					delete(conn.calls, serial)
				}
				conn.callsLck.Unlock()
			case TypeSignal:
				iface := msg.Headers[FieldInterface].value.(string)
				member := msg.Headers[FieldMember].value.(string)
				// as per http://dbus.freedesktop.org/doc/dbus-specification.html ,
				// sender is optional for signals.
				sender, _ := msg.Headers[FieldSender].value.(string)
				if iface == "org.freedesktop.DBus" && sender == "org.freedesktop.DBus" {
					if member == "NameLost" {
						// If we lost the name on the bus, remove it from our
						// tracking list.
						name, ok := msg.Body[0].(string)
						if !ok {
							panic("Unable to read the lost name")
						}
						conn.namesLck.Lock()
						for i, v := range conn.names {
							if v == name {
								conn.names = append(conn.names[:i],
									conn.names[i+1:]...)
							}
						}
						conn.namesLck.Unlock()
					} else if member == "NameAcquired" {
						// If we acquired the name on the bus, add it to our
						// tracking list.
						name, ok := msg.Body[0].(string)
						if !ok {
							panic("Unable to read the acquired name")
						}
						conn.namesLck.Lock()
						conn.names = append(conn.names, name)
						conn.namesLck.Unlock()
					}
				}
				conn.handleSignal(msg)
			case TypeMethodCall:
				go conn.handleCall(msg)
			}
		} else if _, ok := err.(InvalidMessageError); !ok {
			// Some read error occured (usually EOF); we can't really do
			// anything but to shut down all stuff and returns errors to all
			// pending replies.
			conn.Close()
			conn.callsLck.RLock()
			for _, v := range conn.calls {
				v.Err = err
				v.Done <- v
			}
			conn.callsLck.RUnlock()
			return
		}
		// invalid messages are ignored
	}
}

func (conn *Conn) handleSignal(msg *Message) {
	iface := msg.Headers[FieldInterface].value.(string)
	member := msg.Headers[FieldMember].value.(string)
	// as per http://dbus.freedesktop.org/doc/dbus-specification.html ,
	// sender is optional for signals.
	sender, _ := msg.Headers[FieldSender].value.(string)
	signal := &Signal{
		Sender: sender,
		Path:   msg.Headers[FieldPath].value.(ObjectPath),
		Name:   iface + "." + member,
		Body:   msg.Body,
	}
	conn.signalHandler.DeliverSignal(iface, member, signal)
}

// Names returns the list of all names that are currently owned by this
// connection. The slice is always at least one element long, the first element
// being the unique name of the connection.
func (conn *Conn) Names() []string {
	conn.namesLck.RLock()
	// copy the slice so it can't be modified
	s := make([]string, len(conn.names))
	copy(s, conn.names)
	conn.namesLck.RUnlock()
	return s
}

// Object returns the object identified by the given destination name and path.
func (conn *Conn) Object(dest string, path ObjectPath) BusObject {
	return &Object{conn, dest, path}
}

// outWorker runs in an own goroutine, encoding and sending messages that are
// sent to conn.out.
func (conn *Conn) outWorker() {
	for msg := range conn.out {
		err := conn.SendMessage(msg)
		conn.callsLck.RLock()
		if err != nil {
			if c := conn.calls[msg.serial]; c != nil {
				c.Err = err
				c.Done <- c
			}
			conn.serialLck.Lock()
			delete(conn.serialUsed, msg.serial)
			conn.serialLck.Unlock()
		} else if msg.Type != TypeMethodCall {
			conn.serialLck.Lock()
			delete(conn.serialUsed, msg.serial)
			conn.serialLck.Unlock()
		}
		conn.callsLck.RUnlock()
	}
}

// Send sends the given message to the message bus. You usually don't need to
// use this; use the higher-level equivalents (Call / Go, Emit and Export)
// instead. If msg is a method call and NoReplyExpected is not set, a non-nil
// call is returned and the same value is sent to ch (which must be buffered)
// once the call is complete. Otherwise, ch is ignored and a Call structure is
// returned of which only the Err member is valid.
func (conn *Conn) Send(msg *Message, ch chan *Call) *Call {
	var call *Call

	msg.serial = conn.getSerial()
	if msg.Type == TypeMethodCall && msg.Flags&FlagNoReplyExpected == 0 {
		if ch == nil {
			ch = make(chan *Call, 5)
		} else if cap(ch) == 0 {
			panic("dbus: unbuffered channel passed to (*Conn).Send")
		}
		call = new(Call)
		call.Destination, _ = msg.Headers[FieldDestination].value.(string)
		call.Path, _ = msg.Headers[FieldPath].value.(ObjectPath)
		iface, _ := msg.Headers[FieldInterface].value.(string)
		member, _ := msg.Headers[FieldMember].value.(string)
		call.Method = iface + "." + member
		call.Args = msg.Body
		call.Done = ch
		conn.callsLck.Lock()
		conn.calls[msg.serial] = call
		conn.callsLck.Unlock()
		conn.outLck.RLock()
		if conn.closed {
			call.Err = ErrClosed
			call.Done <- call
		} else {
			conn.out <- msg
		}
		conn.outLck.RUnlock()
	} else {
		conn.outLck.RLock()
		if conn.closed {
			call = &Call{Err: ErrClosed}
		} else {
			conn.out <- msg
			call = &Call{Err: nil}
		}
		conn.outLck.RUnlock()
	}
	return call
}

// sendError creates an error message corresponding to the parameters and sends
// it to conn.out.
func (conn *Conn) sendError(err error, dest string, serial uint32) {
	var e *Error
	switch em := err.(type) {
	case Error:
		e = &em
	case *Error:
		e = em
	case DBusError:
		name, body := em.DBusError()
		e = NewError(name, body)
	default:
		e = MakeFailedError(err)
	}
	msg := new(Message)
	msg.Type = TypeError
	msg.serial = conn.getSerial()
	msg.Headers = make(map[HeaderField]Variant)
	if dest != "" {
		msg.Headers[FieldDestination] = MakeVariant(dest)
	}
	msg.Headers[FieldErrorName] = MakeVariant(e.Name)
	msg.Headers[FieldReplySerial] = MakeVariant(serial)
	msg.Body = e.Body
	if len(e.Body) > 0 {
		msg.Headers[FieldSignature] = MakeVariant(SignatureOf(e.Body...))
	}
	conn.outLck.RLock()
	if !conn.closed {
		conn.out <- msg
	}
	conn.outLck.RUnlock()
}

// sendReply creates a method reply message corresponding to the parameters and
// sends it to conn.out.
func (conn *Conn) sendReply(dest string, serial uint32, values ...interface{}) {
	msg := new(Message)
	msg.Type = TypeMethodReply
	msg.serial = conn.getSerial()
	msg.Headers = make(map[HeaderField]Variant)
	if dest != "" {
		msg.Headers[FieldDestination] = MakeVariant(dest)
	}
	msg.Headers[FieldReplySerial] = MakeVariant(serial)
	msg.Body = values
	if len(values) > 0 {
		msg.Headers[FieldSignature] = MakeVariant(SignatureOf(values...))
	}
	conn.outLck.RLock()
	if !conn.closed {
		conn.out <- msg
	}
	conn.outLck.RUnlock()
}

func (conn *Conn) defaultSignalAction(fn func(h *defaultSignalHandler, ch chan<- *Signal), ch chan<- *Signal) {
	if !isDefaultSignalHandler(conn.signalHandler) {
		return
	}
	handler := conn.signalHandler.(*defaultSignalHandler)
	fn(handler, ch)
}

// Signal registers the given channel to be passed all received signal messages.
// The caller has to make sure that ch is sufficiently buffered; if a message
// arrives when a write to c is not possible, it is discarded.
//
// Multiple of these channels can be registered at the same time.
//
// These channels are "overwritten" by Eavesdrop; i.e., if there currently is a
// channel for eavesdropped messages, this channel receives all signals, and
// none of the channels passed to Signal will receive any signals.
func (conn *Conn) Signal(ch chan<- *Signal) {
	conn.defaultSignalAction((*defaultSignalHandler).addSignal, ch)
}

// RemoveSignal removes the given channel from the list of the registered channels.
func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
	conn.defaultSignalAction((*defaultSignalHandler).removeSignal, ch)
}

// SupportsUnixFDs returns whether the underlying transport supports passing of
// unix file descriptors. If this is false, method calls containing unix file
// descriptors will return an error and emitted signals containing them will
// not be sent.
func (conn *Conn) SupportsUnixFDs() bool {
	return conn.unixFD
}

// Error represents a D-Bus message of type Error.
type Error struct {
	Name string
	Body []interface{}
}

func NewError(name string, body []interface{}) *Error {
	return &Error{name, body}
}

func (e Error) Error() string {
	if len(e.Body) >= 1 {
		s, ok := e.Body[0].(string)
		if ok {
			return s
		}
	}
	return e.Name
}

// Signal represents a D-Bus message of type Signal. The name member is given in
// "interface.member" notation, e.g. org.freedesktop.D-Bus.NameLost.
type Signal struct {
	Sender string
	Path   ObjectPath
	Name   string
	Body   []interface{}
}

// transport is a D-Bus transport.
type transport interface {
	// Read and Write raw data (for example, for the authentication protocol).
	io.ReadWriteCloser

	// Send the initial null byte used for the EXTERNAL mechanism.
	SendNullByte() error

	// Returns whether this transport supports passing Unix FDs.
	SupportsUnixFDs() bool

	// Signal the transport that Unix FD passing is enabled for this connection.
	EnableUnixFDs()

	// Read / send a message, handling things like Unix FDs.
	ReadMessage() (*Message, error)
	SendMessage(*Message) error
}

var (
	transports = make(map[string]func(string) (transport, error))
)

func getTransport(address string) (transport, error) {
	var err error
	var t transport

	addresses := strings.Split(address, ";")
	for _, v := range addresses {
		i := strings.IndexRune(v, ':')
		if i == -1 {
			err = errors.New("dbus: invalid bus address (no transport)")
			continue
		}
		f := transports[v[:i]]
		if f == nil {
			err = errors.New("dbus: invalid bus address (invalid or unsupported transport)")
			continue
		}
		t, err = f(v[i+1:])
		if err == nil {
			return t, nil
		}
	}
	return nil, err
}

// dereferenceAll returns a slice that, assuming that vs is a slice of pointers
// of arbitrary types, containes the values that are obtained from dereferencing
// all elements in vs.
func dereferenceAll(vs []interface{}) []interface{} {
	for i := range vs {
		v := reflect.ValueOf(vs[i])
		v = v.Elem()
		vs[i] = v.Interface()
	}
	return vs
}

// getKey gets a key from a the list of keys. Returns "" on error / not found...
func getKey(s, key string) string {
	for _, keyEqualsValue := range strings.Split(s, ",") {
		keyValue := strings.SplitN(keyEqualsValue, "=", 2)
		if len(keyValue) == 2 && keyValue[0] == key {
			return keyValue[1]
		}
	}
	return ""
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn_darwin.go
================================================
package dbus

import (
	"errors"
	"fmt"
	"os"
	"os/exec"
)

const defaultSystemBusAddress = "unix:path=/opt/local/var/run/dbus/system_bus_socket"

func getSessionBusPlatformAddress() (string, error) {
	cmd := exec.Command("launchctl", "getenv", "DBUS_LAUNCHD_SESSION_BUS_SOCKET")
	b, err := cmd.CombinedOutput()

	if err != nil {
		return "", err
	}

	if len(b) == 0 {
		return "", errors.New("dbus: couldn't determine address of session bus")
	}

	return "unix:path=" + string(b[:len(b)-1]), nil
}

func getSystemBusPlatformAddress() string {
	address := os.Getenv("DBUS_LAUNCHD_SESSION_BUS_SOCKET")
	if address != "" {
		return fmt.Sprintf("unix:path=%s", address)
	}
	return defaultSystemBusAddress
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn_other.go
================================================
// +build !darwin

package dbus

import (
	"bytes"
	"errors"
	"fmt"
	"os"
	"os/exec"
)

const defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket"

func getSessionBusPlatformAddress() (string, error) {
	cmd := exec.Command("dbus-launch")
	b, err := cmd.CombinedOutput()

	if err != nil {
		return "", err
	}

	i := bytes.IndexByte(b, '=')
	j := bytes.IndexByte(b, '\n')

	if i == -1 || j == -1 {
		return "", errors.New("dbus: couldn't determine address of session bus")
	}

	env, addr := string(b[0:i]), string(b[i+1:j])
	os.Setenv(env, addr)

	return addr, nil
}

func getSystemBusPlatformAddress() string {
	address := os.Getenv("DBUS_SYSTEM_BUS_ADDRESS")
	if address != "" {
		return fmt.Sprintf("unix:path=%s", address)
	}
	return defaultSystemBusAddress
}


================================================
FILE: src/ibus-teni/vendor/github.com/godbus/dbus/dbus.go
================================================
package dbus

import (
	"errors"
	"fmt"
	"reflect"
	"strings"
)

var (
	byteType        = reflect.TypeOf(byte(0))
	boolType        = reflect.TypeOf(false)
	uint8Type       = reflect.TypeOf(uint8(0))
	int16Type       = reflect.TypeOf(int16(0))
	uint16Type      = reflect.TypeOf(uint16(0))
	intType         = reflect.TypeOf(int(0))
	uintType        = reflect.TypeOf(uint(0))
	int32Type       = reflect.TypeOf(int32(0))
	uint32Type      = reflect.TypeOf(uint32(0))
	int64Type       = reflect.TypeOf(int64(0))
	uint64Type      = reflect.TypeOf(uint64(0))
	float64Type     = reflect.TypeOf(float64(0))
	stringType      = reflect.TypeOf("")
	signatureType   = reflect.TypeOf(Signature{""})
	objectPathType  = reflect.TypeOf(ObjectPath(""))
	variantType     = reflect.TypeOf(Variant{Signature{""}, nil})
	interfacesType  = reflect.TypeOf([]interface{}{})
	interfaceType   = reflect.TypeOf((*interface{})(nil)).Elem()
	unixFDType      = reflect.TypeOf(UnixFD(0))
	unixFDIndexType = reflect.TypeOf(UnixFDIndex(0))
)

// An InvalidTypeError signals that a value which cannot be represented in the
// D-Bus wire format was passed to a function.
type InvalidTypeError struct {
	Type reflect.Type
}

func (e InvalidTypeError) Error() string {
	return "dbus: invalid type " + e.Type.String()
}

// Store copies the values contained in src to dest, which must be a slice of
// pointers. It converts slices of interfaces from src to corresponding structs
// in dest. An error is returned if the lengths of src and dest or the types of
// their elements don't match.
func Store(src []interface{}, dest ...interface{}) error {
	if len(src) != len(dest) {
		return errors.New("dbus.Store: length mismatch")
	}

	for i := range src {
		if err := storeInterfaces(src[i], dest[i]); err != nil {
			return err
		}
	}
	return nil
}

func storeInterfaces(src, dest interface{}) error {
	return store(reflect.ValueOf(dest), reflect.ValueOf(src))
}

func store(dest, src reflect.Value) error {
	if dest.Kind() == reflect.Ptr {
		return store(dest.Elem(), src)
	}
	switch src.Kind() {
	case reflect.Slice:
		return storeSlice(dest, src)
	case reflect.Map:
		return storeMap(dest, src)
	default:
		return storeBase(dest, src)
	}
}

func storeBase(dest, src reflect.Value) error {
	return setDest(dest, src)
}

func setDest(dest, src reflect.Value) error {
	if !isVariant(src.Type()) && isVariant(dest.Type()) {
		//special conversion for dbus.Variant
		dest.Set(reflect.ValueOf(MakeVariant(src.Interface())))
		return nil
	}
	if isVariant(src.Type()) && !isVariant(dest.Type()) {
		src = getVariantValue(src)
	}
	if !src.Type().ConvertibleTo(dest.Type()) {
		return fmt.Errorf(
			"dbus.Store: type mismatch: cannot convert %s to %s",
			src.Type(), dest.Type())
	}
	dest.Set(src.Convert(dest.Type()))
	return nil
}

func kindsAreCompatible(dest, src reflect.Type) bool {
	switch {
	case isVariant(dest):
		return true
	case dest.Kind() == reflect.Interface:
		return true
	default:
		return dest.Kind() == src.Kind()
	}
}

func isConvertibleTo(dest, src reflect.Type) bool {
	switch {
	case isVariant(dest):
		return true
	case dest.Kind() == reflect.Interface:
		return true
	case dest.Kind() == reflect.Slice:
		return src.Kind() == reflect.Slice &&
			isConvertibleTo(dest.Elem(), src.Elem())
	case dest.Kind() == reflect.Struct:
		return src == interfacesType
	default:
		return src.ConvertibleTo(dest)
	}
}

func storeMap(dest, src reflect.Value) error {
	switch {
	case !kindsAreCompatible(dest.Type(), src.Type()):
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"map: cannot store a value of %s into %s",
			src.Type(), dest.Type())
	case isVariant(dest.Type()):
		return storeMapIntoVariant(dest, src)
	case dest.Kind() == reflect.Interface:
		return storeMapIntoInterface(dest, src)
	case isConvertibleTo(dest.Type().Key(), src.Type().Key()) &&
		isConvertibleTo(dest.Type().Elem(), src.Type().Elem()):
		return storeMapIntoMap(dest, src)
	default:
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"map: cannot convert a value of %s into %s",
			src.Type(), dest.Type())
	}
}

func storeMapIntoVariant(dest, src reflect.Value) error {
	dv := reflect.MakeMap(src.Type())
	err := store(dv, src)
	if err != nil {
		return err
	}
	return storeBase(dest, dv)
}

func storeMapIntoInterface(dest, src reflect.Value) error {
	var dv reflect.Value
	if isVariant(src.Type().Elem()) {
		//Convert variants to interface{} recursively when converting
		//to interface{}
		dv = reflect.MakeMap(
			reflect.MapOf(src.Type().Key(), interfaceType))
	} else {
		dv = reflect.MakeMap(src.Type())
	}
	err := store(dv, src)
	if err != nil {
		return err
	}
	return storeBase(dest, dv)
}

func storeMapIntoMap(dest, src reflect.Value) error {
	if dest.IsNil() {
		dest.Set(reflect.MakeMap(dest.Type()))
	}
	keys := src.MapKeys()
	for _, key := range keys {
		dkey := key.Convert(dest.Type().Key())
		dval := reflect.New(dest.Type().Elem()).Elem()
		err := store(dval, getVariantValue(src.MapIndex(key)))
		if err != nil {
			return err
		}
		dest.SetMapIndex(dkey, dval)
	}
	return nil
}

func storeSlice(dest, src reflect.Value) error {
	switch {
	case src.Type() == interfacesType && dest.Kind() == reflect.Struct:
		//The decoder always decodes structs as slices of interface{}
		return storeStruct(dest, src)
	case !kindsAreCompatible(dest.Type(), src.Type()):
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"slice: cannot store a value of %s into %s",
			src.Type(), dest.Type())
	case isVariant(dest.Type()):
		return storeSliceIntoVariant(dest, src)
	case dest.Kind() == reflect.Interface:
		return storeSliceIntoInterface(dest, src)
	case isConvertibleTo(dest.Type().Elem(), src.Type().Elem()):
		return storeSliceIntoSlice(dest, src)
	default:
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"slice: cannot convert a value of %s into %s",
			src.Type(), dest.Type())
	}
}

func storeStruct(dest, src reflect.Value) error {
	if isVariant(dest.Type()) {
		return storeBase(dest, src)
	}
	dval := make([]interface{}, 0, dest.NumField())
	dtype := dest.Type()
	for i := 0; i < dest.NumField(); i++ {
		field := dest.Field(i)
		ftype := dtype.Field(i)
		if ftype.PkgPath != "" {
			continue
		}
		if ftype.Tag.Get("dbus") == "-" {
			continue
		}
		dval = append(dval, field.Addr().Interface())
	}
	if src.Len() != len(dval) {
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"destination struct does not have "+
				"enough fields need: %d have: %d",
			src.Len(), len(dval))
	}
	return Store(src.Interface().([]interface{}), dval...)
}

func storeSliceIntoVariant(dest, src reflect.Value) error {
	dv := reflect.MakeSlice(src.Type(), src.Len(), src.Cap())
	err := store(dv, src)
	if err != nil {
		return err
	}
	return storeBase(dest, dv)
}

func storeSliceIntoInterface(dest, src reflect.Value) error {
	var dv reflect.Value
	if isVariant(src.Type().Elem()) {
		//Convert variants to interface{} recursively when converting
		//to interface{}
		dv = reflect.MakeSlice(reflect.SliceOf(interfaceType),
			src.Len(), src.Cap())
	} else {
		dv = reflect.MakeSlice(src.Type(), src.Len(), src.Cap())
	}
	err := store(dv, src)
	if err != nil {
		return err
	}
	return storeBase(dest, dv)
}

func storeSliceIntoSlice(dest, src reflect.Value) error {
	if dest.IsNil() || dest.Len() < src.Len() {
		dest.Set(reflect.MakeSlice(dest.Type(), src.Len(), src.Cap()))
	}
	if dest.Len() != src.Len() {
		return fmt.Errorf(
			"dbus.Store: type mismatch: "+
				"slices are different lengths "+
				"need: %d have: %d",
			src.Len(), dest.Len())
	}
	for i := 0; i < src.Len(); i++ {
		err := store(dest.Index(i), getVariantValue(src.Index(i)))
		if err != nil {
			return err
		}
	}
	return nil
}

func getVariantValue(in reflect.Value) reflect.Value {
	if isVariant(in.Type()) {
		return reflect.ValueOf(in.Interface().(Variant).Value())
	}
	return in
}

func isVariant(t reflect.Type) bool {
	return t == variantType
}

// An ObjectPath is an object path as defined by the D-Bus spec.
type ObjectPath string

// IsValid returns whether the object path is valid.
func (o ObjectPath) IsValid() bool {
	s := string(o)
	if len(s) == 0 {
		return false
	}
	if s[0] != '/' {
		return false
	}
	if s[len(s)-1] == '/' && len(s) != 1 {
		return false
	}
	// probably not used, but technically possible
	if s == "/" {
		return true
	}
	split := strings.Split(s[1:], "/")
	for _, v := range split {
		if len(v) == 0 {
			return false
		}
		for _, c := range v {
			if !isMemberChar(c) {
				return false
			}
		}
	}
	return true
}

// A UnixFD is a Unix file descriptor sent over the wire. See the package-level
// documentation for more information about Unix file descriptor passsing.
type UnixFD int32

// A UnixFDIndex is the representation of a Unix file descriptor in a message.
type UnixFDIndex uint32

// alignment returns the alignment of values of type t.
func alignment(t reflect.Type) int {
	switch t {
	case variantType:
		return 1
	case objectPathType:
		return 4
	case signatureType:
		return 1
	case interfacesType:
		return 4
	}
	switch t.Kind() {
	case reflect.Uint8:
		return 1
	case reflect.Uint16, reflect.Int16:
		return 2
	case reflect.Uint, reflect.Int, reflect.Uint32, reflect.Int32, reflect.String, reflect.Array, reflect.Slice, reflect.Map:
		return 4
	case reflect.Uint64, reflect.Int64, reflect.Float64, reflect.Struct:
		return 8
	case reflect.Ptr:
		return alignment(t.Elem())
	}
	return 1
}

// isKeyType returns whether t is a valid type for a D-Bus dict.
func isKeyType(t reflect.Type) bool {
	switch t.Kind() {
	case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
		reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float64,
		reflect.String, reflect.Uint, reflect.Int:

		return true
	}
	return false
}

// isValidInterface returns whether s is a valid name for an interface.
func isValidInterface(s string) bool {
	if len(s) == 0 || len(s) > 255 || s[0] == '.' {
		return false
	}
	elem := strings.Split(s, ".")
	if len(elem) < 2 {
		return false
	}
	for _, v := range elem {
		if len(v) == 0 {
			return false
		}
		if v[0] >= '0' && v[0] <= '9' {
			return false
		}
		for _, c := range v {
			if !isMemberChar(c) {
				return false
			}
		}
	}
	return true
}

// isValidMember returns whether s 
Download .txt
gitextract_j5e35vq7/

├── .github/
│   └── ISSUE_TEMPLATE/
│       └── bug_report.md
├── .gitignore
├── .travis.yml
├── GPLv3_vi.md
├── LICENSE
├── MAINTAINERS
├── Makefile
├── PKGBUILD
├── README.md
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── rules
│   └── source/
│       └── options
├── deploy.bash
├── dict/
│   ├── LICENSE
│   ├── vietnamese.cm.dict
│   ├── vietnamese.new.dict
│   ├── vietnamese.sp.dict
│   └── vietnamese.std.dict
├── except.tmpl.txt
├── ibus-teni.dsc
├── ibus-teni.spec
├── src/
│   ├── dict-gen/
│   │   ├── Gopkg.toml
│   │   ├── dump.go
│   │   ├── extract.go
│   │   ├── main.go
│   │   └── vnsort.go
│   ├── ibus-teni/
│   │   ├── cache-wm.go
│   │   ├── config.go
│   │   ├── debug.go
│   │   ├── engine.go
│   │   ├── except.go
│   │   ├── ibus-const.go
│   │   ├── main.go
│   │   ├── mice.go
│   │   ├── proc.go
│   │   ├── prop.go
│   │   ├── runes.go
│   │   ├── vendor/
│   │   │   └── github.com/
│   │   │       ├── godbus/
│   │   │       │   └── dbus/
│   │   │       │       ├── .travis.yml
│   │   │       │       ├── CONTRIBUTING.md
│   │   │       │       ├── LICENSE
│   │   │       │       ├── MAINTAINERS
│   │   │       │       ├── README.markdown
│   │   │       │       ├── auth.go
│   │   │       │       ├── auth_external.go
│   │   │       │       ├── auth_sha1.go
│   │   │       │       ├── call.go
│   │   │       │       ├── conn.go
│   │   │       │       ├── conn_darwin.go
│   │   │       │       ├── conn_other.go
│   │   │       │       ├── dbus.go
│   │   │       │       ├── decoder.go
│   │   │       │       ├── default_handler.go
│   │   │       │       ├── doc.go
│   │   │       │       ├── encoder.go
│   │   │       │       ├── export.go
│   │   │       │       ├── homedir.go
│   │   │       │       ├── homedir_dynamic.go
│   │   │       │       ├── homedir_static.go
│   │   │       │       ├── message.go
│   │   │       │       ├── object.go
│   │   │       │       ├── server_interfaces.go
│   │   │       │       ├── sig.go
│   │   │       │       ├── transport_darwin.go
│   │   │       │       ├── transport_generic.go
│   │   │       │       ├── transport_tcp.go
│   │   │       │       ├── transport_unix.go
│   │   │       │       ├── transport_unixcred_dragonfly.go
│   │   │       │       ├── transport_unixcred_freebsd.go
│   │   │       │       ├── transport_unixcred_linux.go
│   │   │       │       ├── transport_unixcred_openbsd.go
│   │   │       │       ├── variant.go
│   │   │       │       ├── variant_lexer.go
│   │   │       │       └── variant_parser.go
│   │   │       └── sarim/
│   │   │           └── goibus/
│   │   │               ├── README.md
│   │   │               └── ibus/
│   │   │                   ├── bus.go
│   │   │                   ├── common.go
│   │   │                   ├── component.go
│   │   │                   ├── engine.go
│   │   │                   ├── engineDesc.go
│   │   │                   ├── factory.go
│   │   │                   ├── lookupTable.go
│   │   │                   ├── property.go
│   │   │                   └── text.go
│   │   ├── version.go
│   │   └── x11.go
│   └── teni/
│       ├── teni.go
│       ├── teni_coverage_test.go
│       ├── teni_type_rule_test.go
│       ├── tone_charset.go
│       ├── typerule_change_char.go
│       ├── typerule_downlvl.go
│       ├── typerule_replace.go
│       ├── typerule_replace_char.go
│       ├── typerule_replace_str.go
│       ├── typerule_replace_vni.go
│       ├── typerule_swap.go
│       └── wordtrie.go
├── teni.xml
├── test-data/
│   ├── LICENSE
│   ├── nodict.tdata
│   ├── nodict.telexw.tdata
│   ├── test-data-gen.go
│   ├── vietnamese.cm.dict.telex1.tdata
│   ├── vietnamese.cm.dict.telex2.tdata
│   ├── vietnamese.cm.dict.telex3.tdata
│   ├── vietnamese.cm.dict.telexw.tdata
│   ├── vietnamese.cm.dict.vni1.tdata
│   ├── vietnamese.cm.dict.vni2.fix.tdata
│   ├── vietnamese.cm.dict.vni3.tdata
│   ├── vietnamese.new.dict.telex1.tdata
│   ├── vietnamese.new.dict.telex2.tdata
│   ├── vietnamese.new.dict.telex3.tdata
│   ├── vietnamese.new.dict.vni1.tdata
│   ├── vietnamese.new.dict.vni2.tdata
│   ├── vietnamese.new.dict.vni3.tdata
│   ├── vietnamese.sp.dict.telex1.fix.tdata
│   ├── vietnamese.sp.dict.telex2.fix.tdata
│   ├── vietnamese.sp.dict.telex3.fix.tdata
│   ├── vietnamese.sp.dict.telexw.fix.tdata
│   ├── vietnamese.sp.dict.vni1.tdata
│   ├── vietnamese.sp.dict.vni2.tdata
│   ├── vietnamese.sp.dict.vni3.tdata
│   ├── vietnamese.std.dict.telex1.tdata
│   ├── vietnamese.std.dict.telex2.tdata
│   ├── vietnamese.std.dict.telex3.tdata
│   ├── vietnamese.std.dict.vni1.tdata
│   ├── vietnamese.std.dict.vni2.tdata
│   └── vietnamese.std.dict.vni3.tdata
└── wm.bash
Download .txt
SYMBOL INDEX (708 symbols across 67 files)

FILE: src/dict-gen/dump.go
  constant topPage (line 14) | topPage            = "https://vi.wiktionary.org"
  constant firstPage (line 15) | firstPage          = "https://vi.wiktionary.org/wiki/Thể_loại:Mục_từ_tiế...
  constant contentFromPattern (line 16) | contentFromPattern = `[\(>]Trang sau[\)<]`
  constant nextPagePattern (line 17) | nextPagePattern    = `<a href="([^"]+)" title="Thể loại:Mục từ tiếng Việ...
  constant pageTitlePattern (line 18) | pageTitlePattern   = `<li><a href="/wiki/[^"]+" title="[^"]+">([^>]+)</a...
  constant outputFile (line 19) | outputFile         = "dict/vi.wiktionary.org.txt"
  constant vietChars (line 21) | vietChars = `
  function GetHttpText (line 44) | func GetHttpText(address string) string {
  function isVietnamese (line 61) | func isVietnamese(s string) bool {
  function dumpWiktionary (line 77) | func dumpWiktionary() string {

FILE: src/dict-gen/extract.go
  constant vietBaseMarks (line 10) | vietBaseMarks = `
  function init (line 32) | func init() {
  function extractVietWord (line 58) | func extractVietWord(s string, toMap map[string]bool) {

FILE: src/dict-gen/main.go
  function loadWordMap (line 21) | func loadWordMap(wordListFile string) map[string]bool {
  function main (line 45) | func main() {

FILE: src/dict-gen/vnsort.go
  function vnsort (line 8) | func vnsort(a []string) {

FILE: src/ibus-teni/cache-wm.go
  type CacheWM (line 27) | type CacheWM struct
    method Get (line 41) | func (c *CacheWM) Get(window uint32) ([]string, bool) {
    method Set (line 61) | func (c *CacheWM) Set(window uint32, wm []string) {
  function NewCacheWM (line 34) | func NewCacheWM(maxItems int) *CacheWM {

FILE: src/ibus-teni/config.go
  constant configFile (line 37) | configFile           = "%s/.config/ibus/ibus-%s.config.json"
  constant exceptListFile (line 38) | exceptListFile       = "%s/.config/ibus/ibus-%s.except.txt"
  constant sampleExceptListFile (line 39) | sampleExceptListFile = "except.tmpl.txt"
  constant varWmBash (line 41) | varWmBash  = "${WM.BASH}"
  constant wmBashFile (line 42) | wmBashFile = "wm.bash"
  type ToneType (line 45) | type ToneType
  constant ConfigToneStd (line 48) | ConfigToneStd ToneType = iota << 0
  constant ConfigToneNew (line 49) | ConfigToneNew ToneType = iota
  type Config (line 52) | type Config struct
  function LoadConfig (line 60) | func LoadConfig(engineName string) *Config {
  function SaveConfig (line 80) | func SaveConfig(c *Config, engineName string) {
  function getExceptListFile (line 98) | func getExceptListFile(engineName string) string {
  function getEngineSubFile (line 107) | func getEngineSubFile(fileName string) string {
  function OpenExceptListFile (line 117) | func OpenExceptListFile(engineName string) {

FILE: src/ibus-teni/debug.go
  constant DebugComponentName (line 30) | DebugComponentName = ComponentName + "Debug"
  constant DebugEngineName (line 31) | DebugEngineName    = EngineName + "-debug"
  constant IconFile (line 32) | IconFile           = "icon.png"
  function makeDebugComponent (line 35) | func makeDebugComponent() *ibus.Component {

FILE: src/ibus-teni/engine.go
  type IBusTeniEngine (line 34) | type IBusTeniEngine struct
    method updatePreedit (line 120) | func (e *IBusTeniEngine) updatePreedit() {
    method commitPreedit (line 133) | func (e *IBusTeniEngine) commitPreedit(lastKey uint32) {
    method ProcessKeyEvent (line 149) | func (e *IBusTeniEngine) ProcessKeyEvent(keyVal uint32, keyCode uint32...
    method FocusIn (line 280) | func (e *IBusTeniEngine) FocusIn() *dbus.Error {
    method FocusOut (line 299) | func (e *IBusTeniEngine) FocusOut() *dbus.Error {
    method Reset (line 309) | func (e *IBusTeniEngine) Reset() *dbus.Error {
    method Enable (line 313) | func (e *IBusTeniEngine) Enable() *dbus.Error {
    method Disable (line 320) | func (e *IBusTeniEngine) Disable() *dbus.Error {
    method SetCapabilities (line 335) | func (e *IBusTeniEngine) SetCapabilities(cap uint32) *dbus.Error {
    method SetCursorLocation (line 343) | func (e *IBusTeniEngine) SetCursorLocation(x int32, y int32, w int32, ...
    method SetContentType (line 348) | func (e *IBusTeniEngine) SetContentType(purpose uint32, hints uint32) ...
    method PropertyActivate (line 353) | func (e *IBusTeniEngine) PropertyActivate(propName string, propState u...
  function IBusTeniEngineCreator (line 81) | func IBusTeniEngineCreator(conn *dbus.Conn, engineName string) dbus.Obje...

FILE: src/ibus-teni/except.go
  type ExceptMap (line 32) | type ExceptMap struct
    method Contains (line 39) | func (e *ExceptMap) Contains(ss []string) bool {
    method update (line 56) | func (e *ExceptMap) update(exceptFile string) {
    method Enable (line 74) | func (e *ExceptMap) Enable() {
    method Disable (line 101) | func (e *ExceptMap) Disable() {

FILE: src/ibus-teni/ibus-const.go
  constant IBUS_SHIFT_MASK (line 28) | IBUS_SHIFT_MASK   = 1 << 0
  constant IBUS_LOCK_MASK (line 29) | IBUS_LOCK_MASK    = 1 << 1
  constant IBUS_CONTROL_MASK (line 30) | IBUS_CONTROL_MASK = 1 << 2
  constant IBUS_MOD1_MASK (line 31) | IBUS_MOD1_MASK    = 1 << 3
  constant IBUS_FORWARD_MASK (line 42) | IBUS_FORWARD_MASK = 1 << 25
  constant IBUS_IGNORED_MASK (line 43) | IBUS_IGNORED_MASK = IBUS_FORWARD_MASK
  constant IBUS_SUPER_MASK (line 44) | IBUS_SUPER_MASK   = 1 << 26
  constant IBUS_HYPER_MASK (line 45) | IBUS_HYPER_MASK   = 1 << 27
  constant IBUS_META_MASK (line 46) | IBUS_META_MASK    = 1 << 28
  constant IBUS_RELEASE_MASK (line 47) | IBUS_RELEASE_MASK = 1 << 30
  constant IBUS_CAP_PREEDIT_TEXT (line 53) | IBUS_CAP_PREEDIT_TEXT = 1 << 0
  constant IBUS_CAP_SURROUNDING_TEXT (line 58) | IBUS_CAP_SURROUNDING_TEXT = 1 << 5
  constant IBUS_BackSpace (line 65) | IBUS_BackSpace   = 0xff08
  constant IBUS_Return (line 66) | IBUS_Return      = 0xff0d
  constant IBUS_Escape (line 67) | IBUS_Escape      = 0xff1b
  constant IBUS_KP_Space (line 68) | IBUS_KP_Space    = 0xff80
  constant IBUS_KP_Enter (line 69) | IBUS_KP_Enter    = 0xff8d
  constant IBUS_KP_Multiply (line 70) | IBUS_KP_Multiply = 0xffaa
  constant IBUS_KP_Divide (line 71) | IBUS_KP_Divide   = 0xffaf
  constant IBUS_KP_0 (line 72) | IBUS_KP_0        = 0xffb0
  constant IBUS_KP_9 (line 73) | IBUS_KP_9        = 0xffb9
  constant IBUS_Shift_L (line 74) | IBUS_Shift_L     = 0xffe1
  constant IBUS_Shift_R (line 75) | IBUS_Shift_R     = 0xffe2
  constant IBUS_space (line 76) | IBUS_space       = 0x020
  constant IBUS_0 (line 77) | IBUS_0           = 0x030

FILE: src/ibus-teni/main.go
  constant ComponentName (line 31) | ComponentName = "org.freedesktop.IBus.Teni"
  constant EngineName (line 32) | EngineName    = "Teni"
  constant HomePage (line 33) | HomePage      = "https://github.com/teni-ime/ibus-teni"
  constant DictVietnameseCm (line 35) | DictVietnameseCm  = "dict/vietnamese.cm.dict"
  constant DictVietnameseSp (line 36) | DictVietnameseSp  = "dict/vietnamese.sp.dict"
  constant DictVietnameseStd (line 37) | DictVietnameseStd = "dict/vietnamese.std.dict"
  constant DictVietnameseNew (line 38) | DictVietnameseNew = "dict/vietnamese.new.dict"
  function main (line 41) | func main() {

FILE: src/ibus-teni/mice.go
  constant DevInputMice (line 29) | DevInputMice = "/dev/input/mice"
  function init (line 34) | func init() {

FILE: src/ibus-teni/proc.go
  constant IBusDaemon (line 29) | IBusDaemon = "ibus-daemon"
  function getProcessName (line 31) | func getProcessName(pid int) string {
  function isIBusDaemonChild (line 51) | func isIBusDaemonChild() bool {

FILE: src/ibus-teni/prop.go
  constant PropKeyAbout (line 30) | PropKeyAbout         = "about"
  constant PropKeyMethodTeni (line 31) | PropKeyMethodTeni    = "method_teni"
  constant PropKeyMethodVni (line 32) | PropKeyMethodVni     = "method_vni"
  constant PropKeyMethodTelex (line 33) | PropKeyMethodTelex   = "method_telex"
  constant PropKeyMethodTelexEx (line 34) | PropKeyMethodTelexEx = "method_telex_ex"
  constant PropKeyToneStd (line 35) | PropKeyToneStd       = "tone_std"
  constant PropKeyToneNew (line 36) | PropKeyToneNew       = "tone_new"
  constant PropKeyExcept (line 37) | PropKeyExcept        = "except"
  constant PropKeyExceptList (line 38) | PropKeyExceptList    = "except_list"
  constant PropKeyLongText (line 39) | PropKeyLongText      = "long_text"
  constant PropKeyForceSpell (line 40) | PropKeyForceSpell    = "force_spell"
  function GetPropListByConfig (line 45) | func GetPropListByConfig(c *Config) *ibus.PropList {

FILE: src/ibus-teni/runes.go
  type Runes (line 23) | type Runes struct
    method Len (line 27) | func (r *Runes) Len() int {
    method Append (line 31) | func (r *Runes) Append(c ...rune) {
    method AppendRunes (line 35) | func (r *Runes) AppendRunes(rs Runes) {
    method Clear (line 39) | func (r *Runes) Clear() {
    method At (line 43) | func (r *Runes) At(index int) rune {
    method First (line 50) | func (r *Runes) First() rune {
    method Last (line 57) | func (r *Runes) Last() rune {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth.go
  type AuthStatus (line 13) | type AuthStatus
  constant AuthOk (line 18) | AuthOk AuthStatus = iota
  constant AuthContinue (line 22) | AuthContinue
  constant AuthError (line 27) | AuthError
  type authState (line 30) | type authState
  constant waitingForData (line 33) | waitingForData authState = iota
  constant waitingForOk (line 34) | waitingForOk
  constant waitingForReject (line 35) | waitingForReject
  type Auth (line 39) | type Auth interface
  method Auth (line 54) | func (conn *Conn) Auth(methods []Auth) error {
  method tryAuth (line 132) | func (conn *Conn) tryAuth(m Auth, state authState, in *bufio.Reader) (er...
  function authReadLine (line 224) | func authReadLine(in *bufio.Reader) ([][]byte, error) {
  function authWriteLine (line 235) | func authWriteLine(out io.Writer, data ...[]byte) error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth_external.go
  function AuthExternal (line 9) | func AuthExternal(user string) Auth {
  type authExternal (line 14) | type authExternal struct
    method FirstData (line 18) | func (a authExternal) FirstData() ([]byte, []byte, AuthStatus) {
    method HandleData (line 24) | func (a authExternal) HandleData(b []byte) ([]byte, AuthStatus) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/auth_sha1.go
  function AuthCookieSha1 (line 15) | func AuthCookieSha1(user, home string) Auth {
  type authCookieSha1 (line 19) | type authCookieSha1 struct
    method FirstData (line 23) | func (a authCookieSha1) FirstData() ([]byte, []byte, AuthStatus) {
    method HandleData (line 29) | func (a authCookieSha1) HandleData(data []byte) ([]byte, AuthStatus) {
    method getCookie (line 65) | func (a authCookieSha1) getCookie(context, id []byte) []byte {
    method generateChallenge (line 90) | func (a authCookieSha1) generateChallenge() []byte {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/call.go
  type Call (line 8) | type Call struct
    method Store (line 30) | func (c *Call) Store(retvalues ...interface{}) error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn.go
  type Conn (line 31) | type Conn struct
    method BusObject (line 201) | func (conn *Conn) BusObject() BusObject {
    method Close (line 208) | func (conn *Conn) Close() error {
    method Eavesdrop (line 246) | func (conn *Conn) Eavesdrop(ch chan<- *Message) {
    method getSerial (line 253) | func (conn *Conn) getSerial() uint32 {
    method Hello (line 268) | func (conn *Conn) Hello() error {
    method inWorker (line 283) | func (conn *Conn) inWorker() {
    method handleSignal (line 392) | func (conn *Conn) handleSignal(msg *Message) {
    method Names (line 410) | func (conn *Conn) Names() []string {
    method Object (line 420) | func (conn *Conn) Object(dest string, path ObjectPath) BusObject {
    method outWorker (line 426) | func (conn *Conn) outWorker() {
    method Send (line 453) | func (conn *Conn) Send(msg *Message, ch chan *Call) *Call {
    method sendError (line 497) | func (conn *Conn) sendError(err error, dest string, serial uint32) {
    method sendReply (line 532) | func (conn *Conn) sendReply(dest string, serial uint32, values ...inte...
    method defaultSignalAction (line 552) | func (conn *Conn) defaultSignalAction(fn func(h *defaultSignalHandler,...
    method Signal (line 569) | func (conn *Conn) Signal(ch chan<- *Signal) {
    method RemoveSignal (line 574) | func (conn *Conn) RemoveSignal(ch chan<- *Signal) {
    method SupportsUnixFDs (line 582) | func (conn *Conn) SupportsUnixFDs() bool {
  function SessionBus (line 62) | func SessionBus() (conn *Conn, err error) {
  function getSessionBusAddress (line 89) | func getSessionBusAddress() (string, error) {
  function SessionBusPrivate (line 100) | func SessionBusPrivate() (*Conn, error) {
  function SessionBusPrivateHandler (line 110) | func SessionBusPrivateHandler(handler Handler, signalHandler SignalHandl...
  function SystemBus (line 120) | func SystemBus() (conn *Conn, err error) {
  function SystemBusPrivate (line 148) | func SystemBusPrivate() (*Conn, error) {
  function SystemBusPrivateHandler (line 153) | func SystemBusPrivateHandler(handler Handler, signalHandler SignalHandle...
  function Dial (line 158) | func Dial(address string) (*Conn, error) {
  function DialHandler (line 167) | func DialHandler(address string, handler Handler, signalHandler SignalHa...
  function NewConn (line 176) | func NewConn(conn io.ReadWriteCloser) (*Conn, error) {
  function NewConnHandler (line 181) | func NewConnHandler(conn io.ReadWriteCloser, handler Handler, signalHand...
  function newConn (line 186) | func newConn(tr transport, handler Handler, signalHandler SignalHandler)...
  type Error (line 587) | type Error struct
    method Error (line 596) | func (e Error) Error() string {
  function NewError (line 592) | func NewError(name string, body []interface{}) *Error {
  type Signal (line 608) | type Signal struct
  type transport (line 616) | type transport interface
  function getTransport (line 638) | func getTransport(address string) (transport, error) {
  function dereferenceAll (line 665) | func dereferenceAll(vs []interface{}) []interface{} {
  function getKey (line 675) | func getKey(s, key string) string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn_darwin.go
  constant defaultSystemBusAddress (line 10) | defaultSystemBusAddress = "unix:path=/opt/local/var/run/dbus/system_bus_...
  function getSessionBusPlatformAddress (line 12) | func getSessionBusPlatformAddress() (string, error) {
  function getSystemBusPlatformAddress (line 27) | func getSystemBusPlatformAddress() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/conn_other.go
  constant defaultSystemBusAddress (line 13) | defaultSystemBusAddress = "unix:path=/var/run/dbus/system_bus_socket"
  function getSessionBusPlatformAddress (line 15) | func getSessionBusPlatformAddress() (string, error) {
  function getSystemBusPlatformAddress (line 36) | func getSystemBusPlatformAddress() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/dbus.go
  type InvalidTypeError (line 35) | type InvalidTypeError struct
    method Error (line 39) | func (e InvalidTypeError) Error() string {
  function Store (line 47) | func Store(src []interface{}, dest ...interface{}) error {
  function storeInterfaces (line 60) | func storeInterfaces(src, dest interface{}) error {
  function store (line 64) | func store(dest, src reflect.Value) error {
  function storeBase (line 78) | func storeBase(dest, src reflect.Value) error {
  function setDest (line 82) | func setDest(dest, src reflect.Value) error {
  function kindsAreCompatible (line 100) | func kindsAreCompatible(dest, src reflect.Type) bool {
  function isConvertibleTo (line 111) | func isConvertibleTo(dest, src reflect.Type) bool {
  function storeMap (line 127) | func storeMap(dest, src reflect.Value) error {
  function storeMapIntoVariant (line 149) | func storeMapIntoVariant(dest, src reflect.Value) error {
  function storeMapIntoInterface (line 158) | func storeMapIntoInterface(dest, src reflect.Value) error {
  function storeMapIntoMap (line 175) | func storeMapIntoMap(dest, src reflect.Value) error {
  function storeSlice (line 192) | func storeSlice(dest, src reflect.Value) error {
  function storeStruct (line 216) | func storeStruct(dest, src reflect.Value) error {
  function storeSliceIntoVariant (line 243) | func storeSliceIntoVariant(dest, src reflect.Value) error {
  function storeSliceIntoInterface (line 252) | func storeSliceIntoInterface(dest, src reflect.Value) error {
  function storeSliceIntoSlice (line 269) | func storeSliceIntoSlice(dest, src reflect.Value) error {
  function getVariantValue (line 289) | func getVariantValue(in reflect.Value) reflect.Value {
  function isVariant (line 296) | func isVariant(t reflect.Type) bool {
  type ObjectPath (line 301) | type ObjectPath
    method IsValid (line 304) | func (o ObjectPath) IsValid() bool {
  type UnixFD (line 335) | type UnixFD
  type UnixFDIndex (line 338) | type UnixFDIndex
  function alignment (line 341) | func alignment(t reflect.Type) int {
  function isKeyType (line 368) | func isKeyType(t reflect.Type) bool {
  function isValidInterface (line 380) | func isValidInterface(s string) bool {
  function isValidMember (line 405) | func isValidMember(s string) bool {
  function isMemberChar (line 424) | func isMemberChar(c rune) bool {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/decoder.go
  type decoder (line 9) | type decoder struct
    method align (line 25) | func (dec *decoder) align(n int) {
    method binread (line 37) | func (dec *decoder) binread(v interface{}) {
    method Decode (line 43) | func (dec *decoder) Decode(sig Signature) (vs []interface{}, err error) {
    method decode (line 67) | func (dec *decoder) decode(s string, depth int) interface{} {
  function newDecoder (line 17) | func newDecoder(in io.Reader, order binary.ByteOrder) *decoder {
  type FormatError (line 224) | type FormatError
    method Error (line 226) | func (e FormatError) Error() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/default_handler.go
  function newIntrospectIntf (line 10) | func newIntrospectIntf(h *defaultHandler) *exportedIntf {
  function NewDefaultHandler (line 24) | func NewDefaultHandler() *defaultHandler {
  type defaultHandler (line 33) | type defaultHandler struct
    method PathExists (line 39) | func (h *defaultHandler) PathExists(path ObjectPath) bool {
    method introspectPath (line 44) | func (h *defaultHandler) introspectPath(path ObjectPath) string {
    method LookupObject (line 65) | func (h *defaultHandler) LookupObject(path ObjectPath) (ServerObject, ...
    method AddObject (line 102) | func (h *defaultHandler) AddObject(path ObjectPath, object *exportedOb...
    method DeleteObject (line 108) | func (h *defaultHandler) DeleteObject(path ObjectPath) {
  type exportedMethod (line 114) | type exportedMethod struct
    method Call (line 118) | func (m exportedMethod) Call(args ...interface{}) ([]interface{}, erro...
    method NumArguments (line 141) | func (m exportedMethod) NumArguments() int {
    method ArgumentValue (line 145) | func (m exportedMethod) ArgumentValue(i int) interface{} {
    method NumReturns (line 149) | func (m exportedMethod) NumReturns() int {
    method ReturnValue (line 153) | func (m exportedMethod) ReturnValue(i int) interface{} {
  function newExportedObject (line 157) | func newExportedObject() *exportedObj {
  type exportedObj (line 163) | type exportedObj struct
    method LookupInterface (line 167) | func (obj *exportedObj) LookupInterface(name string) (Interface, bool) {
    method AddInterface (line 175) | func (obj *exportedObj) AddInterface(name string, iface *exportedIntf) {
    method DeleteInterface (line 179) | func (obj *exportedObj) DeleteInterface(name string) {
    method LookupMethod (line 183) | func (obj *exportedObj) LookupMethod(name string) (Method, bool) {
    method isFallbackInterface (line 193) | func (obj *exportedObj) isFallbackInterface() bool {
  function newExportedIntf (line 197) | func newExportedIntf(methods map[string]Method, includeSubtree bool) *ex...
  type exportedIntf (line 204) | type exportedIntf struct
    method LookupMethod (line 211) | func (obj *exportedIntf) LookupMethod(name string) (Method, bool) {
    method isFallbackInterface (line 216) | func (obj *exportedIntf) isFallbackInterface() bool {
  function NewDefaultSignalHandler (line 223) | func NewDefaultSignalHandler() *defaultSignalHandler {
  function isDefaultSignalHandler (line 227) | func isDefaultSignalHandler(handler SignalHandler) bool {
  type defaultSignalHandler (line 232) | type defaultSignalHandler struct
    method DeliverSignal (line 238) | func (sh *defaultSignalHandler) DeliverSignal(intf, name string, signa...
    method Init (line 251) | func (sh *defaultSignalHandler) Init() error {
    method Terminate (line 258) | func (sh *defaultSignalHandler) Terminate() {
    method addSignal (line 268) | func (sh *defaultSignalHandler) addSignal(ch chan<- *Signal) {
    method removeSignal (line 278) | func (sh *defaultSignalHandler) removeSignal(ch chan<- *Signal) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/encoder.go
  type encoder (line 11) | type encoder struct
    method align (line 34) | func (enc *encoder) align(n int) {
    method padding (line 47) | func (enc *encoder) padding(offset, algn int) int {
    method binwrite (line 57) | func (enc *encoder) binwrite(v interface{}) {
    method Encode (line 65) | func (enc *encoder) Encode(vs ...interface{}) (err error) {
    method encode (line 77) | func (enc *encoder) encode(v reflect.Value, depth int) {
  function newEncoder (line 18) | func newEncoder(out io.Writer, order binary.ByteOrder) *encoder {
  function newEncoderAtOffset (line 25) | func newEncoderAtOffset(out io.Writer, offset int, order binary.ByteOrde...

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/export.go
  function MakeFailedError (line 29) | func MakeFailedError(err error) *Error {
  type Sender (line 38) | type Sender
  function computeMethodName (line 40) | func computeMethodName(name string, mapping map[string]string) string {
  function getMethods (line 48) | func getMethods(in interface{}, mapping map[string]string) map[string]re...
  function standardMethodArgumentDecode (line 72) | func standardMethodArgumentDecode(m Method, sender string, msg *Message,...
  method decodeArguments (line 100) | func (conn *Conn) decodeArguments(m Method, sender string, msg *Message)...
  method handleCall (line 109) | func (conn *Conn) handleCall(msg *Message) {
  method Emit (line 183) | func (conn *Conn) Emit(path ObjectPath, name string, values ...interface...
  method Export (line 247) | func (conn *Conn) Export(v interface{}, path ObjectPath, iface string) e...
  method ExportWithMap (line 256) | func (conn *Conn) ExportWithMap(v interface{}, mapping map[string]string...
  method ExportSubtree (line 270) | func (conn *Conn) ExportSubtree(v interface{}, path ObjectPath, iface st...
  method ExportSubtreeWithMap (line 279) | func (conn *Conn) ExportSubtreeWithMap(v interface{}, mapping map[string...
  method ExportMethodTable (line 293) | func (conn *Conn) ExportMethodTable(methods map[string]interface{}, path...
  method ExportSubtreeMethodTable (line 298) | func (conn *Conn) ExportSubtreeMethodTable(methods map[string]interface{...
  method exportMethodTable (line 302) | func (conn *Conn) exportMethodTable(methods map[string]interface{}, path...
  method unexport (line 320) | func (conn *Conn) unexport(h *defaultHandler, path ObjectPath, iface str...
  method export (line 332) | func (conn *Conn) export(methods map[string]reflect.Value, path ObjectPa...
  method ReleaseName (line 368) | func (conn *Conn) ReleaseName(name string) (ReleaseNameReply, error) {
  method RequestName (line 378) | func (conn *Conn) RequestName(name string, flags RequestNameFlags) (Requ...
  type ReleaseNameReply (line 388) | type ReleaseNameReply
  constant ReleaseNameReplyReleased (line 391) | ReleaseNameReplyReleased ReleaseNameReply = 1 + iota
  constant ReleaseNameReplyNonExistent (line 392) | ReleaseNameReplyNonExistent
  constant ReleaseNameReplyNotOwner (line 393) | ReleaseNameReplyNotOwner
  type RequestNameFlags (line 397) | type RequestNameFlags
  constant NameFlagAllowReplacement (line 400) | NameFlagAllowReplacement RequestNameFlags = 1 << iota
  constant NameFlagReplaceExisting (line 401) | NameFlagReplaceExisting
  constant NameFlagDoNotQueue (line 402) | NameFlagDoNotQueue
  type RequestNameReply (line 406) | type RequestNameReply
  constant RequestNameReplyPrimaryOwner (line 409) | RequestNameReplyPrimaryOwner RequestNameReply = 1 + iota
  constant RequestNameReplyInQueue (line 410) | RequestNameReplyInQueue
  constant RequestNameReplyExists (line 411) | RequestNameReplyExists
  constant RequestNameReplyAlreadyOwner (line 412) | RequestNameReplyAlreadyOwner

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/homedir.go
  function getHomeDir (line 13) | func getHomeDir() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/homedir_dynamic.go
  function lookupHomeDir (line 9) | func lookupHomeDir() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/homedir_static.go
  function lookupHomeDir (line 12) | func lookupHomeDir() string {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/message.go
  constant protoVersion (line 12) | protoVersion byte = 1
  type Flags (line 15) | type Flags
  constant FlagNoReplyExpected (line 21) | FlagNoReplyExpected Flags = 1 << iota
  constant FlagNoAutoStart (line 24) | FlagNoAutoStart
  constant FlagAllowInteractiveAuthorization (line 31) | FlagAllowInteractiveAuthorization
  type Type (line 35) | type Type
    method String (line 45) | func (t Type) String() string {
  constant TypeMethodCall (line 38) | TypeMethodCall Type = 1 + iota
  constant TypeMethodReply (line 39) | TypeMethodReply
  constant TypeError (line 40) | TypeError
  constant TypeSignal (line 41) | TypeSignal
  constant typeMax (line 42) | typeMax
  type HeaderField (line 61) | type HeaderField
  constant FieldPath (line 64) | FieldPath HeaderField = 1 + iota
  constant FieldInterface (line 65) | FieldInterface
  constant FieldMember (line 66) | FieldMember
  constant FieldErrorName (line 67) | FieldErrorName
  constant FieldReplySerial (line 68) | FieldReplySerial
  constant FieldDestination (line 69) | FieldDestination
  constant FieldSender (line 70) | FieldSender
  constant FieldSignature (line 71) | FieldSignature
  constant FieldUnixFDs (line 72) | FieldUnixFDs
  constant fieldMax (line 73) | fieldMax
  type InvalidMessageError (line 78) | type InvalidMessageError
    method Error (line 80) | func (e InvalidMessageError) Error() string {
  type Message (line 107) | type Message struct
    method EncodeTo (line 213) | func (msg *Message) EncodeTo(out io.Writer, order binary.ByteOrder) er...
    method IsValid (line 257) | func (msg *Message) IsValid() error {
    method Serial (line 307) | func (msg *Message) Serial() uint32 {
    method String (line 313) | func (msg *Message) String() string {
  type header (line 116) | type header struct
  function DecodeMessage (line 125) | func DecodeMessage(rd io.Reader) (msg *Message, err error) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/object.go
  type BusObject (line 10) | type BusObject interface
  type Object (line 19) | type Object struct
    method Call (line 26) | func (o *Object) Call(method string, flags Flags, args ...interface{})...
    method AddMatchSignal (line 32) | func (o *Object) AddMatchSignal(iface, member string) *Call {
    method Go (line 51) | func (o *Object) Go(method string, flags Flags, ch chan *Call, args .....
    method GetProperty (line 120) | func (o *Object) GetProperty(p string) (Variant, error) {
    method Destination (line 140) | func (o *Object) Destination() string {
    method Path (line 145) | func (o *Object) Path() ObjectPath {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/server_interfaces.go
  type Terminator (line 5) | type Terminator interface
  type Handler (line 14) | type Handler interface
  type ServerObject (line 26) | type ServerObject interface
  type Interface (line 34) | type Interface interface
  type Method (line 39) | type Method interface
  type ArgumentDecoder (line 64) | type ArgumentDecoder interface
  type SignalHandler (line 76) | type SignalHandler interface
  type DBusError (line 87) | type DBusError interface

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/sig.go
  type Signature (line 28) | type Signature struct
    method Empty (line 141) | func (s Signature) Empty() bool {
    method Single (line 146) | func (s Signature) Single() bool {
    method String (line 152) | func (s Signature) String() string {
  function SignatureOf (line 34) | func SignatureOf(vs ...interface{}) Signature {
  function SignatureOfType (line 44) | func SignatureOfType(t reflect.Type) Signature {
  function getSignature (line 49) | func getSignature(t reflect.Type) string {
  function ParseSignature (line 112) | func ParseSignature(s string) (sig Signature, err error) {
  function ParseSignatureMust (line 132) | func ParseSignatureMust(s string) Signature {
  type SignatureError (line 158) | type SignatureError struct
    method Error (line 163) | func (e SignatureError) Error() string {
  function validSingle (line 171) | func validSingle(s string, depth int) (err error, rem string) {
  function findMatching (line 221) | func findMatching(s string, left, right rune) int {
  function typeFor (line 238) | func typeFor(s string) (t reflect.Type) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_darwin.go
  method SendNullByte (line 3) | func (t *unixTransport) SendNullByte() error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_generic.go
  function detectEndianness (line 12) | func detectEndianness() binary.ByteOrder {
  function init (line 20) | func init() {
  type genericTransport (line 24) | type genericTransport struct
    method SendNullByte (line 28) | func (t genericTransport) SendNullByte() error {
    method SupportsUnixFDs (line 33) | func (t genericTransport) SupportsUnixFDs() bool {
    method EnableUnixFDs (line 37) | func (t genericTransport) EnableUnixFDs() {}
    method ReadMessage (line 39) | func (t genericTransport) ReadMessage() (*Message, error) {
    method SendMessage (line 43) | func (t genericTransport) SendMessage(msg *Message) error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_tcp.go
  function init (line 10) | func init() {
  function tcpFamily (line 14) | func tcpFamily(keys string) (string, error) {
  function newTcpTransport (line 27) | func newTcpTransport(keys string) (transport, error) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_unix.go
  type oobReader (line 14) | type oobReader struct
    method Read (line 20) | func (o *oobReader) Read(b []byte) (n int, err error) {
  type unixTransport (line 32) | type unixTransport struct
    method EnableUnixFDs (line 67) | func (t *unixTransport) EnableUnixFDs() {
    method ReadMessage (line 71) | func (t *unixTransport) ReadMessage() (*Message, error) {
    method SendMessage (line 163) | func (t *unixTransport) SendMessage(msg *Message) error {
    method SupportsUnixFDs (line 194) | func (t *unixTransport) SupportsUnixFDs() bool {
  function newUnixTransport (line 37) | func newUnixTransport(keys string) (transport, error) {
  function init (line 63) | func init() {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_dragonfly.go
  type Ucred (line 24) | type Ucred struct
  constant SizeofUcred (line 34) | SizeofUcred = C.sizeof_struct_ucred
  function cmsgAlignOf (line 38) | func cmsgAlignOf(salen int) int {
  function cmsgData (line 51) | func cmsgData(h *syscall.Cmsghdr) unsafe.Pointer {
  function UnixCredentials (line 59) | func UnixCredentials(ucred *Ucred) []byte {
  function ParseUnixCredentials (line 73) | func ParseUnixCredentials(m *syscall.SocketControlMessage) (*Ucred, erro...
  method SendNullByte (line 84) | func (t *unixTransport) SendNullByte() error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_freebsd.go
  type Ucred (line 26) | type Ucred struct
  constant SizeofUcred (line 36) | SizeofUcred = C.sizeof_struct_ucred
  function cmsgAlignOf (line 40) | func cmsgAlignOf(salen int) int {
  function cmsgData (line 47) | func cmsgData(h *syscall.Cmsghdr) unsafe.Pointer {
  function UnixCredentials (line 55) | func UnixCredentials(ucred *Ucred) []byte {
  function ParseUnixCredentials (line 69) | func ParseUnixCredentials(m *syscall.SocketControlMessage) (*Ucred, erro...
  method SendNullByte (line 80) | func (t *unixTransport) SendNullByte() error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_linux.go
  method SendNullByte (line 14) | func (t *unixTransport) SendNullByte() error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_openbsd.go
  method SendNullByte (line 5) | func (t *unixTransport) SendNullByte() error {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/variant.go
  type Variant (line 12) | type Variant struct
    method format (line 53) | func (v Variant) format() (string, bool) {
    method Signature (line 127) | func (v Variant) Signature() Signature {
    method String (line 133) | func (v Variant) String() string {
    method Value (line 142) | func (v Variant) Value() interface{} {
  function MakeVariant (line 19) | func MakeVariant(v interface{}) Variant {
  function MakeVariantWithSignature (line 24) | func MakeVariantWithSignature(v interface{}, s Signature) Variant {
  function ParseVariant (line 31) | func ParseVariant(s string, sig Signature) (Variant, error) {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/variant_lexer.go
  type varToken (line 12) | type varToken struct
  type varTokenType (line 17) | type varTokenType
  constant tokEOF (line 20) | tokEOF varTokenType = iota
  constant tokError (line 21) | tokError
  constant tokNumber (line 22) | tokNumber
  constant tokString (line 23) | tokString
  constant tokBool (line 24) | tokBool
  constant tokArrayStart (line 25) | tokArrayStart
  constant tokArrayEnd (line 26) | tokArrayEnd
  constant tokDictStart (line 27) | tokDictStart
  constant tokDictEnd (line 28) | tokDictEnd
  constant tokVariantStart (line 29) | tokVariantStart
  constant tokVariantEnd (line 30) | tokVariantEnd
  constant tokComma (line 31) | tokComma
  constant tokColon (line 32) | tokColon
  constant tokType (line 33) | tokType
  constant tokByteString (line 34) | tokByteString
  type varLexer (line 37) | type varLexer struct
    method accept (line 53) | func (l *varLexer) accept(valid string) bool {
    method backup (line 61) | func (l *varLexer) backup() {
    method emit (line 65) | func (l *varLexer) emit(t varTokenType) {
    method errorf (line 70) | func (l *varLexer) errorf(format string, v ...interface{}) lexState {
    method ignore (line 78) | func (l *varLexer) ignore() {
    method next (line 82) | func (l *varLexer) next() rune {
    method run (line 94) | func (l *varLexer) run() {
    method peek (line 100) | func (l *varLexer) peek() rune {
  type lexState (line 45) | type lexState
  function varLex (line 47) | func varLex(s string) []varToken {
  function varLexNormal (line 106) | func varLexNormal(l *varLexer) lexState {
  function varLexByteString (line 187) | func varLexByteString(l *varLexer) lexState {
  function varLexNumber (line 207) | func varLexNumber(l *varLexer) lexState {
  function varLexString (line 239) | func varLexString(l *varLexer) lexState {
  function varLexType (line 259) | func varLexType(l *varLexer) lexState {

FILE: src/ibus-teni/vendor/github.com/godbus/dbus/variant_parser.go
  type varParser (line 14) | type varParser struct
    method backup (line 19) | func (p *varParser) backup() {
    method next (line 23) | func (p *varParser) next() varToken {
  type varNode (line 32) | type varNode interface
  function varMakeNode (line 39) | func varMakeNode(p *varParser) (varNode, error) {
  type varTypeError (line 92) | type varTypeError struct
    method Error (line 97) | func (e varTypeError) Error() string {
  type sigSet (line 101) | type sigSet
    method Empty (line 103) | func (s sigSet) Empty() bool {
    method Intersect (line 107) | func (s sigSet) Intersect(s2 sigSet) sigSet {
    method Single (line 117) | func (s sigSet) Single() (Signature, bool) {
    method ToArray (line 126) | func (s sigSet) ToArray() sigSet {
  type numNode (line 134) | type numNode struct
    method Infer (line 151) | func (n numNode) Infer() (Signature, error) {
    method String (line 158) | func (n numNode) String() string {
    method Sigs (line 162) | func (n numNode) Sigs() sigSet {
    method Value (line 172) | func (n numNode) Value(sig Signature) (interface{}, error) {
  function varMakeNumNode (line 182) | func varMakeNumNode(tok varToken, sig Signature) (varNode, error) {
  function varNumAs (line 193) | func varNumAs(s string, sig Signature) (interface{}, error) {
  type stringNode (line 261) | type stringNode struct
    method Infer (line 273) | func (n stringNode) Infer() (Signature, error) {
    method String (line 277) | func (n stringNode) String() string {
    method Sigs (line 281) | func (n stringNode) Sigs() sigSet {
    method Value (line 288) | func (n stringNode) Value(sig Signature) (interface{}, error) {
  function varMakeStringNode (line 307) | func varMakeStringNode(tok varToken, sig Signature) (varNode, error) {
  function varParseString (line 331) | func varParseString(s string) (string, error) {
  type boolNode (line 393) | type boolNode
    method Infer (line 395) | func (boolNode) Infer() (Signature, error) {
    method String (line 399) | func (b boolNode) String() string {
    method Sigs (line 406) | func (boolNode) Sigs() sigSet {
    method Value (line 410) | func (b boolNode) Value(sig Signature) (interface{}, error) {
  type arrayNode (line 417) | type arrayNode struct
    method Infer (line 423) | func (n arrayNode) Infer() (Signature, error) {
    method String (line 434) | func (n arrayNode) String() string {
    method Sigs (line 445) | func (n arrayNode) Sigs() sigSet {
    method Value (line 449) | func (n arrayNode) Value(sig Signature) (interface{}, error) {
  function varMakeArrayNode (line 468) | func varMakeArrayNode(p *varParser, sig Signature) (varNode, error) {
  type variantNode (line 520) | type variantNode struct
    method Infer (line 528) | func (variantNode) Infer() (Signature, error) {
    method String (line 532) | func (n variantNode) String() string {
    method Sigs (line 536) | func (variantNode) Sigs() sigSet {
    method Value (line 540) | func (n variantNode) Value(sig Signature) (interface{}, error) {
  function varMakeVariantNode (line 555) | func varMakeVariantNode(p *varParser, sig Signature) (varNode, error) {
  type dictEntry (line 570) | type dictEntry struct
  type dictNode (line 574) | type dictNode struct
    method Infer (line 580) | func (n dictNode) Infer() (Signature, error) {
    method String (line 595) | func (n dictNode) String() string {
    method Sigs (line 606) | func (n dictNode) Sigs() sigSet {
    method Value (line 617) | func (n dictNode) Value(sig Signature) (interface{}, error) {
  function varMakeDictNode (line 643) | func varMakeDictNode(p *varParser, sig Signature) (varNode, error) {
  type byteStringNode (line 734) | type byteStringNode
    method Infer (line 740) | func (byteStringNode) Infer() (Signature, error) {
    method String (line 744) | func (b byteStringNode) String() string {
    method Sigs (line 748) | func (b byteStringNode) Sigs() sigSet {
    method Value (line 752) | func (b byteStringNode) Value(sig Signature) (interface{}, error) {
  function varParseByteString (line 759) | func varParseByteString(s string) ([]byte, error) {
  function varInfer (line 812) | func varInfer(n varNode) (Signature, error) {

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/bus.go
  type Bus (line 5) | type Bus struct
    method CallMethod (line 33) | func (bus *Bus) CallMethod(name string, flags dbus.Flags, args ...inte...
    method RequestName (line 37) | func (bus *Bus) RequestName(name string, flags dbus.RequestNameFlags) ...
    method RegisterComponent (line 41) | func (bus *Bus) RegisterComponent(component *Component) {
    method GetDbusConn (line 45) | func (bus *Bus) GetDbusConn() *dbus.Conn {
  function NewBus (line 11) | func NewBus() *Bus {

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/common.go
  constant BUS_DAEMON_NAME (line 14) | BUS_DAEMON_NAME     = "org.freedesktop.DBus"
  constant BUS_DAEMON_PATH (line 15) | BUS_DAEMON_PATH     = "/org/freedesktop/DBus"
  constant BUS_PROPERTIES_NAME (line 16) | BUS_PROPERTIES_NAME = "org.freedesktop.DBus.Properties"
  constant IBUS_IFACE_IBUS (line 18) | IBUS_IFACE_IBUS   = "org.freedesktop.IBus"
  constant IBUS_PATH_IBUS (line 19) | IBUS_PATH_IBUS    = "/org/freedesktop/IBus"
  constant IBUS_SERVICE_IBUS (line 20) | IBUS_SERVICE_IBUS = "org.freedesktop.IBus"
  constant IBUS_IFACE_PANEL (line 22) | IBUS_IFACE_PANEL          = "org.freedesktop.IBus.Panel"
  constant IBUS_IFACE_CONFIG (line 23) | IBUS_IFACE_CONFIG         = "org.freedesktop.IBus.Config"
  constant IBUS_IFACE_SERVICE (line 24) | IBUS_IFACE_SERVICE        = "org.freedesktop.IBus.Service"
  constant IBUS_IFACE_ENGINE (line 25) | IBUS_IFACE_ENGINE         = "org.freedesktop.IBus.Engine"
  constant IBUS_IFACE_ENGINE_FACTORY (line 26) | IBUS_IFACE_ENGINE_FACTORY = "org.freedesktop.IBus.Factory"
  constant IBUS_IFACE_INPUT_CONTEXT (line 27) | IBUS_IFACE_INPUT_CONTEXT  = "org.freedesktop.IBus.InputContext"
  constant IBUS_IFACE_NOTIFICATIONS (line 28) | IBUS_IFACE_NOTIFICATIONS  = "org.freedesktop.IBus.Notifications"
  constant IBUS_ENGINE_PREEDIT_CLEAR (line 30) | IBUS_ENGINE_PREEDIT_CLEAR  uint32 = 0
  constant IBUS_ENGINE_PREEDIT_COMMIT (line 31) | IBUS_ENGINE_PREEDIT_COMMIT uint32 = 1
  constant ORIENTATION_HORIZONTAL (line 33) | ORIENTATION_HORIZONTAL int32 = 0
  constant ORIENTATION_VERTICAL (line 34) | ORIENTATION_VERTICAL   int32 = 1
  constant ORIENTATION_SYSTEM (line 35) | ORIENTATION_SYSTEM     int32 = 2
  constant PROP_TYPE_NORMAL (line 37) | PROP_TYPE_NORMAL    uint32 = 0
  constant PROP_TYPE_TOGGLE (line 38) | PROP_TYPE_TOGGLE    uint32 = 1
  constant PROP_TYPE_RADIO (line 39) | PROP_TYPE_RADIO     uint32 = 2
  constant PROP_TYPE_MENU (line 40) | PROP_TYPE_MENU      uint32 = 3
  constant PROP_TYPE_SEPARATOR (line 41) | PROP_TYPE_SEPARATOR uint32 = 4
  constant PROP_STATE_UNCHECKED (line 43) | PROP_STATE_UNCHECKED    uint32 = 0
  constant PROP_STATE_CHECKED (line 44) | PROP_STATE_CHECKED      uint32 = 1
  constant PROP_STATE_INCONSISTENT (line 45) | PROP_STATE_INCONSISTENT uint32 = 2
  function GetAddress (line 48) | func GetAddress() string {
  function GetSocketPath (line 66) | func GetSocketPath() string {
  function GetLocalMachineId (line 90) | func GetLocalMachineId() string {
  function GetUserConfigDir (line 103) | func GetUserConfigDir() string {
  function GetUserAuth (line 111) | func GetUserAuth() []dbus.Auth {

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/component.go
  type Component (line 10) | type Component struct
    method AddEngine (line 42) | func (c *Component) AddEngine(e *EngineDesc) {
    method OutputXML (line 47) | func (c *Component) OutputXML(w io.Writer) {
  function NewComponent (line 27) | func NewComponent(name string, desc string, version string, license stri...

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/engine.go
  type Engine (line 7) | type Engine struct
    method emitSignal (line 22) | func (e *Engine) emitSignal(name string, values ...interface{}) {
    method GetAll (line 27) | func (e *Engine) GetAll(iface string) (map[string]dbus.Variant, *dbus....
    method ProcessKeyEvent (line 33) | func (e *Engine) ProcessKeyEvent(keyval uint32, keycode uint32, state ...
    method SetCursorLocation (line 38) | func (e *Engine) SetCursorLocation(x int32, y int32, w int32, h int32)...
    method SetSurroundingText (line 43) | func (e *Engine) SetSurroundingText(text dbus.Variant, cursor_index ui...
    method SetCapabilities (line 48) | func (e *Engine) SetCapabilities(cap uint32) *dbus.Error {
    method FocusIn (line 53) | func (e *Engine) FocusIn() *dbus.Error {
    method FocusOut (line 58) | func (e *Engine) FocusOut() *dbus.Error {
    method Reset (line 63) | func (e *Engine) Reset() *dbus.Error {
    method PageUp (line 68) | func (e *Engine) PageUp() *dbus.Error {
    method PageDown (line 73) | func (e *Engine) PageDown() *dbus.Error {
    method CursorUp (line 78) | func (e *Engine) CursorUp() *dbus.Error {
    method CursorDown (line 83) | func (e *Engine) CursorDown() *dbus.Error {
    method CandidateClicked (line 88) | func (e *Engine) CandidateClicked(index uint32, button uint32, state u...
    method Enable (line 93) | func (e *Engine) Enable() *dbus.Error {
    method Disable (line 98) | func (e *Engine) Disable() *dbus.Error {
    method PropertyActivate (line 103) | func (e *Engine) PropertyActivate(prop_name string, prop_state uint32)...
    method PropertyShow (line 108) | func (e *Engine) PropertyShow(prop_name string) *dbus.Error {
    method PropertyHide (line 113) | func (e *Engine) PropertyHide(prop_name string) *dbus.Error {
    method Destroy (line 118) | func (e *Engine) Destroy() *dbus.Error {
    method CommitText (line 126) | func (e *Engine) CommitText(text *Text) {
    method ForwardKeyEvent (line 131) | func (e *Engine) ForwardKeyEvent(keyval uint32, keycode uint32, state ...
    method UpdatePreeditText (line 136) | func (e *Engine) UpdatePreeditText(text *Text, cursor_pos uint32, visi...
    method UpdatePreeditTextWithMode (line 139) | func (e *Engine) UpdatePreeditTextWithMode(text *Text, cursor_pos uint...
    method ShowPreeditText (line 144) | func (e *Engine) ShowPreeditText() {
    method HidePreeditText (line 149) | func (e *Engine) HidePreeditText() {
    method UpdateAuxiliaryText (line 154) | func (e *Engine) UpdateAuxiliaryText(text *Text, visible bool) {
    method ShowAuxiliaryText (line 159) | func (e *Engine) ShowAuxiliaryText() {
    method HideAuxiliaryText (line 164) | func (e *Engine) HideAuxiliaryText() {
    method UpdateLookupTable (line 169) | func (e *Engine) UpdateLookupTable(lookup_table *LookupTable, visible ...
    method ShowLookupTable (line 174) | func (e *Engine) ShowLookupTable() {
    method HideLookupTable (line 179) | func (e *Engine) HideLookupTable() {
    method PageUpLookupTable (line 184) | func (e *Engine) PageUpLookupTable() {
    method PageDownLookupTable (line 189) | func (e *Engine) PageDownLookupTable() {
    method CursorUpLookupTable (line 194) | func (e *Engine) CursorUpLookupTable() {
    method CursorDownLookupTable (line 199) | func (e *Engine) CursorDownLookupTable() {
    method RegisterProperties (line 204) | func (e *Engine) RegisterProperties(props *PropList) {
    method UpdateProperty (line 209) | func (e *Engine) UpdateProperty(prop *Property) {
    method DeleteSurroundingText (line 214) | func (e *Engine) DeleteSurroundingText(offset_from_cursor int32, nchar...
    method RequireSurroundingText (line 219) | func (e *Engine) RequireSurroundingText() {
  function BaseEngine (line 12) | func BaseEngine(conn *dbus.Conn, objectPath dbus.ObjectPath) Engine {
  function PublishEngine (line 16) | func PublishEngine(conn *dbus.Conn, objectPath dbus.ObjectPath, userEngi...

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/engineDesc.go
  type EngineDesc (line 7) | type EngineDesc struct
  function TinyEngineDesc (line 28) | func TinyEngineDesc(name string, longname string, desc string, lang stri...
  function SmallEngineDesc (line 44) | func SmallEngineDesc(name string, longname string, desc string, lang str...
  function FullEngineDesc (line 54) | func FullEngineDesc(name string, longname string, desc string, lang stri...

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/factory.go
  type Factory (line 7) | type Factory struct
    method CreateEngine (line 33) | func (factory *Factory) CreateEngine(engineName string) (dbus.ObjectPa...
    method Destroy (line 39) | func (factory *Factory) Destroy() *dbus.Error {
  function NewFactory (line 12) | func NewFactory(conn *dbus.Conn, EngineCreator func(conn *dbus.Conn, eng...

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/lookupTable.go
  type LookupTable (line 7) | type LookupTable struct
    method AppendCandidate (line 31) | func (lt *LookupTable) AppendCandidate(text string) {
    method AppendLabel (line 36) | func (lt *LookupTable) AppendLabel(label string) {
  function NewLookupTable (line 19) | func NewLookupTable() *LookupTable {

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/property.go
  type PropList (line 7) | type PropList struct
  type Property (line 13) | type Property struct
  function NewProperty (line 28) | func NewProperty(key string, ptype uint32, label string, icon string, to...
  function NewPropertyWithChild (line 45) | func NewPropertyWithChild(key string, ptype uint32, label string, icon s...
  function NewPropList (line 52) | func NewPropList(propList ...*Property) *PropList {

FILE: src/ibus-teni/vendor/github.com/sarim/goibus/ibus/text.go
  type AttrList (line 7) | type AttrList struct
  type Text (line 13) | type Text struct
  function NewText (line 20) | func NewText(text string) *Text {

FILE: src/ibus-teni/version.go
  constant Version (line 23) | Version = "v1.5.3"

FILE: src/ibus-teni/x11.go
  constant MaxPropertyLen (line 65) | MaxPropertyLen = 128
  constant MaxCacheWM (line 66) | MaxCacheWM     = 16
  constant WM_CLASS (line 68) | WM_CLASS = "WM_CLASS"
  type CDisplay (line 71) | type CDisplay
  function init (line 75) | func init() {
  function x11GetUCharProperty (line 79) | func x11GetUCharProperty(display *C.Display, window C.Window, propName s...
  function x11GetStringProperty (line 96) | func x11GetStringProperty(display *C.Display, window C.Window, propName ...
  function x11OpenDisplay (line 106) | func x11OpenDisplay() *C.Display {
  function x11GetInputFocus (line 110) | func x11GetInputFocus(display *C.Display) C.Window {
  function x11GetParentWindow (line 118) | func x11GetParentWindow(display *C.Display, w C.Window) (rootWindow, par...
  function x11CloseDisplay (line 127) | func x11CloseDisplay(d *C.Display) {
  function x11GetFocusWindowClass (line 131) | func x11GetFocusWindowClass(display *C.Display) []string {

FILE: src/teni/teni.go
  constant MaxWordLength (line 29) | MaxWordLength = 15
  constant MaxStateStack (line 30) | MaxStateStack = 2
  type InputMethod (line 33) | type InputMethod
  constant IMTeni (line 36) | IMTeni    InputMethod = iota << 0
  constant IMVni (line 37) | IMVni     InputMethod = iota
  constant IMTelex (line 38) | IMTelex   InputMethod = iota
  constant IMTelexEx (line 39) | IMTelexEx InputMethod = iota
  type EngineState (line 42) | type EngineState struct
  type Engine (line 49) | type Engine struct
    method RawKeyLen (line 88) | func (pc *Engine) RawKeyLen() int {
    method ResultLen (line 92) | func (pc *Engine) ResultLen() uint32 {
    method Reset (line 100) | func (pc *Engine) Reset() {
    method LenStateBack (line 115) | func (pc *Engine) LenStateBack() int {
    method PushStateBack (line 119) | func (pc *Engine) PushStateBack() int {
    method PopStateBack (line 150) | func (pc *Engine) PopStateBack() int {
    method GetResult (line 169) | func (pc *Engine) GetResult() []rune {
    method GetResultStr (line 177) | func (pc *Engine) GetResultStr() string {
    method HasToneChar (line 181) | func (pc *Engine) HasToneChar() bool {
    method isCompleted (line 191) | func (pc *Engine) isCompleted() bool {
    method GetCommitResult (line 198) | func (pc *Engine) GetCommitResult() []rune {
    method GetCommitResultStr (line 206) | func (pc *Engine) GetCommitResultStr() string {
    method GetRawStr (line 214) | func (pc *Engine) GetRawStr() string {
    method GetRaw (line 218) | func (pc *Engine) GetRaw() []rune {
    method getCopyResult (line 229) | func (pc *Engine) getCopyResult() ([]rune, []rune) {
    method getCopyResultN (line 233) | func (pc *Engine) getCopyResultN(n int) ([]rune, []rune) {
    method Backspace (line 248) | func (pc *Engine) Backspace() {
    method AddStr (line 260) | func (pc *Engine) AddStr(s string) {
    method AddKey (line 266) | func (pc *Engine) AddKey(key rune) {
    method appendChar (line 346) | func (pc *Engine) appendChar(key rune, originalRunes []rune) *resultCa...
    method replaceStr (line 362) | func (pc *Engine) replaceStr(key rune, originalRunes []rune) *resultCa...
    method replaceChar (line 387) | func (pc *Engine) replaceChar(key rune, originalRunes []rune) *resultC...
    method changeChar (line 418) | func (pc *Engine) changeChar(key rune, originalRunes []rune) *resultCa...
    method revertChar (line 449) | func (pc *Engine) revertChar(key rune, originalRunes []rune) *resultCa...
    method trySwapTone (line 470) | func (pc *Engine) trySwapTone(originalCase *resultCase) *resultCase {
  type resultCase (line 56) | type resultCase struct
    method better (line 61) | func (pc *resultCase) better(pc2 *resultCase) bool {
  type resultCases (line 66) | type resultCases
    method Len (line 68) | func (p resultCases) Len() int { return len(p) }
    method Less (line 69) | func (p resultCases) Less(i, j int) bool {
    method Swap (line 72) | func (p resultCases) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
  function NewEngine (line 74) | func NewEngine() *Engine {
  function copyRunes (line 222) | func copyRunes(r []rune) []rune {

FILE: src/teni/teni_coverage_test.go
  function TestTeniCoverage (line 27) | func TestTeniCoverage(t *testing.T) {

FILE: src/teni/teni_type_rule_test.go
  constant testDataDir (line 33) | testDataDir           = "test-data"
  constant testDataSuffix (line 34) | testDataSuffix        = ".tdata"
  constant vniTestDataFileSign (line 35) | vniTestDataFileSign   = ".vni"
  constant telexTestDataFileSign (line 36) | telexTestDataFileSign = ".telexw"
  constant newTestDataFileSign (line 37) | newTestDataFileSign   = ".new"
  constant DictDir (line 41) | DictDir           = "dict"
  constant DictVietnameseCm (line 42) | DictVietnameseCm  = "dict/vietnamese.cm.dict"
  constant DictVietnameseSp (line 43) | DictVietnameseSp  = "dict/vietnamese.sp.dict"
  constant DictVietnameseStd (line 44) | DictVietnameseStd = "dict/vietnamese.std.dict"
  constant DictVietnameseNew (line 45) | DictVietnameseNew = "dict/vietnamese.new.dict"
  function fe (line 54) | func fe(err error) {
  function cdDictDir (line 60) | func cdDictDir() {
  function TestTeniTypeRule (line 82) | func TestTeniTypeRule(t *testing.T) {
  function readFileLines (line 140) | func readFileLines(f string) []string {

FILE: src/teni/typerule_change_char.go
  function InChangeCharMap (line 37) | func InChangeCharMap(c rune) bool {
  function InChangeCharMapEx (line 42) | func InChangeCharMapEx(c rune) bool {
  function SwitchCaplock (line 54) | func SwitchCaplock(keyVal uint32) uint32 {

FILE: src/teni/typerule_replace.go
  function joinMapCR (line 28) | func joinMapCR(maps ...map[rune]*CR) map[rune]*CR {
  function upFirstChar (line 39) | func upFirstChar(s string) string {
  function init (line 48) | func init() {

FILE: src/teni/typerule_replace_char.go
  type CR (line 23) | type CR struct

FILE: src/teni/typerule_replace_str.go
  type SR (line 23) | type SR struct

FILE: src/teni/typerule_replace_vni.go
  function addVniRule (line 23) | func addVniRule() {

FILE: src/teni/typerule_swap.go
  type BT (line 25) | type BT struct
  function init (line 107) | func init() {

FILE: src/teni/wordtrie.go
  constant FindResultNotMatch (line 34) | FindResultNotMatch = iota
  constant FindResultMatchPrefix (line 35) | FindResultMatchPrefix
  constant FindResultRevert (line 36) | FindResultRevert
  constant FindResultMatchFull (line 37) | FindResultMatchFull
  constant Consonant (line 39) | Consonant = "qwrtpsdfghjklzxcvbnmđQWRTPSDFGHJKLZXCVBNMĐ"
  function RemoveConsonant (line 91) | func RemoveConsonant(s string) string {
  function SplitConsonantVowel (line 104) | func SplitConsonantVowel(rs []rune) ([]rune, []rune) {
  type W (line 130) | type W struct
  function addTrie (line 137) | func addTrie(trie *W, s []rune, down bool) {
  function findWord (line 173) | func findWord(t *W, s []rune) (result uint8) {
  function findRootWord (line 194) | func findRootWord(s []rune) (result uint8) {
  function fileExist (line 198) | func fileExist(p string) bool {
  function InitWordTrie (line 203) | func InitWordTrie(forceSpell bool, dataFiles ...string) error {

FILE: test-data/test-data-gen.go
  constant dataDir (line 34) | dataDir    = "dict"
  constant dataSuffix (line 35) | dataSuffix = ".dict"
  constant outputDir (line 37) | outputDir    = "test-data"
  constant outputSuffix (line 38) | outputSuffix = ".tdata"
  function fe (line 52) | func fe(err error) {
  function main (line 58) | func main() {
  function readFileLines (line 74) | func readFileLines(f string) []string {
  function genTestData (line 81) | func genTestData(inputFileName string, lines []string) {
  function telex1 (line 100) | func telex1(line string) string {
  function telex2 (line 118) | func telex2(line string) string {
  function telex3 (line 143) | func telex3(line string) string {
  function telexw (line 173) | func telexw(line string) string {
  function vni1 (line 201) | func vni1(line string) string {
  function vni2 (line 219) | func vni2(line string) string {
  function vni3 (line 242) | func vni3(line string) string {
  type BT (line 268) | type BT struct
Condensed preview — 131 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,102K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1153,
    "preview": "---\nname: Báo lỗi\nabout: Tạo một báo lỗi\n\n---\n\n**Mô tả lỗi**\nMột mô tả ngắn gọn về lỗi đang xảy ra\n\n**Các bước tái hiện "
  },
  {
    "path": ".gitignore",
    "chars": 63,
    "preview": ".idea/\npkg/\n*_linux\n*.tar.gz\nibus-engine-*\nsrc/dict-gen/vendor/"
  },
  {
    "path": ".travis.yml",
    "chars": 112,
    "preview": "sudo: required\nlanguage: go\n\ninstall:\n  - make test\n  - make build\n  - bash deploy.bash\n  \nscript:\n  - echo END\n"
  },
  {
    "path": "GPLv3_vi.md",
    "chars": 444,
    "preview": "# Tóm tắt giấy phép GNU GPLv3\nGNU General Public License v3.0\n\n## Bạn được phép\n-   Tự do chạy chương trình cho bất cứ m"
  },
  {
    "path": "LICENSE",
    "chars": 35147,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "MAINTAINERS",
    "chars": 40,
    "preview": "Nguyen Cong Hoang <hoangnc.jp@gmail.com>"
  },
  {
    "path": "Makefile",
    "chars": 3337,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "PKGBUILD",
    "chars": 1203,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "README.md",
    "chars": 4445,
    "preview": "[IBus Teni - a Vietnamese Input Method Editor for IBus](https://github.com/teni-ime/ibus-teni)\n========================="
  },
  {
    "path": "debian/changelog",
    "chars": 3894,
    "preview": "ibus-teni (1.5.3-1) stable; urgency=low\n\n  * Release 1.5.3\n    - Build cho Ubuntu 20.04\n\n -- Nguyen Cong Hoang <hoangnc."
  },
  {
    "path": "debian/compat",
    "chars": 2,
    "preview": "10"
  },
  {
    "path": "debian/control",
    "chars": 1141,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "debian/rules",
    "chars": 799,
    "preview": "#!/usr/bin/make -f\n#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gm"
  },
  {
    "path": "debian/source/options",
    "chars": 208,
    "preview": "tar-ignore=.git\ntar-ignore=.idea\ntar-ignore=*.gz\ntar-ignore=debian/ibus-teni*\ntar-ignore=debian/.debhelper\ntar-ignore=de"
  },
  {
    "path": "deploy.bash",
    "chars": 1772,
    "preview": "#!/bin/bash\necho \"Check tag --------------------------------------------------------------------------------------------"
  },
  {
    "path": "dict/LICENSE",
    "chars": 2762,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n#\n# Teni-I"
  },
  {
    "path": "dict/vietnamese.cm.dict",
    "chars": 36264,
    "preview": "à\nả\nã\ná\nạ\nác\nạc\nácbon\nách\nạch\nácxtơ\nađai\nảh\nài\nải\nãi\nái\nại\nalô\nàm\nảm\nãm\nám\nạm\nàn\nản\nãn\nán\nạn\nàng\nảng\nãng\náng\nạng\nành\nảnh"
  },
  {
    "path": "dict/vietnamese.new.dict",
    "chars": 476,
    "preview": "choá\nchoè\nchoẻ\nchoé\nchoẹ\nchuỳ\nchuỷ\nchuý\ndoá\ndoạ\nđoá\nđoạ\ngoá\nhoà\nhoả\nhoã\nhoá\nhoạ\nhoè\nhoé\nhoẹ\nhuỷ\nhuý\nkhoà\nkhoả\nkhoã\nkhoá\n"
  },
  {
    "path": "dict/vietnamese.sp.dict",
    "chars": 1522,
    "preview": "amiđan\nanđt\natnđ\naxít\nbcđ\nbcđpctntư\nbcđqg\nbcđt\nbcđts\nbchtư\nbđ\nbđn\nbđs\nbđvn\nbêrê\nbgdđt\nbhalêê\nbhđc\nbioóc\nboóng\nbôxit\nbvđk"
  },
  {
    "path": "dict/vietnamese.std.dict",
    "chars": 476,
    "preview": "chóa\nchòe\nchỏe\nchóe\nchọe\nchùy\nchủy\nchúy\ndóa\ndọa\nđóa\nđọa\ngóa\nhòa\nhỏa\nhõa\nhóa\nhọa\nhòe\nhóe\nhọe\nhủy\nhúy\nkhòa\nkhỏa\nkhõa\nkhóa\n"
  },
  {
    "path": "except.tmpl.txt",
    "chars": 1753,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "ibus-teni.dsc",
    "chars": 1033,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "ibus-teni.spec",
    "chars": 4764,
    "preview": "#\n# Teni-IME - A Vietnamese Input method editor\n# Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n# This fil"
  },
  {
    "path": "src/dict-gen/Gopkg.toml",
    "chars": 731,
    "preview": "# Gopkg.toml example\n#\n# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md\n# for detailed Gopkg.toml"
  },
  {
    "path": "src/dict-gen/dump.go",
    "chars": 2224,
    "preview": "package main\n\nimport (\n\t\"html\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nconst (\n\ttopPage      "
  },
  {
    "path": "src/dict-gen/extract.go",
    "chars": 1359,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nconst vietBaseMarks = `\n áàảãạ\năắằẳẵặ\nâấầẩẫậ\n éèẻẽẹ\nêếềểễệ\n"
  },
  {
    "path": "src/dict-gen/main.go",
    "chars": 1590,
    "preview": "package main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"strings\"\n)\n\nvar (\n\tmapStdToneWord    = loadWord"
  },
  {
    "path": "src/dict-gen/vnsort.go",
    "chars": 174,
    "preview": "package main\n\nimport (\n\t\"golang.org/x/text/collate\"\n\t\"golang.org/x/text/language\"\n)\n\nfunc vnsort(a []string) {\n\tvnm := c"
  },
  {
    "path": "src/ibus-teni/cache-wm.go",
    "chars": 1701,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/config.go",
    "chars": 3051,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/debug.go",
    "chars": 1370,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/engine.go",
    "chars": 11748,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/except.go",
    "chars": 2070,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/ibus-const.go",
    "chars": 3576,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/main.go",
    "chars": 1898,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/mice.go",
    "chars": 1386,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/proc.go",
    "chars": 1437,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/prop.go",
    "chars": 8361,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/runes.go",
    "chars": 1366,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/.travis.yml",
    "chars": 503,
    "preview": "dist: precise\nlanguage: go\ngo_import_path: github.com/godbus/dbus\nsudo: true\n\ngo:\n  - 1.6.3\n  - 1.7.3\n  - tip\n\nenv:\n  gl"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/CONTRIBUTING.md",
    "chars": 1484,
    "preview": "# How to Contribute\n\n## Getting Started\n\n- Fork the repository on GitHub\n- Read the [README](README.markdown) for build "
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/LICENSE",
    "chars": 1328,
    "preview": "Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google\nAll rights reserved.\n\nRedistribution and use in so"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/MAINTAINERS",
    "chars": 143,
    "preview": "Brandon Philips <brandon@ifup.org> (@philips)\nBrian Waldon <brian@waldon.cc> (@bcwaldon)\nJohn Southworth <jsouthwo@broca"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/README.markdown",
    "chars": 1462,
    "preview": "[![Build Status](https://travis-ci.org/godbus/dbus.svg?branch=master)](https://travis-ci.org/godbus/dbus)\n\ndbus\n----\n\ndb"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/auth.go",
    "chars": 6805,
    "preview": "package dbus\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n)\n\n// AuthStatus represents the Status of an a"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/auth_external.go",
    "chars": 582,
    "preview": "package dbus\n\nimport (\n\t\"encoding/hex\"\n)\n\n// AuthExternal returns an Auth that authenticates as the given user with the\n"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/auth_sha1.go",
    "chars": 2444,
    "preview": "package dbus\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/sha1\"\n\t\"encoding/hex\"\n\t\"os\"\n)\n\n// AuthCookieSha1 return"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/call.go",
    "chars": 867,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n)\n\n// Call represents a pending or completed method call.\ntype Call struct {\n\tDestinati"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/conn.go",
    "chars": 18819,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\nvar (\n\tsystemBus     *Conn\n\tsystemBusLck  "
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/conn_darwin.go",
    "chars": 704,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nconst defaultSystemBusAddress = \"unix:path=/opt/local/var/ru"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/conn_other.go",
    "chars": 779,
    "preview": "// +build !darwin\n\npackage dbus\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n)\n\nconst defaultSystemBusAddress = "
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/dbus.go",
    "chars": 10696,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\nvar (\n\tbyteType        = reflect.TypeOf(byte(0))\n\tboolT"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/decoder.go",
    "chars": 5109,
    "preview": "package dbus\n\nimport (\n\t\"encoding/binary\"\n\t\"io\"\n\t\"reflect\"\n)\n\ntype decoder struct {\n\tin    io.Reader\n\torder binary.ByteO"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/default_handler.go",
    "chars": 6444,
    "preview": "package dbus\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\nfunc newIntrospectIntf(h *defaultHandler) *exportedIntf"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/doc.go",
    "chars": 2476,
    "preview": "/*\nPackage dbus implements bindings to the D-Bus message bus system.\n\nTo use the message bus API, you first need to conn"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/encoder.go",
    "chars": 5545,
    "preview": "package dbus\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"reflect\"\n)\n\n// An encoder encodes values to the D-Bus wire fo"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/export.go",
    "chars": 12945,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\nvar (\n\tErrMsgInvalidArg = Error{\n\t\t\"org.freedesktop.DBu"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/homedir.go",
    "chars": 325,
    "preview": "package dbus\n\nimport (\n\t\"os\"\n\t\"sync\"\n)\n\nvar (\n\thomeDir     string\n\thomeDirLock sync.Mutex\n)\n\nfunc getHomeDir() string {\n"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/homedir_dynamic.go",
    "chars": 171,
    "preview": "// +build !static_build\n\npackage dbus\n\nimport (\n\t\"os/user\"\n)\n\nfunc lookupHomeDir() string {\n\tu, err := user.Current()\n\ti"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/homedir_static.go",
    "chars": 617,
    "preview": "// +build static_build\n\npackage dbus\n\nimport (\n\t\"bufio\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nfunc lookupHomeDir() string {\n\tmy"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/message.go",
    "chars": 8977,
    "preview": "package dbus\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"reflect\"\n\t\"strconv\"\n)\n\nconst protoVersion byte = 1\n"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/object.go",
    "chars": 4021,
    "preview": "package dbus\n\nimport (\n\t\"errors\"\n\t\"strings\"\n)\n\n// BusObject is the interface of a remote object on which methods can be\n"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/server_interfaces.go",
    "chars": 3361,
    "preview": "package dbus\n\n// Terminator allows a handler to implement a shutdown mechanism that\n// is called when the connection ter"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/sig.go",
    "chars": 5985,
    "preview": "package dbus\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\nvar sigToType = map[byte]reflect.Type{\n\t'y': byteType,\n\t'b': bool"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_darwin.go",
    "chars": 105,
    "preview": "package dbus\n\nfunc (t *unixTransport) SendNullByte() error {\n\t_, err := t.Write([]byte{0})\n\treturn err\n}\n"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_generic.go",
    "chars": 907,
    "preview": "package dbus\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"unsafe\"\n)\n\nvar nativeEndian binary.ByteOrder\n\nfunc detectEnd"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_tcp.go",
    "chars": 816,
    "preview": "//+build !windows\n\npackage dbus\n\nimport (\n\t\"errors\"\n\t\"net\"\n)\n\nfunc init() {\n\ttransports[\"tcp\"] = newTcpTransport\n}\n\nfunc"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_unix.go",
    "chars": 4965,
    "preview": "//+build !windows,!solaris\n\npackage dbus\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n\t\"syscall\"\n)\n\ntype"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_dragonfly.go",
    "chars": 2814,
    "preview": "// The UnixCredentials system call is currently only implemented on Linux\n// http://golang.org/src/pkg/syscall/sockcmsg_"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_freebsd.go",
    "chars": 2589,
    "preview": "// The UnixCredentials system call is currently only implemented on Linux\n// http://golang.org/src/pkg/syscall/sockcmsg_"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_linux.go",
    "chars": 637,
    "preview": "// The UnixCredentials system call is currently only implemented on Linux\n// http://golang.org/src/pkg/syscall/sockcmsg_"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/transport_unixcred_openbsd.go",
    "chars": 222,
    "preview": "package dbus\n\nimport \"io\"\n\nfunc (t *unixTransport) SendNullByte() error {\n\tn, _, err := t.UnixConn.WriteMsgUnix([]byte{0"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/variant.go",
    "chars": 3476,
    "preview": "package dbus\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n)\n\n// Variant represents the D-Bus variant type.\nty"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/variant_lexer.go",
    "chars": 4864,
    "preview": "package dbus\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\n// Heavily inspired by the lexer from text/templa"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/godbus/dbus/variant_parser.go",
    "chars": 15692,
    "preview": "package dbus\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\ntype varParse"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/README.md",
    "chars": 4398,
    "preview": "goibus - golang implementation of libibus\n==\n\ngoibus implements the libibus bindings in golang. goibus can be used to cr"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/bus.go",
    "chars": 1114,
    "preview": "package ibus\n\nimport \"github.com/godbus/dbus\"\n\ntype Bus struct {\n\tdbusConn   *dbus.Conn\n\tdbusObject dbus.BusObject\n\tibus"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/common.go",
    "chars": 2895,
    "preview": "package ibus\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/godbus/dbus\"\n)\n\nconst (\n\tBUS_DAEMON"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/component.go",
    "chars": 1645,
    "preview": "package ibus\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"github.com/godbus/dbus\"\n\t\"io\"\n)\n\ntype Component struct {\n\tXMLName       "
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/engine.go",
    "chars": 5178,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype Engine struct {\n\tconn       *dbus.Conn\n\tobjectPath dbus.ObjectP"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/engineDesc.go",
    "chars": 2409,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype EngineDesc struct {\n\tName          string                  `xml"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/factory.go",
    "chars": 1254,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype Factory struct {\n\tconn          *dbus.Conn\n\tEngineCreator func("
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/lookupTable.go",
    "chars": 790,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype LookupTable struct {\n\tName          string\n\tAttachments   map[s"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/property.go",
    "chars": 1468,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype PropList struct {\n\tName         string\n\tAttachments  map[string"
  },
  {
    "path": "src/ibus-teni/vendor/github.com/sarim/goibus/ibus/text.go",
    "chars": 483,
    "preview": "package ibus\n\nimport (\n\t\"github.com/godbus/dbus\"\n)\n\ntype AttrList struct {\n\tName        string\n\tAttachments map[string]d"
  },
  {
    "path": "src/ibus-teni/version.go",
    "chars": 832,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/ibus-teni/x11.go",
    "chars": 3560,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/teni.go",
    "chars": 12365,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/teni_coverage_test.go",
    "chars": 2638,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/teni_type_rule_test.go",
    "chars": 3396,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/tone_charset.go",
    "chars": 2451,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_change_char.go",
    "chars": 1356,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_downlvl.go",
    "chars": 2026,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_replace.go",
    "chars": 2270,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_replace_char.go",
    "chars": 9252,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_replace_str.go",
    "chars": 1484,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_replace_vni.go",
    "chars": 2102,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/typerule_swap.go",
    "chars": 2369,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "src/teni/wordtrie.go",
    "chars": 4274,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "teni.xml",
    "chars": 1804,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Teni-IME - A Vietnamese Input method editor\n  ~ Copyright (C) 2018 Nguye"
  },
  {
    "path": "test-data/LICENSE",
    "chars": 776,
    "preview": "Teni-IME - A Vietnamese Input method editor\nCopyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\nThis file and al"
  },
  {
    "path": "test-data/nodict.tdata",
    "chars": 181,
    "preview": "truow truoww\nTRUOW TRUOWW\ndisabled disabled\nDISABLED DISABLED\ntext text\nTEXT TEXT\nraise raise\nraise raisse\nhuaw huaww\nho"
  },
  {
    "path": "test-data/nodict.telexw.tdata",
    "chars": 111,
    "preview": "w ww\nweb web\nwww wwww\n[]  [[]\n{} {{}\nhuaw huaww\nhow howw\nhuw huww\npowerpoint powerpoint\npowerpoint powwerpoint\n"
  },
  {
    "path": "test-data/test-data-gen.go",
    "chars": 8305,
    "preview": "/*\n * Teni-IME - A Vietnamese Input method editor\n * Copyright (C) 2018 Nguyen Cong Hoang <hoangnc.jp@gmail.com>\n * This"
  },
  {
    "path": "test-data/vietnamese.cm.dict.telex1.tdata",
    "chars": 81386,
    "preview": "à af\nả ar\nã ax\ná as\nạ aj\nác asc\nạc ajc\nácbon ascbon\nách asch\nạch ajch\nácxtơ ascxtow\nảh arh\nài afi\nải ari\nãi axi\nái asi\nạ"
  },
  {
    "path": "test-data/vietnamese.cm.dict.telex2.tdata",
    "chars": 81132,
    "preview": "à af\nả ar\nã ax\ná as\nạ aj\nác acs\nạc acj\nácbon acbons\nách achs\nạch achj\nácxtơ acxtosw\nảh ahr\nài aif\nải air\nãi aix\nái ais\nạ"
  },
  {
    "path": "test-data/vietnamese.cm.dict.telex3.tdata",
    "chars": 81132,
    "preview": "à af\nả ar\nã ax\ná as\nạ aj\nác acs\nạc acj\nácbon acbons\nách achs\nạch achj\nácxtơ acxtosw\nảh ahr\nài aif\nải air\nãi aix\nái ais\nạ"
  },
  {
    "path": "test-data/vietnamese.cm.dict.telexw.tdata",
    "chars": 11574,
    "preview": "ácxtơ ascxt[\nbayơ bay[\nbơ b[\nbờ b[f\nbở b[r\nbỡ b[x\nbớ b[s\nbợ b[j\nbớc b[sc\nbơi b[i\nbời b[fi\nbởi b[ri\nbỡi b[xi\nbới b[si\nbơm"
  },
  {
    "path": "test-data/vietnamese.cm.dict.vni1.tdata",
    "chars": 81386,
    "preview": "à a2\nả a3\nã a4\ná a1\nạ a5\nác a1c\nạc a5c\nácbon a1cbon\nách a1ch\nạch a5ch\nácxtơ a1cxto7\nảh a3h\nài a2i\nải a3i\nãi a4i\nái a1i\nạ"
  },
  {
    "path": "test-data/vietnamese.cm.dict.vni2.fix.tdata",
    "chars": 81115,
    "preview": "à a2\nả a3\nã a4\ná a1\nạ a5\nác ac1\nạc ac5\nácbon acbon1\nách ach1\nạch ach5\nácxtơ acxto17\nảh ah3\nài ai2\nải ai3\nãi ai4\nái ai1\nạ"
  },
  {
    "path": "test-data/vietnamese.cm.dict.vni3.tdata",
    "chars": 81132,
    "preview": "à a2\nả a3\nã a4\ná a1\nạ a5\nác ac1\nạc ac5\nácbon acbon1\nách ach1\nạch ach5\nácxtơ acxto17\nảh ah3\nài ai2\nải ai3\nãi ai4\nái ai1\nạ"
  },
  {
    "path": "test-data/vietnamese.new.dict.telex1.tdata",
    "chars": 1068,
    "preview": "choá choas\nchoè choef\nchoẻ choer\nchoé choes\nchoẹ choej\nchuỳ chuyf\nchuỷ chuyr\nchuý chuys\ndoá doas\ndoạ doaj\nđoá ddoas\nđoạ "
  },
  {
    "path": "test-data/vietnamese.new.dict.telex2.tdata",
    "chars": 1068,
    "preview": "choá choas\nchoè choef\nchoẻ choer\nchoé choes\nchoẹ choej\nchuỳ chuyf\nchuỷ chuyr\nchuý chuys\ndoá doas\ndoạ doaj\nđoá doads\nđoạ "
  },
  {
    "path": "test-data/vietnamese.new.dict.telex3.tdata",
    "chars": 1068,
    "preview": "choá choas\nchoè choef\nchoẻ choer\nchoé choes\nchoẹ choej\nchuỳ chuyf\nchuỷ chuyr\nchuý chuys\ndoá doas\ndoạ doaj\nđoá doads\nđoạ "
  },
  {
    "path": "test-data/vietnamese.new.dict.vni1.tdata",
    "chars": 1068,
    "preview": "choá choa1\nchoè choe2\nchoẻ choe3\nchoé choe1\nchoẹ choe5\nchuỳ chuy2\nchuỷ chuy3\nchuý chuy1\ndoá doa1\ndoạ doa5\nđoá d9oa1\nđoạ "
  },
  {
    "path": "test-data/vietnamese.new.dict.vni2.tdata",
    "chars": 1068,
    "preview": "choá choa1\nchoè choe2\nchoẻ choe3\nchoé choe1\nchoẹ choe5\nchuỳ chuy2\nchuỷ chuy3\nchuý chuy1\ndoá doa1\ndoạ doa5\nđoá doa91\nđoạ "
  },
  {
    "path": "test-data/vietnamese.new.dict.vni3.tdata",
    "chars": 1068,
    "preview": "choá choa1\nchoè choe2\nchoẻ choe3\nchoé choe1\nchoẹ choe5\nchuỳ chuy2\nchuỷ chuy3\nchuý chuy1\ndoá doa1\ndoạ doa5\nđoá doa91\nđoạ "
  },
  {
    "path": "test-data/vietnamese.sp.dict.telex1.fix.tdata",
    "chars": 3296,
    "preview": "amiđan amiddan\nanđt anddt\natnđ atndd\naxít axxist\nbcđ bcdd\nbcđpctntư bcddpctntuw\nbcđqg bcddqg\nbcđt bcddt\nbcđts bcddts\nbch"
  },
  {
    "path": "test-data/vietnamese.sp.dict.telex2.fix.tdata",
    "chars": 3294,
    "preview": "amiđan amidand\nanđt andtd\natnđ atndd\naxít axits\nbcđ bcdd\nbcđpctntư bcdpctntudw\nbcđqg bcdqgd\nbcđt bcdtd\nbcđts bcdtsd\nbcht"
  },
  {
    "path": "test-data/vietnamese.sp.dict.telex3.fix.tdata",
    "chars": 3324,
    "preview": "amiđan amidand\nanđt andtd\natnđ atndd\naxít axits\nbcđ bcdd\nbcđpctntư bcdpctntudw\nbcđqg bcdqgd\nbcđt bcdtd\nbcđts bcdtsd\nbcht"
  },
  {
    "path": "test-data/vietnamese.sp.dict.telexw.fix.tdata",
    "chars": 143,
    "preview": "bcđpctntư bcddpctnt]\nbchtư bcht]\nchơro ch[rro\nđvưt ddv]t\ngcnqsdđơ gcnqsddd[\ngcnqshnơ gcnqshn[\nnơron n[rron\nnsưt ns]t\npcl"
  },
  {
    "path": "test-data/vietnamese.sp.dict.vni1.tdata",
    "chars": 3309,
    "preview": "amiđan amid9an\nanđt and9t\natnđ atnd9\naxít axi1t\nbcđ bcd9\nbcđpctntư bcd9pctntu7\nbcđqg bcd9qg\nbcđt bcd9t\nbcđts bcd9ts\nbcht"
  },
  {
    "path": "test-data/vietnamese.sp.dict.vni2.tdata",
    "chars": 3296,
    "preview": "amiđan amidan9\nanđt andt9\natnđ atnd9\naxít axit1\nbcđ bcd9\nbcđpctntư bcdpctntu97\nbcđqg bcdqg9\nbcđt bcdt9\nbcđts bcdts9\nbcht"
  },
  {
    "path": "test-data/vietnamese.sp.dict.vni3.tdata",
    "chars": 3309,
    "preview": "amiđan amidan9\nanđt andt9\natnđ atnd9\naxít axit1\nbcđ bcd9\nbcđpctntư bcdpctntu97\nbcđqg bcdqg9\nbcđt bcdt9\nbcđts bcdts9\nbcht"
  },
  {
    "path": "test-data/vietnamese.std.dict.telex1.tdata",
    "chars": 1068,
    "preview": "chóa chosa\nchòe chofe\nchỏe chore\nchóe chose\nchọe choje\nchùy chufy\nchủy chury\nchúy chusy\ndóa dosa\ndọa doja\nđóa ddosa\nđọa "
  },
  {
    "path": "test-data/vietnamese.std.dict.telex2.tdata",
    "chars": 1068,
    "preview": "chóa choas\nchòe choef\nchỏe choer\nchóe choes\nchọe choej\nchùy chuyf\nchủy chuyr\nchúy chuys\ndóa doas\ndọa doaj\nđóa doads\nđọa "
  },
  {
    "path": "test-data/vietnamese.std.dict.telex3.tdata",
    "chars": 1068,
    "preview": "chóa choas\nchòe choef\nchỏe choer\nchóe choes\nchọe choej\nchùy chuyf\nchủy chuyr\nchúy chuys\ndóa doas\ndọa doaj\nđóa doads\nđọa "
  },
  {
    "path": "test-data/vietnamese.std.dict.vni1.tdata",
    "chars": 1068,
    "preview": "chóa cho1a\nchòe cho2e\nchỏe cho3e\nchóe cho1e\nchọe cho5e\nchùy chu2y\nchủy chu3y\nchúy chu1y\ndóa do1a\ndọa do5a\nđóa d9o1a\nđọa "
  },
  {
    "path": "test-data/vietnamese.std.dict.vni2.tdata",
    "chars": 1068,
    "preview": "chóa choa1\nchòe choe2\nchỏe choe3\nchóe choe1\nchọe choe5\nchùy chuy2\nchủy chuy3\nchúy chuy1\ndóa doa1\ndọa doa5\nđóa doa91\nđọa "
  },
  {
    "path": "test-data/vietnamese.std.dict.vni3.tdata",
    "chars": 1068,
    "preview": "chóa choa1\nchòe choe2\nchỏe choe3\nchóe choe1\nchọe choe5\nchùy chuy2\nchủy chuy3\nchúy chuy1\ndóa doa1\ndọa doa5\nđóa doa91\nđọa "
  },
  {
    "path": "wm.bash",
    "chars": 431,
    "preview": "#!/bin/bash\n\nACTIVE_WINDOW=\"\"\n\nwhile true\ndo\n    sleep 0.5\n\n    NEW_ACTIVE_WINDOW=$(xprop -root 32x '\\t$0' _NET_ACTIVE_W"
  }
]

About this extraction

This page contains the full source code of the teni-ime/ibus-teni GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 131 files (880.7 KB), approximately 423.2k tokens, and a symbol index with 708 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!