+1 it works really well in StateFun for quite some time.

On Thursday, December 17, 2020, Wei Zhong <weizhong0...@gmail.com> wrote:

> +1 for the coding style automation. Thanks for driving this!
>
> Best,
> Wei
>
> > 在 2020年12月17日,10:10,Xingbo Huang <hxbks...@gmail.com> 写道:
> >
> > +1 asap. Spotless can greatly help us save the time of fixing checkstyle
> > errors.
> >
> > Best,
> > Xingbo
> >
> > Kostas Kloudas <kklou...@gmail.com> 于2020年12月17日周四 上午4:14写道:
> >
> >> +1 asap from my side as well.
> >>
> >> On Wed, Dec 16, 2020 at 8:04 PM Arvid Heise <ar...@ververica.com>
> wrote:
> >>>
> >>> +1 asap.
> >>>
> >>> On Wed, Dec 16, 2020 at 7:44 PM Robert Metzger <rmetz...@apache.org>
> >> wrote:
> >>>
> >>>> +1
> >>>>
> >>>> Thanks for driving this.
> >>>>
> >>>> On Wed, Dec 16, 2020 at 7:33 PM Chesnay Schepler <ches...@apache.org>
> >>>> wrote:
> >>>>
> >>>>> +1 to set this up ASAP. Now's a good time to (finally) finalize this
> >>>>> effort with a new release cycle having started and
> >> christmas/vacations
> >>>>> being around the corner.
> >>>>>
> >>>>> On 12/16/2020 7:20 PM, Aljoscha Krettek wrote:
> >>>>>> Let's try and conclude this discussion! I've prepared a PoC that
> >> uses
> >>>>>> Spotless with google-java-format to do the formatting:
> >>>>>> https://github.com/aljoscha/flink/commits/flink-xxx-spotless
> >>>>>>
> >>>>>> To summarize from earlier discussion, the main benefits are:
> >>>>>> - no more worrying about code style, both as reviewer and
> >> implementer
> >>>>>> - everyone can configure their IDE to auto-format, there will
> >> never
> >>>>>> be unrelated formatting changes
> >>>>>>
> >>>>>> Also, this uses git's blame.ignoreRevsFile to add a file that tells
> >>>>>> git blame/IntelliJ to ignore the refactoring commit. However, you
> >> need
> >>>>>> to manually configure your git for that using:
> >>>>>>
> >>>>>> $ git config blame.ignoreRevsFile .git-blame-ignore-revs
> >>>>>>
> >>>>>> You can check out the PoC, look at the code in an IDE, play around
> >>>>>> with blame/annotations.
> >>>>>>
> >>>>>> By the way, the coding style is not configurable, it’s the Google
> >> Java
> >>>>>> Style, wich uses spaces for indentation. In an IDE or on github the
> >>>>>> code looks barely different from the previous formatting at a first
> >>>>>> glance.
> >>>>>>
> >>>>>> For IDE setup, I will add a guide in the README but it boils down
> >> to:
> >>>>>>
> >>>>>> - install the google-java-format plugin, enable it
> >>>>>> - install the Save Actions plugin, enable "Optimize Imports" and
> >>>>>> "Reformat File"
> >>>>>>
> >>>>>> With this, every time you save, formatting will be applied
> >>>>>> automatically. You will never see formatting complaints from CI
> >>>>>> (except for cases where you break semantical checkstyle rules,
> >> such as
> >>>>>> using certain imports that we don't allow.).
> >>>>>>
> >>>>>> What do you think?
> >>>>>>
> >>>>>> Best,
> >>>>>> Aljoscha
> >>>>>>
> >>>>>> On 19.10.20 12:36, Aljoscha Krettek wrote:
> >>>>>>> I don't like checkstyle because it cannot be easily applied from
> >> the
> >>>>>>> commandline. I'm happy to learn otherwise, though. And I'd also be
> >>>>>>> very happy about alternative suggestions that can do that.
> >>>>>>>
> >>>>>>> Right now, I think Spotless is the most straightforward tool for
> >>>>>>> that. Also I don't care so much about what style we choose in the
> >>>>>>> end. (If we choose one). My main motivation is that we have a
> >> common,
> >>>>>>> strict style that can easily applied via tooling so that we no
> >> longer
> >>>>>>> need to comment on coding style in PRs.
> >>>>>>>
> >>>>>>> Aljoscha
> >>>>>>>
> >>>>>>> On 09.10.20 11:11, tison wrote:
> >>>>>>>> +1 on locking on one codestyle and I think that is what current
> >>>>>>>> checkstyle
> >>>>>>>> rules serving.
> >>>>>>>>
> >>>>>>>> For automatic applying part, we suggest developing by IDEA and
> >> with
> >>>>>>>> Checkstyle Plugin on IDEA applying checkstyle suggestion is also
> >>>>>>>> automatic.
> >>>>>>>>
> >>>>>>>> One short coming for spotless is that we can hardly adjust rules
> >> if
> >>>> the
> >>>>>>>> project has its own issues to overcome. IIRC only several
> >>>>>>>> pre-defined rules
> >>>>>>>> and a clumsy general regex substitution rule can be used.
> >>>>>>>>
> >>>>>>>> FYI my team started with spotless but ended up with checkstyle
> >> with
> >>>> few
> >>>>>>>> rules and Checkstyle Plugin for automation.
> >>>>>>>>
> >>>>>>>> Codestyle, in another perspective, is part of cognition of
> >> developers
> >>>>>>>> working in project, not something we just apply before pull
> >> request.
> >>>> No
> >>>>>>>> matter how much automation introduced, most of developers will
> >>>> converge
> >>>>>>>> working with the configured codestyle.
> >>>>>>>>
> >>>>>>>> Best,
> >>>>>>>> tison.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>> Kostas Kloudas <kklou...@gmail.com> 于2020年10月7日周三 下午6:37写道:
> >>>>>>>>
> >>>>>>>>> Hi all,
> >>>>>>>>>
> >>>>>>>>> +1 for enforcing "a" codestyle using "a" tool.
> >>>>>>>>>
> >>>>>>>>> As the project grows both in terms of LOCs and contributors,
> >> this
> >>>>>>>>> becomes more and more important as it eliminates some potential
> >>>> points
> >>>>>>>>> of friction without any additional effort.
> >>>>>>>>>
> >>>>>>>>> From the discussion, I am leaning towards having a single
> >> commit
> >>>> with
> >>>>>>>>> all the codestyle-related changes. This will avoid sprinkling
> >>>>>>>>> refactoring commits all over the place for the next year or
> >> more.
> >>>> But
> >>>>>>>>> if this is the price to pay for having consensus on a tool,
> >> then I
> >>>> am
> >>>>>>>>> ok with gradual implementation. I believe that the value added
> >> by
> >>>>>>>>> having an automated process of enforcing a codestyle exceeds the
> >>>> cost
> >>>>>>>>> of the nuisance of gradual refactoring.
> >>>>>>>>>
> >>>>>>>>> As for the actual format, I like the google-java-format but
> >> again,
> >>>> if
> >>>>>>>>> the community agrees on a different one I would not oppose that
> >> (as
> >>>>>>>>> long as it does not use the same amount of indentation for
> >> method
> >>>> args
> >>>>>>>>> and method body :P).
> >>>>>>>>>
> >>>>>>>>> Cheers,
> >>>>>>>>> Kostas
> >>>>>>>>>
> >>>>>>>>> On Wed, Oct 7, 2020 at 10:26 AM Chesnay Schepler <
> >>>> ches...@apache.org>
> >>>>>>>>> wrote:
> >>>>>>>>>>
> >>>>>>>>>> To me, ratchet seems to combine the worst aspects of both
> >>>> approaches.
> >>>>>>>>>> You get disruptive changes, but only in singular files,
> >>>>>>>>>> for something mundane as a typo fix or import change, which
> >> would
> >>>> be
> >>>>>>>>>> annoying to keep separate from the actual functional changes
> >> in a
> >>>> PR.
> >>>>>>>>>>
> >>>>>>>>>> On 10/7/2020 10:04 AM, Matthias Pohl wrote:
> >>>>>>>>>>> I find the ratchet feature you're suggesting interesting. But
> >>>> Arvid
> >>>>>>>>> has a
> >>>>>>>>>>> point referring to the blog post about ignoring revisions in
> >> git
> >>>>>>>>>>> blame
> >>>>>>>>> [1].
> >>>>>>>>>>> Adding the configuration file for commits to ignore revs as
> >>>> proposed
> >>>>>>>>> in the
> >>>>>>>>>>> blog post makes it even easier. One problem I see is that
> >> this is
> >>>>>>>>>>> not
> >>>>>>>>>>> supported by Github (yet?) [2] as mentioned in [1].
> >>>>>>>>>>>
> >>>>>>>>>>> Considering all that I prefer applying the code style in one
> >> go. I
> >>>>>>>>> have no
> >>>>>>>>>>> strong opinion on what codestyle is the best.
> >>>>>>>>>>>
> >>>>>>>>>>> PS: We used spotless in the project I previously worked on.
> >> It was
> >>>>>>>>>>> convenient to use.
> >>>>>>>>>>>
> >>>>>>>>>>> [1]
> >>>>>>>>>>>
> >>>>>>>>>
> >>>>>
> >>>>
> >> https://www.moxio.com/blog/43/ignoring-bulk-change-commits-
> with-git-blame
> >>>>>>>>>
> >>>>>>>>>>> [2]
> >>>>>>>>>>>
> >>>>>>>>>
> >>>>>
> >>>>
> >> https://github.community/t/support-ignore-revs-file-in-
> githubs-blame-view/3256
> >>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> On Tue, Oct 6, 2020 at 6:00 PM Aljoscha Krettek
> >>>>>>>>>>> <aljos...@apache.org>
> >>>>>>>>> wrote:
> >>>>>>>>>>>
> >>>>>>>>>>>> Maybe I wasn't very clear on how the ratchet works. The
> >> changes
> >>>> are
> >>>>>>>>>>>> gradual yes, but it doesn't leave you an option: if you
> >> touch a
> >>>>>>>>>>>> file
> >>>>>>>>> you
> >>>>>>>>>>>> will it will have to conform to the coding style afterwards.
> >>>>>>>>>>>> It's not
> >>>>>>>>>>>> like the previous gradual process we had before where it
> >> would be
> >>>>>>>>> based
> >>>>>>>>>>>> on people actively working towards a style.
> >>>>>>>>>>>>
> >>>>>>>>>>>> That being said, I also completely like the option of just
> >> doing
> >>>>>>>>>>>> one
> >>>>>>>>> big
> >>>>>>>>>>>> change commit.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Regarding actual coding styles: we're a bit limited by what
> >> tools
> >>>>>>>>> exist.
> >>>>>>>>>>>> I like Spotless because it can be used to both check and
> >> apply a
> >>>>>>>>> style.
> >>>>>>>>>>>> Then you need a formatter that works with Spotless and of
> >> those
> >>>> we
> >>>>>>>>> only
> >>>>>>>>>>>> have the Eclipse Formatter, google-java-format, and Prettier.
> >>>>>>>>>>>> Prettier
> >>>>>>>>>>>> is a Javascript tool that I would like to avoid. Eclipse is
> >>>>>>>>>>>> doable but
> >>>>>>>>>>>> you need to fiddle with configuration files. I like
> >>>>>>>>>>>> google-java-format
> >>>>>>>>>>>> because of it's take-it-or-leave-it approach. You either use
> >> the
> >>>>>>>>>>>> style
> >>>>>>>>>>>> or you don't but it's very thorough. The downside is that it
> >>>>>>>>>>>> won't do
> >>>>>>>>>>>> tabs-only formatting.
> >>>>>>>>>>>>
> >>>>>>>>>>>> Best,
> >>>>>>>>>>>> Aljoscha
> >>>>>>>>>>>>
> >>>>>>>>>>>> On 06.10.20 17:43, Arvid Heise wrote:
> >>>>>>>>>>>>> After having written that I did a quick search, you can even
> >>>>>>>>>>>>> use git
> >>>>>>>>>>>> blame
> >>>>>>>>>>>>> with one big massive change commit [1], which would further
> >>>>>>>>>>>>> help the
> >>>>>>>>> idea
> >>>>>>>>>>>>> of "just get over with it".
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> With that option, I'd even change all whitespaces if the
> >>>> community
> >>>>>>>>> thinks
> >>>>>>>>>>>>> that it's a better option (a separate discussion that I'll
> >>>> gladly
> >>>>>>>>> skip).
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> [1]
> >>>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>
> >>>>>
> >>>>
> >> https://www.moxio.com/blog/43/ignoring-bulk-change-commits-
> with-git-blame
> >>>>>>>>>
> >>>>>>>>>>>>> On Tue, Oct 6, 2020 at 5:38 PM Arvid Heise <
> >> ar...@ververica.com
> >>>>>
> >>>>>>>>> wrote:
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>> I'm also +1 for automatically enforceable code style.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> I also would just go over it as Chesnay said. While it
> >> makes
> >>>> some
> >>>>>>>>>>>> changes
> >>>>>>>>>>>>>> a bit harder to track (inline git blame), it's easy to skip
> >>>>>>>>>>>>>> over in
> >>>>>>>>> any
> >>>>>>>>>>>> git
> >>>>>>>>>>>>>> history and if it's only one massive commit, then it's also
> >>>> much
> >>>>>>>>> easier
> >>>>>>>>>>>> to
> >>>>>>>>>>>>>> ignore than many gradual changes. Further, if we just do it
> >>>> once,
> >>>>>>>>> git
> >>>>>>>>>>>> blame
> >>>>>>>>>>>>>> will quickly become more reliable again.
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Btw I completely don't care about the code style as long
> >> as it
> >>>>>>>>>>>>>> plays
> >>>>>>>>>>>> well
> >>>>>>>>>>>>>> with IntelliJ (it used to be different, but things change
> >> :p).
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> On Tue, Oct 6, 2020 at 5:23 PM Chesnay Schepler
> >>>>>>>>>>>>>> <ches...@apache.org
> >>>>>>>>>>
> >>>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> We shouldn't switch to spaces _now_; cutting this bit from
> >>>> your
> >>>>>>>>>>>> proposal
> >>>>>>>>>>>>>>> will massively simplify things and there's hardly any
> >> value in
> >>>>>>>>> changing
> >>>>>>>>>>>>>>> it.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> Also I'm getting rather tired of this constant idea of
> >>>> "gradual
> >>>>>>>>>>>>>>> application". We've been doing this for 2-3 years now
> >> since we
> >>>>>>>>>>>>>>> introduced Checkstyle and basically got nowhere. We should
> >>>> just
> >>>>>>>>> bite
> >>>>>>>>>>>> the
> >>>>>>>>>>>>>>> bullet and get it over with; we could've solved this whole
> >>>>>>>>>>>>>>> problem
> >>>>>>>>>>>>>>> already.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> In conclusion, I'm +1 on finally locking down the
> >> codestyle
> >>>> and
> >>>>>>>>>>>> applying
> >>>>>>>>>>>>>>> it immediately, I'm -1 on any gradual application scheme
> >>>> because
> >>>>>>>>> they
> >>>>>>>>>>>>>>> _just don't work_.
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> On 10/6/2020 2:15 PM, Aljoscha Krettek wrote:
> >>>>>>>>>>>>>>>> Hi All,
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> I know I know, but please keep reading because I recently
> >>>>>>>>>>>>>>>> learned
> >>>>>>>>>>>>>>>> about some new developments in the area of coding-style
> >>>>>>>>> automation.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> The tool I would propose we use is Spotless
> >>>>>>>>>>>>>>>> (https://github.com/diffplug/spotless). This doesn't
> >> come
> >>>>>>>>>>>>>>>> with a
> >>>>>>>>>>>>>>>> formatter but allows using other popular formatters such
> >> as
> >>>>>>>>>>>>>>>> google-java-format. The nice thing about Spotless is
> >> that it
> >>>>>>>>> serves as
> >>>>>>>>>>>>>>>> a verifier for CI but can also apply the configured style
> >>>>>>>>>>>>>>>> automatically. That is, for the programmer all she has
> >> to do
> >>>> is
> >>>>>>>>> `mvn
> >>>>>>>>>>>>>>>> spotless:apply` to fix any style violations.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> An interesting feature, which was (somewhat) recently
> >> added
> >>>> is
> >>>>>>>>>>>>>>>> "ratchet"
> >>>>>>>>>>>>>>>> (
> >>>>>>>>>>>>
> >>>>>>>>>
> >>>>>
> >>>>
> >> https://github.com/diffplug/spotless/blob/main/plugin-
> maven/README.md#ratchet
> >>>>>>>>>
> >>>>>>>>>>>> ).
> >>>>>>>>>>>>>>>> With this, you can set up Spotless to only apply it's
> >> rules
> >>>> to
> >>>>>>>>> files
> >>>>>>>>>>>>>>>> that were changed after a configured commit. This would
> >>>> allow a
> >>>>>>>>>>>>>>>> gradual application of the new coding style instead of
> >> one
> >>>> big
> >>>>>>>>> change.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> If we decide to use Spotless, we would of course also
> >> have to
> >>>>>>>>> decide
> >>>>>>>>>>>>>>>> on a coding style. For this I would propose
> >>>> google-java-format,
> >>>>>>>>> which
> >>>>>>>>>>>>>>>> the flink-statefun project uses. The main difference
> >> from our
> >>>>>>>>> current
> >>>>>>>>>>>>>>>> "style" is that this uses spaces instead of tabs for
> >>>>>>>>>>>>>>>> indentation.
> >>>>>>>>> By
> >>>>>>>>>>>>>>>> default it would be 2 spaces but it can be configured to
> >> use
> >>>> 4
> >>>>>>>>> spaces
> >>>>>>>>>>>>>>>> which would make code look more or less like our current
> >>>> style.
> >>>>>>>>> There
> >>>>>>>>>>>>>>>> are no more configuration knobs, so using tabs is not an
> >>>>>>>>>>>>>>>> option.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Finally, why should we do this? I think most engineers
> >> agree
> >>>>>>>>>>>>>>>> that
> >>>>>>>>>>>>>>>> having a common enforced style is good to have so I only
> >>>>>>>>>>>>>>>> want to
> >>>>>>>>>>>>>>>> highlight a few thoughts here about things we could
> >> improve:
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>    - No more nits about coding style in reviews, this
> >> makes
> >>>> it
> >>>>>>>>> easier
> >>>>>>>>>>>>>>>> for both the reviewer and developer
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>    - No manual fixing of Checkstyle errors because
> >> Spotless
> >>>>>>>>>>>>>>>> can
> >>>>>>>>> do that
> >>>>>>>>>>>>>>>> automatically
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>    - Because Flink is such a big project little islands
> >> of
> >>>>>>>>>>>>>>>> coding
> >>>>>>>>> style
> >>>>>>>>>>>>>>>> have formed between people that commonly work on
> >> components.
> >>>> It
> >>>>>>>>> can be
> >>>>>>>>>>>>>>>> a nuisance when you work on a different component and
> >> then
> >>>>>>>>> reviewers
> >>>>>>>>>>>>>>>> don't like your typical coding style. And you first have
> >> to
> >>>> get
> >>>>>>>>> used
> >>>>>>>>>>>>>>>> to the slight differences in style when reading code.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> There are also downsides I see in this:
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>    - We break the history, but both "git blame" and
> >> modern
> >>>>>>>>> IntelliJ can
> >>>>>>>>>>>>>>>> ignore whitespace when attributing changes. So for files
> >>>>>>>>>>>>>>>> that are
> >>>>>>>>>>>>>>>> already "well" formatted not much would change.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>    - In the short-term it will be harder to apply
> >> changes
> >>>>>>>>>>>>>>>> both to
> >>>>>>>>>>>> master
> >>>>>>>>>>>>>>>> and one of the release-x branches because formatting
> >> will be
> >>>>>>>>>>>>>>>> different. I think this is not too hard though because
> >>>> Spotless
> >>>>>>>>> can
> >>>>>>>>>>>>>>>> automatically apply the style.
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> In summary, we would have some short-term pain with this
> >> but
> >>>> I
> >>>>>>>>> think
> >>>>>>>>>>>>>>>> it would be good in the long run. What are your thoughts?
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>> Best,
> >>>>>>>>>>>>>>>> Aljoscha
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Arvid Heise | Senior Java Developer
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> <https://www.ververica.com/>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Follow us @VervericaData
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Join Flink Forward <https://flink-forward.org/> - The
> >> Apache
> >>>>>>>>>>>>>> Flink
> >>>>>>>>>>>>>> Conference
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Stream Processing | Event Driven | Real Time
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> Ververica GmbH | Invalidenstrasse 115, 10115 Berlin,
> >> Germany
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>> --
> >>>>>>>>>>>>>> Ververica GmbH
> >>>>>>>>>>>>>> Registered at Amtsgericht Charlottenburg: HRB 158244 B
> >>>>>>>>>>>>>> Managing Directors: Timothy Alexander Steinert, Yip Park
> >> Tung
> >>>>>>>>> Jason, Ji
> >>>>>>>>>>>>>> (Toni) Cheng
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>
> >>>
> >>>
> >>> --
> >>>
> >>> Arvid Heise | Senior Java Developer
> >>>
> >>> <https://www.ververica.com/>
> >>>
> >>> Follow us @VervericaData
> >>>
> >>> --
> >>>
> >>> Join Flink Forward <https://flink-forward.org/> - The Apache Flink
> >>> Conference
> >>>
> >>> Stream Processing | Event Driven | Real Time
> >>>
> >>> --
> >>>
> >>> Ververica GmbH | Invalidenstrasse 115, 10115 Berlin, Germany
> >>>
> >>> --
> >>> Ververica GmbH
> >>> Registered at Amtsgericht Charlottenburg: HRB 158244 B
> >>> Managing Directors: Timothy Alexander Steinert, Yip Park Tung Jason, Ji
> >>> (Toni) Cheng
> >>
>
>

Reply via email to