Skip to content

Commit

Permalink
Issue 21826: Move some classes around to avoid package resolution errors
Browse files Browse the repository at this point in the history
Had to move some classes around to avoid the following:

```
[ERROR   ] CWWKE0702E: Could not resolve module: com.ibm.ws.security.openidconnect.common [149]
  Bundle was not resolved because of a uses constraint violation.
  org.apache.felix.resolver.reason.ReasonException: Uses constraint violation. Unable to resolve resource com.ibm.ws.security.openidconnect.common [osgi.identity; osgi.identity="com.ibm.ws.security.openidconnect.common"; type="osgi.bundle"; version:Version="1.0.77.202304261135"] because it exports package 'com.ibm.ws.security.openidconnect.common' and is also exposed to it from resource com.ibm.ws.security.openidconnect.clients.common [osgi.identity; osgi.identity="com.ibm.ws.security.openidconnect.clients.common"; type="osgi.bundle"; version:Version="1.0.77.202304261135"] via the following dependency chain:
```

My guess is that opening up the `com.ibm.ws.security.openidconnect.clients.common` bundle that had its own `com.ibm.ws.security.openidconnect.common` package conflicted with the actual `com.ibm.ws.security.openidconnect.common` project.
  • Loading branch information
ayoho committed Apr 26, 2023
1 parent e46a4d1 commit 109b741
Show file tree
Hide file tree
Showing 45 changed files with 60 additions and 96 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import javax.json.JsonValue.ValueType;

import com.ibm.ws.security.fat.common.Constants.CheckType;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;

public class UserInfoJsonExpectation extends com.ibm.ws.security.fat.common.social.expectations.UserInfoJsonExpectation {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,12 @@
import com.ibm.ws.security.common.ssl.SecuritySSLUtils;
import com.ibm.ws.security.openidconnect.client.jose4j.util.Jose4jUtil;
import com.ibm.ws.security.openidconnect.clients.common.ClientConstants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OIDCClientAuthenticatorUtil;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientUtil;
import com.ibm.ws.security.openidconnect.clients.common.UserInfoHelper;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.token.JsonTokenUtil;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.common.structures.SingleTableCache;
import com.ibm.ws.security.openidconnect.client.jose4j.OidcTokenImpl;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
import com.ibm.wsspi.security.token.AttributeNameConstants;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@
import com.ibm.websphere.ras.TraceComponent;
import com.ibm.ws.security.openidconnect.client.jose4j.OidcTokenImpl;
import com.ibm.ws.security.openidconnect.client.jose4j.util.OidcTokenImplBase;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OIDCClientAuthenticatorUtil;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientUtil;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
import com.ibm.wsspi.kernel.service.utils.AtomicServiceReference;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,13 @@
import com.ibm.ws.security.jwt.config.ConsumerUtils;
import com.ibm.ws.security.jwt.utils.JwtUtils;
import com.ibm.ws.security.openidconnect.clients.common.ClientConstants;
import com.ibm.ws.security.openidconnect.clients.common.ConfigUtils;
import com.ibm.ws.security.openidconnect.clients.common.InMemoryOidcSessionCache;
import com.ibm.ws.security.openidconnect.clients.common.OIDCClientAuthenticatorUtil;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcSessionCache;
import com.ibm.ws.security.openidconnect.clients.common.OidcUtil;
import com.ibm.ws.security.openidconnect.common.ConfigUtils;
import com.ibm.ws.security.openidconnect.common.OidcCommonClientRequest;
import com.ibm.ws.ssl.KeyStoreService;
import com.ibm.wsspi.kernel.service.location.WsLocationAdmin;
import com.ibm.wsspi.kernel.service.utils.AtomicServiceReference;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
import com.ibm.ws.security.openidconnect.client.internal.OidcClientConfigImpl;
import com.ibm.ws.security.openidconnect.client.internal.OidcClientImpl;
import com.ibm.ws.security.openidconnect.client.internal.TraceConstants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientUtil;
import com.ibm.ws.security.openidconnect.clients.common.OidcUtil;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.openidconnect.OidcClient;

import io.openliberty.security.oidcclientcore.storage.OidcStorageUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,11 @@
import com.ibm.ws.common.encoder.Base64Coder;
import com.ibm.ws.security.common.structures.SingleTableCache;
import com.ibm.ws.security.openidconnect.clients.common.ClientConstants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.MockOidcClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientUtil;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.token.JWSHeader;
import com.ibm.ws.security.openidconnect.token.JWT;
import com.ibm.ws.security.openidconnect.token.JWTPayload;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@
import com.ibm.ws.security.common.structures.SingleTableCache;
import com.ibm.ws.security.openidconnect.client.jose4j.OidcTokenImpl;
import com.ibm.ws.security.openidconnect.client.jose4j.util.OidcTokenImplBase;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientConfig;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.test.common.CommonTestClass;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
import com.ibm.ws.security.oauth20.plugins.jose4j.JwtCreator;
import com.ibm.ws.security.openidconnect.clients.common.ConvergedClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientRequest;
import com.ibm.ws.security.openidconnect.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.server.internal.MockJWKProvider;
import com.ibm.ws.webcontainer.security.jwk.JSONWebKey;
import com.ibm.ws.webcontainer.security.openidconnect.OidcServerConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@
import com.ibm.ws.security.openidconnect.client.Cache;
import com.ibm.ws.security.openidconnect.client.internal.OidcClientConfigImpl;
import com.ibm.ws.security.openidconnect.client.internal.OidcClientImpl;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientUtil;
import com.ibm.ws.security.openidconnect.clients.common.OidcUtil;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.ReferrerURLCookieHandler;
import com.ibm.ws.webcontainer.security.SSOCookieHelperImpl;
import com.ibm.ws.webcontainer.security.WebAppSecurityCollaboratorImpl;
Expand Down
5 changes: 2 additions & 3 deletions dev/com.ibm.ws.security.openidconnect.clients.common/bnd.bnd
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,13 @@ WS-TraceGroup: \
Export-Package: \
com.ibm.ws.security.openidconnect.backchannellogout, \
com.ibm.ws.security.openidconnect.clients.common, \
com.ibm.ws.security.openidconnect.clients.common.token.auth, \
com.ibm.ws.security.openidconnect.client.jose4j.util.*, \
com.ibm.ws.security.openidconnect.jose4j.*, \
com.ibm.ws.security.openidconnect.token, \
com.ibm.ws.security.openidconnect.jwk, \
com.ibm.ws.security.openidconnect.pkce, \
com.ibm.ws.security.openidconnect.token.impl, \
com.ibm.ws.security.openidconnect.common, \
com.ibm.ws.security.openidconnect.common.token.auth
com.ibm.ws.security.openidconnect.token.impl

Import-Package: \
!*.internal.*, \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.ibm.ws.security.jwt.utils.JweHelper;
import com.ibm.ws.security.openidconnect.clients.common.AttributeToSubject;
import com.ibm.ws.security.openidconnect.clients.common.ClientConstants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.ConvergedClientConfig;
import com.ibm.ws.security.openidconnect.clients.common.JtiNonceCache;
import com.ibm.ws.security.openidconnect.clients.common.OIDCClientAuthenticatorUtil;
Expand All @@ -50,7 +51,6 @@
import com.ibm.ws.security.openidconnect.clients.common.OidcSessionInfo;
import com.ibm.ws.security.openidconnect.clients.common.OidcUtil;
import com.ibm.ws.security.openidconnect.clients.common.TraceConstants;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.jose4j.Jose4jValidator;
import com.ibm.ws.security.openidconnect.token.JWTTokenValidationFailedException;
import com.ibm.ws.webcontainer.security.AuthResult;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
import com.ibm.websphere.ras.TraceComponent;
import com.ibm.websphere.security.WSSecurityException;
import com.ibm.websphere.security.auth.WSSubject;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
// import com.ibm.websphere.security.openidconnect.token.IdToken;
import com.ibm.ws.security.openidconnect.clients.common.TraceConstants;
import com.ibm.ws.security.openidconnect.common.Constants;

public class OidcTokenImplBase implements Serializable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import com.ibm.ws.security.common.ssl.NoSSLSocketFactoryException;
import com.ibm.ws.security.common.structures.BoundedHashMap;
import com.ibm.ws.security.openidconnect.client.jose4j.util.Jose4jUtil;
import com.ibm.ws.security.openidconnect.clients.common.token.auth.TokenEndpointAuthMethod;
import com.ibm.ws.security.openidconnect.pkce.ProofKeyForCodeExchangeHelper;
import com.ibm.ws.security.openidconnect.common.token.auth.TokenEndpointAuthMethod;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
import com.ibm.wsspi.ssl.SSLSupport;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import java.util.Arrays;
import java.util.List;

import com.ibm.ws.security.openidconnect.common.Constants;

/**
* This is used by the openidconnect client code.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common;
package com.ibm.ws.security.openidconnect.clients.common;

import java.io.IOException;
import java.util.ArrayList;
Expand Down Expand Up @@ -41,7 +41,7 @@
* This is the config utility class
*/
public class ConfigUtils {
private static final TraceComponent tc = Tr.register(ConfigUtils.class, TraceConstants.TRACE_GROUP, TraceConstants.MESSAGE_BUNDLE);
private static final TraceComponent tc = Tr.register(ConfigUtils.class, TraceConstantsCommonMessages.TRACE_GROUP, TraceConstantsCommonMessages.MESSAGE_BUNDLE);
private final AtomicServiceReference<ConfigurationAdmin> configAdminRef;

private final CommonConfigUtils commonConfigUtils = new CommonConfigUtils();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common;
package com.ibm.ws.security.openidconnect.clients.common;

/**
* Common constants for OpenID Connect
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.common.ssl.NoSSLSocketFactoryException;
import com.ibm.ws.security.openidconnect.client.jose4j.util.Jose4jUtil;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.CookieHelper;
import com.ibm.ws.webcontainer.security.PostParameterHelper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.common.web.JavaScriptUtils;
import com.ibm.ws.security.common.web.WebSSOUtils;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.pkce.ProofKeyForCodeExchangeHelper;
import com.ibm.ws.webcontainer.security.AuthResult;
import com.ibm.ws.webcontainer.security.PostParameterHelper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
import com.ibm.websphere.ras.annotation.Sensitive;
import com.ibm.websphere.ras.annotation.Trivial;
import com.ibm.ws.security.common.crypto.HashUtils;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.token.IDTokenValidationFailedException;
import com.ibm.ws.security.openidconnect.token.JWTTokenValidationFailedException;
import com.ibm.ws.webcontainer.security.ReferrerURLCookieHandler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import com.ibm.ws.genericbnf.PasswordNullifier;
import com.ibm.ws.security.common.crypto.HashUtils;
import com.ibm.ws.security.common.http.HttpUtils;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.token.IDToken;
import com.ibm.ws.webcontainer.security.ReferrerURLCookieHandler;
import com.ibm.ws.webcontainer.security.WebAppSecurityCollaboratorImpl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common;
package com.ibm.ws.security.openidconnect.clients.common;

import java.util.List;

Expand All @@ -28,8 +28,8 @@
public abstract class OidcCommonClientRequest {

private static final TraceComponent tcCommon = Tr.register(OidcCommonClientRequest.class,
TraceConstants.TRACE_GROUP,
TraceConstants.MESSAGE_BUNDLE);
TraceConstantsCommonMessages.TRACE_GROUP,
TraceConstantsCommonMessages.MESSAGE_BUNDLE);

public static final String TYPE_ID_TOKEN = "ID Token";
public static final String TYPE_JWT_TOKEN = "Json Web Token";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import com.ibm.websphere.ras.TraceComponent;
import com.ibm.websphere.ras.annotation.Trivial;
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.CookieHelper;

import io.openliberty.security.oidcclientcore.storage.OidcStorageUtils;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import com.ibm.websphere.ras.Tr;
import com.ibm.websphere.ras.TraceComponent;
import com.ibm.ws.security.common.web.WebUtils;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.CookieHelper;

import io.openliberty.security.oidcclientcore.storage.OidcStorageUtils;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
/*******************************************************************************
* Copyright (c) 2011, 2018 IBM Corporation and others.
* Copyright (c) 2023 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common;
package com.ibm.ws.security.openidconnect.clients.common;

public interface TraceConstantsCommonMessages {

public interface TraceConstants {
public final static String TRACE_GROUP = "OpenIdConnect";
public final static String TRACE_GROUP = "OPENIDCONNECT";
public final static String MESSAGE_BUNDLE = "com.ibm.ws.security.openidconnect.common.internal.resources.OidcCommonMessages";
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import com.ibm.ws.security.jwt.utils.JweHelper;
import com.ibm.ws.security.openidconnect.client.jose4j.util.Jose4jUtil;
import com.ibm.ws.security.openidconnect.client.jose4j.util.OidcTokenImplBase;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.webcontainer.security.ProviderAuthenticationResult;
import com.ibm.wsspi.ssl.SSLSupport;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common.token.auth;
package com.ibm.ws.security.openidconnect.clients.common.token.auth;

import java.security.Key;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package com.ibm.ws.security.openidconnect.common.token.auth;
package com.ibm.ws.security.openidconnect.clients.common.token.auth;

import com.ibm.ws.security.openidconnect.clients.common.ConvergedClientConfig;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
*/
@org.osgi.annotation.versioning.Version("1.0")
@TraceOptions(traceGroup = TraceConstants.TRACE_GROUP, messageBundle = TraceConstants.MESSAGE_BUNDLE)
package com.ibm.ws.security.openidconnect.common.token.auth;
package com.ibm.ws.security.openidconnect.clients.common.token.auth;

import com.ibm.websphere.ras.annotation.TraceOptions;
import com.ibm.ws.security.openidconnect.common.TraceConstants;
import com.ibm.ws.security.openidconnect.clients.common.TraceConstants;

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
import com.ibm.websphere.ras.Tr;
import com.ibm.websphere.ras.TraceComponent;
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.OidcClientRequest;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.clients.common.OidcCommonClientRequest;
import com.ibm.ws.security.openidconnect.token.IDTokenValidationFailedException;
import com.ibm.ws.security.openidconnect.token.JWT;
import com.ibm.ws.security.openidconnect.token.JWTTokenValidationFailedException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import com.ibm.websphere.ras.annotation.Sensitive;
import com.ibm.ws.ffdc.FFDCFilter;
import com.ibm.ws.ffdc.annotation.FFDCIgnore;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;

public class JWT {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

import org.apache.commons.codec.binary.Base64;

import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.token.PayloadConstants;

public class IdTokenImpl implements Serializable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@
import org.junit.Test;

import com.ibm.ws.security.common.jwk.impl.JwKRetriever;
import com.ibm.ws.security.openidconnect.clients.common.Constants;
import com.ibm.ws.security.openidconnect.clients.common.ConvergedClientConfig;
import com.ibm.ws.security.openidconnect.common.Constants;
import com.ibm.ws.security.openidconnect.token.JWTTokenValidationFailedException;
import com.ibm.ws.security.test.common.CommonTestClass;
import com.ibm.wsspi.ssl.SSLSupport;
Expand Down
Loading

0 comments on commit 109b741

Please sign in to comment.