1eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen/*
2eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Copyright (C) 2015 The Android Open Source Project
3eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
4eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
5eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * you may not use this file except in compliance with the License.
6eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * You may obtain a copy of the License at
7eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
8eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *      http://www.apache.org/licenses/LICENSE-2.0
9eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
10eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Unless required by applicable law or agreed to in writing, software
11eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
12eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * See the License for the specific language governing permissions and
14eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * limitations under the License.
15eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen */
16eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
17eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenpackage com.android.ims;
18eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
19eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport android.app.PendingIntent;
20eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
21eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.ImsCallProfile;
22eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsCallSession;
23eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsCallSessionListener;
24eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsConfig;
25eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsEcbm;
262038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunnimport com.android.ims.internal.IImsMultiEndpoint;
27eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsRegistrationListener;
28eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsService;
29eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.ims.internal.IImsUt;
30eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport android.os.Message;
31eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
32eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen/*
33eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Stub for IImsService interface. To enable forward compatibility during
34eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * development - empty APIs should not be deployed.
35eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
36eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * @hide
37eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen */
38eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenpublic abstract class ImsServiceBase {
39eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    /**
40eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen     * IImsService stub implementation.
41eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen     */
42eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private final class ImsServiceBinder extends IImsService.Stub {
43eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
44eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public int open(int phoneId, int serviceClass, PendingIntent incomingCallIntent,
45eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                 IImsRegistrationListener listener) {
46eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onOpen(phoneId, serviceClass, incomingCallIntent, listener);
47eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
48eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
49eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
50eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public void close(int serviceId) {
51eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            onClose(serviceId);
52eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
53eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
54eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
55eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public boolean isConnected(int serviceId, int serviceType, int callType) {
56eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onIsConnected(serviceId, serviceType, callType);
57eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
58eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
59eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
60eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public boolean isOpened(int serviceId) {
61eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onIsOpened(serviceId);
62eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
63eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
64eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
65eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public void setRegistrationListener(int serviceId, IImsRegistrationListener listener) {
66eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            onSetRegistrationListener(serviceId, listener);
67eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
68eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
69eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
70ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak        public void addRegistrationListener(int serviceId, int serviceType, IImsRegistrationListener listener) {
71ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak            onAddRegistrationListener(serviceId, serviceType, listener);
72ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak        }
73ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak
74ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak
75ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak        @Override
76eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public ImsCallProfile createCallProfile(int serviceId, int serviceType, int callType) {
77eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onCreateCallProfile(serviceId, serviceType, callType);
78eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
79eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
80eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
81eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public IImsCallSession createCallSession(int serviceId, ImsCallProfile profile,
82eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                                          IImsCallSessionListener listener) {
83eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onCreateCallSession(serviceId, profile, listener);
84eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
85eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
86eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
87eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public IImsCallSession getPendingCallSession(int serviceId, String callId) {
88eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onGetPendingCallSession(serviceId, callId);
89eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
90eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
91eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
92eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public IImsUt getUtInterface(int serviceId) {
93eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onGetUtInterface(serviceId);
94eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
95eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
96eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
97eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public IImsConfig getConfigInterface(int phoneId) {
98eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onGetConfigInterface(phoneId);
99eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
100eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
101eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
102eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public void turnOnIms(int phoneId) {
103eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            onTurnOnIms(phoneId);
104eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
105eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
106eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
107eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public void turnOffIms(int phoneId) {
108eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            onTurnOffIms(phoneId);
109eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
110eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
111eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
112eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public IImsEcbm getEcbmInterface(int serviceId) {
113eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return onGetEcbmInterface(serviceId);
114eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
115eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
116eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        @Override
117eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        public void setUiTTYMode(int serviceId, int uiTtyMode, Message onComplete) {
118eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            onSetUiTTYMode(serviceId, uiTtyMode, onComplete);
119eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
1202038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn
1212038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn        @Override
1222038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn        public IImsMultiEndpoint getMultiEndpointInterface(int serviceId) {
1232038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn            return onGetMultiEndpointInterface(serviceId);
1242038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn        }
125eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
126eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
127eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private ImsServiceBinder mBinder;
128eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
129eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    public ImsServiceBinder getBinder() {
130eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (mBinder == null) {
131eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            mBinder = new ImsServiceBinder();
132eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
133eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
134eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return mBinder;
135eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
136eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
137eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected int onOpen(int phoneId, int serviceClass, PendingIntent incomingCallIntent,
138eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                    IImsRegistrationListener listener) {
139eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
140eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
141eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return 0; // DUMMY VALUE
142eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
143eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
144eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected void onClose(int serviceId) {
145eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
146eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
147eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
148eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected boolean onIsConnected(int serviceId, int serviceType, int callType) {
149eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
150eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
151eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return false; // DUMMY VALUE
152eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
153eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
154eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected boolean onIsOpened(int serviceId) {
155eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
156eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
157eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return false; // DUMMY VALUE
158eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
159eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
160eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected void onSetRegistrationListener(int serviceId, IImsRegistrationListener listener) {
161eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
162eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
163eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
164ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak    protected void onAddRegistrationListener(int serviceId, int serviceType, IImsRegistrationListener listener) {
165ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak        // no-op
166ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak    }
167ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak
168eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected ImsCallProfile onCreateCallProfile(int serviceId, int serviceType, int callType) {
169eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
170eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
171eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
172eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
173eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
174eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected IImsCallSession onCreateCallSession(int serviceId, ImsCallProfile profile,
175eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                                             IImsCallSessionListener listener) {
176eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
177eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
178eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
179eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
180eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
181eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected IImsCallSession onGetPendingCallSession(int serviceId, String callId) {
182eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
183eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
184eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
185eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
186eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
187eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected IImsUt onGetUtInterface(int serviceId) {
188eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
189eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
190eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
191eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
192eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
193eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected IImsConfig onGetConfigInterface(int phoneId) {
194eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
195eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
196eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
197eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
198eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
199eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected void onTurnOnIms(int phoneId) {
200eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
201eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
202eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
203eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected void onTurnOffIms(int phoneId) {
204eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
205eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
206eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
207eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected IImsEcbm onGetEcbmInterface(int serviceId) {
208eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
209eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
210eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        return null;
211eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
212eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
213eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    protected void onSetUiTTYMode(int serviceId, int uiTtyMode, Message onComplete) {
214eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // no-op
215eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
2162038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn
2172038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn    protected IImsMultiEndpoint onGetMultiEndpointInterface(int serviceId) {
2182038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn        // no-op
2192038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn        return null;
2202038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn    }
221eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen}
222eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
223