Yes it is starting with Scala APIs, but the APIs themselves are generated
from the backend. I am not sure how it is handled for the Python but it
will more likely be impacting all language bindings.

On Thu, Jun 21, 2018 at 10:50 AM, Hao Jin <hjjn.a...@gmail.com> wrote:

> Can you elaborate on how this change is bringing "alignment on the
> modifications to the operators across language bindings"? Seems like this
> PR is generating a hash from the scala files instead of the backend apis,
> how would this benefit other language bindings?
> Hao
>
> On Thu, Jun 21, 2018 at 10:44 AM, Naveen Swamy <mnnav...@gmail.com> wrote:
>
> > Thank you all for your input, I want to reiterate that this work is not
> to
> > burden anyone but to bring alignment on the modifications to the
> operators
> > across language bindings. I agree with Marco/Qing and we'll start off as
> a
> > nightly runs and identify changes, we can discuss further later after we
> > gather some data.
> >
> > On Wed, Jun 20, 2018 at 10:36 PM, Qing Lan <lanking...@live.com> wrote:
> >
> > > Thanks Jun for your clarification. I think one of the advantages for
> > MXNet
> > > is it's language binding. Although the number of customers using Scala
> is
> > > great less than Python, it is still one important language we need to
> > > support.
> > >
> > > About the first question, I would say we all in. At least all breaking
> > > changes should let all language binding maintainers notified. Then we
> > make
> > > the changes to make sure we have stable support to the customers. The
> > > reason for Scala build failure could be many, so we need to diagnose
> the
> > > problem and see if we need to collaborate and solve the problems
> > together.
> > > I don't think the other language maintainers and backend must take the
> > > responsibilities to diagnose a problems of a language they may not
> > familiar
> > > with.
> > >
> > > 2. It depends differently case by case, we cannot bring a unique time
> for
> > > different failures we have. If you mean the operator check, it could
> > cause
> > > you (time to build scalapkg) + (30 seconds to change the code) + (time
> to
> > > run the CI to make sure it worked) + (send a PR to make that change on
> > > master branch). This update should be done by the Scala developers for
> > sure.
> > >
> > > 3. If there is a nightly build failure, maybe we can think of checking
> > > that on a weekly basis. Spend 15 mins every week to review the operator
> > > changes so we don't miss any important points.
> > >
> > > Thanks,
> > > Qing
> > >
> > >
> > >
> > > On 6/20/18, 9:57 PM, "Jun Wu" <wujun....@gmail.com> wrote:
> > >
> > >     We should reach an agreement on the responsibility/ownership before
> > > moving
> > >     forward.
> > >
> > >     1. Who will take the ownership of fixing Scala build failure if an
> > > operator
> > >     is changed/added in C++?
> > >     2. What is the expected turn around time of fixing the scala build
> > > failure.
> > >     3. What if we are short of resources of fixing the scala build
> > > failure? How
> > >     do we deal with the failing nightly CI every night?
> > >
> > >     With all being said, there is at least one thing that must be
> clear,
> > we
> > >     certainly don't want to put the extra burden on the backend
> > developers.
> > >
> > >     On Wed, Jun 20, 2018 at 9:39 PM Qing Lan <lanking...@live.com>
> > wrote:
> > >
> > >     > Hi All,
> > >     >
> > >     > Thank you all for your feedback. This changes do influence a lot
> on
> > > the
> > >     > PRs related to operator changes. I will take what Marco proposed
> to
> > > place
> > >     > that in the nightly build rather than every CI we runs.
> > >     >
> > >     > Thanks,
> > >     > Qing
> > >     >
> > >     > On 6/20/18, 8:40 PM, "Hao Jin" <hjjn.a...@gmail.com> wrote:
> > >     >
> > >     >     I don't think we should keep this hash check thing. As Qing
> > > stated
> > >     > before
> > >     >     on this thread, if there's any change in documentation the
> hash
> > > value
> > >     > is
> > >     >     also changed and then flagged as a problem, how will that
> break
> > > any
> > >     > user's
> > >     >     code? I would go for something like Marco's proposal: moving
> > > this to an
> > >     >     asynchronous check.
> > >     >     At this very moment, I've got 4 PRs that are all related to
> > > "operator
> > >     >     changes", adopting this kind of method is adding extra work
> for
> > > me and
> > >     >     every other contributor whose work involves changes on
> operator
> > > code,
> > >     > and I
> > >     >     don't think it's a reasonable kind of extra work like
> tracking
> > > PRs on
> > >     > JIRA.
> > >     >     Hao
> > >     >
> > >     >     On Wed, Jun 20, 2018 at 8:10 PM, Naveen Swamy <
> > > mnnav...@gmail.com>
> > >     > wrote:
> > >     >
> > >     >     > Agreed, for new APIs we can turn into a nightly job and
> > report
> > > on
> > >     > dev@.
> > >     >     > The
> > >     >     > goal here is not to burden anyone but to catch changes on
> the
> > > backend
> > >     >     > before it propagates and break user's code and co-ordinate
> > > changes
> > >     > across
> > >     >     > language bindings which IMO is essential, so I would like
> to
> > > keep for
> > >     >     > changes on the existing API.
> > >     >     >
> > >     >     > On Wed, Jun 20, 2018 at 7:58 PM, Marco de Abreu <
> > >     >     > marco.g.ab...@googlemail.com.invalid> wrote:
> > >     >     >
> > >     >     > > I think we should go with an asychronous approach using a
> > > nightly
> > >     > job
> > >     >     > that
> > >     >     > > detects the changes and reports them accordingly. We
> could
> > > then
> > >     > send out
> > >     >     > a
> > >     >     > > report if there is a mismatch.
> > >     >     > >
> > >     >     > > I agree with the already stated points that we should not
> > > put the
> > >     > burden
> > >     >     > of
> > >     >     > > adding frontend API bindings to somebody who adds a
> Backend
> > >     > function.
> > >     >     > This
> > >     >     > > is not scalable and rather poses a risk in reduced
> quality
> > or
> > >     > increased
> > >     >     > > review overhead.
> > >     >     > >
> > >     >     > > The sparse support is the perfect example. I don't know
> if
> > > haibin
> > >     > knows
> > >     >     > > Scala, but he would have had to make the entire mapping
> for
> > > Scala
> > >     > without
> > >     >     > > being very familiar with it (sorry if I'm wrong on this
> > > haibin,
> > >     > it's just
> > >     >     > > an example). Imagine we do this for even more APIs - we
> > would
> > >     > basically
> > >     >     > > block ourselves because everyone who makes a change in
> the
> > > Backend
> > >     > has to
> > >     >     > > know a dozen languages.
> > >     >     > >
> > >     >     > > While in a few cases it might be just a few lines, I'd
> > guess
> > > that
> > >     >     > > especially for new operators it would require a proper
> > > design,
> > >     > coding and
> > >     >     > > review to map an API to the frontend languages. This
> should
> > > rather
> > >     > be
> > >     >     > done
> > >     >     > > by an expert in my opinion.
> > >     >     > >
> > >     >     > > We could define it as a requirement for a release that
> all
> > > APIs
> > >     > have had
> > >     >     > to
> > >     >     > > be transfered before a release can be cut (We already
> have
> > > it as
> > >     >     > > requirement that all nightly jobs have to pass anyways).
> > >     >     > >
> > >     >     > > -Marco
> > >     >     > >
> > >     >     > > Naveen Swamy <mnnav...@gmail.com> schrieb am Mi., 20.
> Juni
> > > 2018,
> > >     > 19:50:
> > >     >     > >
> > >     >     > > > I understand the concerns here. However the problem
> here
> > > is that
> > >     > since
> > >     >     > > the
> > >     >     > > > Scala APIs are generated using Macros and we do not(may
> > not
> > >     > ever) have
> > >     >     > > full
> > >     >     > > > test coverage on each of the APIs, we will not know for
> > > example
> > >     > if an
> > >     >     > > > operator/API changes on the backend and that propagates
> > to
> > > Scala
> > >     > users,
> > >     >     > > > their code might very well fail.  So what we are trying
> > > here is
> > >     > to find
> > >     >     > > out
> > >     >     > > > early if there is an operator/API change and avoid
> > breaking
> > >     > user's
> > >     >     > code.
> > >     >     > > >
> > >     >     > > > I think there is value in co-ordinating addition of
> APIs
> > > across
> > >     >     > bindings,
> > >     >     > > > as an example the sparse APIs introduced was(still not)
> > > exposed
> > >     > to
> > >     >     > Scala
> > >     >     > > > users. This begs the question of how do we co-ordinate
> > such
> > >     > changes?
> > >     >     > > Should
> > >     >     > > > we turn addition of new APIs also as warnings ?
> > >     >     > > >
> > >     >     > > > I agree that we shouldn't fail on documentation change,
> > > may we
> > >     > should
> > >     >     > > turn
> > >     >     > > > that into warnings and make sure to pick it up on the
> > Scala
> > >     > APIs, this
> > >     >     > is
> > >     >     > > > low risk since it documentation does not change.
> > >     >     > > >
> > >     >     > > > Open for suggestions.
> > >     >     > > >
> > >     >     > > >
> > >     >     > > > On Wed, Jun 20, 2018 at 7:32 PM, YiZhi Liu <
> > > eazhi....@gmail.com>
> > >     >     > wrote:
> > >     >     > > >
> > >     >     > > > > Hi Qing,
> > >     >     > > > > What is the exact risk of changing / adding
> operators?
> > > could
> > >     > you
> > >     >     > > > > provide an example? I also feel the way you proposed
> is
> > > little
> > >     > bit
> > >     >     > too
> > >     >     > > > > heavy to developers, and not quite friendly to new
> > >     > contributors.
> > >     >     > > > > On Wed, Jun 20, 2018 at 10:22 AM Haibin Lin <
> > >     >     > haibin.lin....@gmail.com>
> > >     >     > > > > wrote:
> > >     >     > > > > >
> > >     >     > > > > > I appreciate the effort and understand the
> > motivation.
> > >     > However, I'm
> > >     >     > > > > > concerned that it basically means merging operator
> > PRs
> > >     > becomes
> > >     >     > > > > sequential.
> > >     >     > > > > > Developers who work on operators have to update
> their
> > > PR
> > >     > every
> > >     >     > time a
> > >     >     > > > new
> > >     >     > > > > > operator is merged to master, the burden becomes
> > > significant
> > >     > if
> > >     >     > > > there're
> > >     >     > > > > 20
> > >     >     > > > > > ONNX/sparse operators to add and many PRs are
> > >     > submitted/reviewed in
> > >     >     > > > > > parallel.
> > >     >     > > > > >
> > >     >     > > > > > On Wed, Jun 20, 2018 at 10:13 AM, Qing Lan <
> > >     > lanking...@live.com>
> > >     >     > > > wrote:
> > >     >     > > > > >
> > >     >     > > > > > > Hi Haibin,
> > >     >     > > > > > >
> > >     >     > > > > > > The operator change is any changes on the
> operator
> > > on C++
> > >     > side.
> > >     >     > > > Trigger
> > >     >     > > > > > > the check failed?
> > >     >     > > > > > >    - change the documentation of operator in C
> > >     >     > > > >   Yes
> > >     >     > > > > > >    - change the documentation such as README.md
> > >     >     >  No
> > >     >     > > > > > >    - add/remove/modify operator
> > >     >     >  Yes
> > >     >     > > > > > >    - add/remove/modify operator parameter
> > >     >     > > > >  Yes
> > >     >     > > > > > >
> > >     >     > > > > > > Thanks,
> > >     >     > > > > > > Qing
> > >     >     > > > > > >
> > >     >     > > > > > > On 6/20/18, 10:01 AM, "Haibin Lin" <
> > >     > haibin.lin....@gmail.com>
> > >     >     > > > wrote:
> > >     >     > > > > > >
> > >     >     > > > > > >     Could you elaborate what you mean by operator
> > > change?
> > >     > Does it
> > >     >     > > > > check the
> > >     >     > > > > > >     operator interface? Would updated operator
> > >     > documentation fail
> > >     >     > > the
> > >     >     > > > > > > check?
> > >     >     > > > > > >     Would adding a new operator fail this check?
> > >     >     > > > > > >
> > >     >     > > > > > >
> > >     >     > > > > > >
> > >     >     > > > > > >     On Wed, Jun 20, 2018 at 9:48 AM, Qing Lan <
> > >     >     > lanking...@live.com
> > >     >     > > >
> > >     >     > > > > wrote:
> > >     >     > > > > > >
> > >     >     > > > > > >     > Hi Macro,
> > >     >     > > > > > >     >
> > >     >     > > > > > >     > Thanks for your feedback! I believe this
> > > should not
> > >     > be a
> > >     >     > > block
> > >     >     > > > > for
> > >     >     > > > > > >     > contributor in most of the cases.
> > >     >     > > > > > >     > Firstly, this would only be triggered if
> > there
> > > is an
> > >     >     > operator
> > >     >     > > > > changes
> > >     >     > > > > > >     > (Only general operators).
> > >     >     > > > > > >     > Secondly, it is simple to go through. Just
> > > need to
> > >     > change 1
> > >     >     > > > line
> > >     >     > > > > of
> > >     >     > > > > > > code
> > >     >     > > > > > >     > would make the PR passed. However it do
> > > requires
> > >     >     > contributor
> > >     >     > > to
> > >     >     > > > > do
> > >     >     > > > > > > this or
> > >     >     > > > > > >     > the Scalatest will fail. I have made the
> > error
> > >     > message
> > >     >     > > > > instructive
> > >     >     > > > > > > that
> > >     >     > > > > > >     > would help the contributor to dive in and
> > make
> > > the
> > >     > changes.
> > >     >     > > > > > >     >
> > >     >     > > > > > >     > I also updated the design document to
> explain
> > > in
> > >     > detail.
> > >     >     > > > > > >     >
> > >     >     > > > > > >     > Thanks,
> > >     >     > > > > > >     > Qing
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >
> > >     >     > > > > > >     > On 6/19/18, 12:09 PM, "Marco de Abreu" <
> > >     >     > > > > marco.g.ab...@googlemail.com
> > >     >     > > > > > > .INVALID>
> > >     >     > > > > > >     > wrote:
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >     Okay, thanks for elaborating. I
> > definitely
> > > see
> > >     > your
> > >     >     > point
> > >     >     > > > > there
> > >     >     > > > > > > and we
> > >     >     > > > > > >     >     definitely don't want these changes to
> > > pile up.
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >     I don't feel strongly about this and
> > won't
> > > stand
> > >     > in the
> > >     >     > > > way,
> > >     >     > > > > I
> > >     >     > > > > > > just
> > >     >     > > > > > >     > want to
> > >     >     > > > > > >     >     express my concern that this could lead
> > to
> > > people
> > >     >     > having
> > >     >     > > to
> > >     >     > > > > > > touch all
> > >     >     > > > > > >     >     language interfaces although they might
> > not
> > >     > familiar
> > >     >     > with
> > >     >     > > > > them
> > >     >     > > > > > > at all.
> > >     >     > > > > > >     > On
> > >     >     > > > > > >     >     the other hand we got enough
> contributors
> > > who
> > >     > could
> > >     >     > help
> > >     >     > > > them
> > >     >     > > > > > > then
> > >     >     > > > > > >     > before
> > >     >     > > > > > >     >     the PR can get merged. So either way
> > > works, but
> > >     > I just
> > >     >     > > > > wanted to
> > >     >     > > > > > >     > highlight
> > >     >     > > > > > >     >     that this could make it harder to make
> > > changes
> > >     > in the
> > >     >     > > > > backend for
> > >     >     > > > > > >     > people
> > >     >     > > > > > >     >     who are not familiar with our frontend
> > API
> > >     > languages.
> > >     >     > If
> > >     >     > > we
> > >     >     > > > > got
> > >     >     > > > > > > enough
> > >     >     > > > > > >     >     people who could actively support our
> > >     > contributors in
> > >     >     > > such
> > >     >     > > > a
> > >     >     > > > > > > case, we
> > >     >     > > > > > >     >     should be totally fine with blocking a
> PR
> > > until
> > >     > the
> > >     >     > APIs
> > >     >     > > > have
> > >     >     > > > > > > been
> > >     >     > > > > > >     > adapted.
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >     -Marco
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >     On Tue, Jun 19, 2018 at 11:58 AM Naveen
> > > Swamy <
> > >     >     > > > > > > mnnav...@gmail.com>
> > >     >     > > > > > >     > wrote:
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >     > Marco,
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >     > Qing and I are working together on
> > this.
> > > The
> > >     > idea is
> > >     >     > > that
> > >     >     > > > > we
> > >     >     > > > > > > fail
> > >     >     > > > > > >     > the build
> > >     >     > > > > > >     >     > if there is a operator change on the
> > > backend
> > >     > and have
> > >     >     > > not
> > >     >     > > > > > > synced to
> > >     >     > > > > > >     > the
> > >     >     > > > > > >     >     > Scala API. We want to catch this
> before
> > >     > breaking the
> > >     >     > > > user's
> > >     >     > > > > > > code
> > >     >     > > > > > >     > which will
> > >     >     > > > > > >     >     > be a pretty bad experience.
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >     > On Tue, Jun 19, 2018 at 11:54 AM,
> Marco
> > > de
> > >     > Abreu <
> > >     >     > > > > > >     >     > marco.g.ab...@googlemail.com.
> invalid>
> > > wrote:
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >     > > Hi Qing,
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > thank you for working on improving
> > the
> > >     >     > compatibility
> > >     >     > > of
> > >     >     > > > > our
> > >     >     > > > > > > APIs!
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > Your linked proposal does not
> > describe
> > > the
> > >     >     > mentioned
> > >     >     > > > > > > FILEHASH.
> > >     >     > > > > > >     > Could you
> > >     >     > > > > > >     >     > > elaborate a bit? Would this be a
> hash
> > > of the
> > >     > entire
> > >     >     > > > file,
> > >     >     > > > > > > some hash
> > >     >     > > > > > >     >     > created
> > >     >     > > > > > >     >     > > based on the signature of the
> > > underlying C++
> > >     >     > methods
> > >     >     > > or
> > >     >     > > > > > > maybe a
> > >     >     > > > > > >     > different
> > >     >     > > > > > >     >     > > approach?
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > Also, at which step would
> developers
> > be
> > >     > notified of
> > >     >     > > the
> > >     >     > > > > > > change? I'd
> > >     >     > > > > > >     >     > propose
> > >     >     > > > > > >     >     > > that we make this check a nightly
> job
> > > to
> > >     > prevent it
> > >     >     > > > from
> > >     >     > > > > > > blocking
> > >     >     > > > > > >     > a PR
> > >     >     > > > > > >     >     > and
> > >     >     > > > > > >     >     > > forcing contributors who are not
> > > familiar
> > >     > with
> > >     >     > Scala
> > >     >     > > > > having
> > >     >     > > > > > > to
> > >     >     > > > > > >     > make a
> > >     >     > > > > > >     >     > > change to the Scala package. This
> > would
> > >     > allow us to
> > >     >     > > > > follow up
> > >     >     > > > > > >     >     > > asynchronously but still provide
> > > actionable
> > >     > events
> > >     >     > > that
> > >     >     > > > > one
> > >     >     > > > > > > can be
> > >     >     > > > > > >     >     > > subscribed to.
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > Best regards,
> > >     >     > > > > > >     >     > > Marco
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > On Tue, Jun 19, 2018 at 11:00 AM
> Qing
> > > Lan <
> > >     >     > > > > > > lanking...@live.com>
> > >     >     > > > > > >     > wrote:
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     > > > Hi all,
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > > I am one of the maintainer for
> > MXNet
> > > Scala
> > >     >     > package.
> > >     >     > > > > > > Currently I
> > >     >     > > > > > >     > am
> > >     >     > > > > > >     >     > > > building up a hash-check system
> on
> > > the
> > >     > generated
> > >     >     > > API
> > >     >     > > > > > > through C.
> > >     >     > > > > > >     > The PR
> > >     >     > > > > > >     >     > > is
> > >     >     > > > > > >     >     > > > in this URL:
> > >     >     > > > > > >     >     > > > https://github.com/apache/
> > >     >     > > incubator-mxnet/pull/11239
> > >     >     > > > > > >     >     > > > A file named FILEHASH will be
> added
> > > to the
> > >     > Scala
> > >     >     > > that
> > >     >     > > > > > > created
> > >     >     > > > > > >     > the MD5
> > >     >     > > > > > >     >     > > > string of the generated API
> > > document. It
> > >     > will
> > >     >     > check
> > >     >     > > > the
> > >     >     > > > > > >     > signature of
> > >     >     > > > > > >     >     > all
> > >     >     > > > > > >     >     > > > the operators during Scala CI
> > > testing. The
> > >     >     > reason I
> > >     >     > > > am
> > >     >     > > > > > > doing
> > >     >     > > > > > >     > this is to
> > >     >     > > > > > >     >     > > > make sure Scala developers will
> > > always be
> > >     >     > reminded
> > >     >     > > if
> > >     >     > > > > > > there is an
> > >     >     > > > > > >     >     > > operator
> > >     >     > > > > > >     >     > > > name/argument changes happened in
> > >     > different PRs.
> > >     >     > > More
> > >     >     > > > > > > detailed
> > >     >     > > > > > >     > info
> > >     >     > > > > > >     >     > > > explained in here:
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > > https://cwiki.apache.org/
> > >     >     > confluence/display/MXNET/
> > >     >     > > > > > >     >     > > MXNet+Scala+API+Usability+
> > Improvement
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > > Pros:
> > >     >     > > > > > >     >     > > > This method will always help us
> > keep
> > >     > backwards
> > >     >     > > > > > > compatibility of
> > >     >     > > > > > >     >     > operators
> > >     >     > > > > > >     >     > > > for Scala
> > >     >     > > > > > >     >     > > > Cons:
> > >     >     > > > > > >     >     > > > Require update on the FILEHASH
> with
> > > new
> > >     > contents
> > >     >     > > when
> > >     >     > > > > > > there is an
> > >     >     > > > > > >     >     > > operator
> > >     >     > > > > > >     >     > > > change. Developers who changed
> the
> > > operator
> > >     >     > should
> > >     >     > > > > `make
> > >     >     > > > > > >     > scalapkg` to
> > >     >     > > > > > >     >     > > > update that file.
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > > Please leave any thoughts you may
> > > have for
> > >     > this
> > >     >     > > > design
> > >     >     > > > > and
> > >     >     > > > > > > feel
> > >     >     > > > > > >     > free to
> > >     >     > > > > > >     >     > > > review the code.
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > > Thanks,
> > >     >     > > > > > >     >     > > > Qing
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > > >
> > >     >     > > > > > >     >     > >
> > >     >     > > > > > >     >     >
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >
> > >     >     > > > > > >     >
> > >     >     > > > > > >
> > >     >     > > > > > >
> > >     >     > > > > > >
> > >     >     > > > >
> > >     >     > > > >
> > >     >     > > > >
> > >     >     > > > > --
> > >     >     > > > > Yizhi Liu
> > >     >     > > > > DMLC member
> > >     >     > > > > Amazon Web Services
> > >     >     > > > > Vancouver, Canada
> > >     >     > > > >
> > >     >     > > >
> > >     >     > >
> > >     >     >
> > >     >
> > >     >
> > >     >
> > >
> > >
> > >
> >
>

Reply via email to