Closed shagufta-codit closed 1 year ago
I see that you've got the following very old dependency that's pulling in an old version of guava:
[INFO] +- com.google.apis:google-api-services-content:jar:v2-rev22-1.19.0:compile
[INFO] | \- com.google.api-client:google-api-client:jar:1.19.0:compile
[INFO] | +- com.google.oauth-client:google-oauth-client:jar:1.19.0:compile
[INFO] | +- com.google.http-client:google-http-client-jackson2:jar:1.19.0:compile
[INFO] | \- com.google.guava:guava-jdk5:jar:13.0:compile
Could you remove that dependency or move to a more recent version and let me know if that helps?
Thanks, Josh, Google Ads API Team
Thanks for your response. I updated the dependency to latest version and the issue is fixed now.
I am closing the ticket.
Describe the bug: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;)V at com.google.ads.googleads.lib.GoogleAdsClient$Builder.build(GoogleAdsClient.java:603) ~[google-ads-28.0.0.jar:28.0.0] at com.tapclicks.integrations.google.googleads.service.GoogleAdsService.getGoogleAdsClient(GoogleAdsService.java:252) ~[classes/:na] at com.tapclicks.integrations.google.googleads.service.GoogleAdsService.runPostOperations(GoogleAdsService.java:194) ~[classes/:na] at com.tapclicks.integrations.google.googleads.service.GoogleAdsService.dispatchPost(GoogleAdsService.java:162) ~[classes/:na] at com.tapclicks.integrations.google.googleads.controller.GoogleAdsController.post(GoogleAdsController.java:31) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_382] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_382] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_382] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_382] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:661) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.11.RELEASE.jar:4.3.11.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110) ~[spring-boot-actuator-1.5.7.RELEASE.jar:1.5.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) ~[spring-boot-actuator-1.5.7.RELEASE.jar:1.5.7.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457) [tomcat-embed-core-8.5.20.jar:8.5.20] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.20.jar:8.5.20] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_382] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_382] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.20.jar:8.5.20] at java.lang.Thread.run(Thread.java:750) [na:1.8.0_382]
Steps to Reproduce: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkState(ZLjava/lang/String;Ljava/lang/Object;)V
Expected behavior: The request should have went through and created a campaign for the same
Client library version and API version: Client library version: java 8 Google Ads API version: V15 JDK version: 1.8
Request/Response Logs:
Anything else we should know about your project / environment: below is the list of dependencies I am using:
--- maven-dependency-plugin:2.10:tree (default-cli) @ TapOrdersIntegrations --- [INFO] com.tapclicks.integrations:TapOrdersIntegrations:jar:0.1 [INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:1.5.7.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.5.7.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.7.RELEASE:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.1.11:compile [INFO] | | | | - ch.qos.logback:logback-core:jar:1.1.11:compile [INFO] | | | +- org.slf4j:jcl-over-slf4j:jar:1.7.25:compile [INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.25:compile [INFO] | | | - org.slf4j:log4j-over-slf4j:jar:1.7.25:compile [INFO] | | - org.yaml:snakeyaml:jar:1.17:runtime [INFO] | - org.springframework.boot:spring-boot-actuator:jar:1.5.7.RELEASE:compile [INFO] | - org.springframework:spring-context:jar:4.3.11.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.5.7.RELEASE:compile [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.7.RELEASE:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.20:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.20:compile [INFO] | | - org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.20:compile [INFO] | +- org.hibernate:hibernate-validator:jar:5.3.5.Final:compile [INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] | | +- org.jboss.logging:jboss-logging:jar:3.3.1.Final:compile [INFO] | | - com.fasterxml:classmate:jar:1.3.4:compile [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.10:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile [INFO] | | - com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile [INFO] | +- org.springframework:spring-web:jar:4.3.11.RELEASE:compile [INFO] | | +- org.springframework:spring-aop:jar:4.3.11.RELEASE:compile [INFO] | | - org.springframework:spring-beans:jar:4.3.11.RELEASE:compile [INFO] | - org.springframework:spring-webmvc:jar:4.3.11.RELEASE:compile [INFO] | - org.springframework:spring-expression:jar:4.3.11.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-devtools:jar:1.5.7.RELEASE:runtime [INFO] | +- org.springframework.boot:spring-boot:jar:1.5.7.RELEASE:compile [INFO] | - org.springframework.boot:spring-boot-autoconfigure:jar:1.5.7.RELEASE:compile [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:1.5.7.RELEASE:test [INFO] | +- org.springframework.boot:spring-boot-test:jar:1.5.7.RELEASE:test [INFO] | +- org.springframework.boot:spring-boot-test-autoconfigure:jar:1.5.7.RELEASE:test [INFO] | +- com.jayway.jsonpath:json-path:jar:2.2.0:test [INFO] | | - net.minidev:json-smart:jar:2.2.1:test [INFO] | | - net.minidev:accessors-smart:jar:1.1:test [INFO] | | - org.ow2.asm:asm:jar:5.0.3:test [INFO] | +- junit:junit:jar:4.12:test [INFO] | +- org.assertj:assertj-core:jar:2.6.0:test [INFO] | +- org.mockito:mockito-core:jar:1.10.19:test [INFO] | | - org.objenesis:objenesis:jar:2.1:test [INFO] | +- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] | +- org.hamcrest:hamcrest-library:jar:1.3:test [INFO] | +- org.skyscreamer:jsonassert:jar:1.4.0:test [INFO] | | - com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] | +- org.springframework:spring-core:jar:4.3.11.RELEASE:compile [INFO] | - org.springframework:spring-test:jar:4.3.11.RELEASE:test [INFO] +- com.google.apis:google-api-services-content:jar:v2-rev22-1.19.0:compile [INFO] | - com.google.api-client:google-api-client:jar:1.19.0:compile [INFO] | +- com.google.oauth-client:google-oauth-client:jar:1.19.0:compile [INFO] | +- com.google.http-client:google-http-client-jackson2:jar:1.19.0:compile [INFO] | - com.google.guava:guava-jdk5:jar:13.0:compile [INFO] +- com.google.oauth-client:google-oauth-client-jetty:jar:1.30.4:compile [INFO] | +- com.google.oauth-client:google-oauth-client-java6:jar:1.30.4:compile [INFO] | - org.eclipse.jetty:jetty-server:jar:9.4.6.v20170531:compile [INFO] | +- javax.servlet:javax.servlet-api:jar:3.1.0:compile [INFO] | +- org.eclipse.jetty:jetty-http:jar:9.4.6.v20170531:compile [INFO] | | - org.eclipse.jetty:jetty-util:jar:9.4.6.v20170531:compile [INFO] | - org.eclipse.jetty:jetty-io:jar:9.4.6.v20170531:compile [INFO] +- org.glassfish:javax.json:jar:1.0.4:compile [INFO] +- com.google.api-ads:google-ads:jar:28.0.0:compile [INFO] | +- com.google.api:gax:jar:2.32.0:compile [INFO] | | +- com.google.api:api-common:jar:2.15.0:compile [INFO] | | +- com.google.api.grpc:proto-google-common-protos:jar:2.23.0:compile [INFO] | | +- org.threeten:threetenbp:jar:1.6.8:compile [INFO] | | - io.opencensus:opencensus-api:jar:0.31.1:compile [INFO] | | - io.grpc:grpc-context:jar:1.27.2:compile [INFO] | +- com.google.api:gax-grpc:jar:2.32.0:compile [INFO] | | +- io.grpc:grpc-api:jar:1.56.1:compile [INFO] | | +- io.grpc:grpc-alts:jar:1.56.1:compile [INFO] | | | +- io.grpc:grpc-grpclb:jar:1.56.1:compile [INFO] | | | - org.conscrypt:conscrypt-openjdk-uber:jar:2.5.2:compile [INFO] | | +- io.grpc:grpc-auth:jar:1.56.1:compile [INFO] | | +- io.grpc:grpc-netty-shaded:jar:1.56.1:compile [INFO] | | | +- io.perfmark:perfmark-api:jar:0.26.0:runtime [INFO] | | | - io.grpc:grpc-core:jar:1.56.1:compile [INFO] | | | +- com.google.android:annotations:jar:4.1.1.4:runtime [INFO] | | | - org.codehaus.mojo:animal-sniffer-annotations:jar:1.23:runtime [INFO] | | - io.grpc:grpc-googleapis:jar:1.56.1:runtime [INFO] | | - io.grpc:grpc-xds:jar:1.56.1:runtime [INFO] | | +- io.opencensus:opencensus-proto:jar:0.2.0:runtime [INFO] | | +- io.grpc:grpc-services:jar:1.56.1:runtime [INFO] | | - com.google.re2j:re2j:jar:1.7:runtime [INFO] | +- com.google.protobuf:protobuf-java:jar:3.23.2:compile [INFO] | +- io.grpc:grpc-stub:jar:1.56.1:compile [INFO] | | - com.google.errorprone:error_prone_annotations:jar:2.18.0:compile [INFO] | +- io.grpc:grpc-protobuf:jar:1.56.1:compile [INFO] | | +- com.google.code.findbugs:jsr305:jar:3.0.2:compile [INFO] | | - io.grpc:grpc-protobuf-lite:jar:1.56.1:compile [INFO] | +- com.google.auth:google-auth-library-oauth2-http:jar:1.19.0:compile [INFO] | | +- com.google.http-client:google-http-client:jar:1.42.3:compile [INFO] | | | +- org.apache.httpcomponents:httpclient:jar:4.5.3:compile [INFO] | | | | - commons-codec:commons-codec:jar:1.10:compile [INFO] | | | +- org.apache.httpcomponents:httpcore:jar:4.4.6:compile [INFO] | | | - io.opencensus:opencensus-contrib-http-util:jar:0.31.1:compile [INFO] | | - com.google.http-client:google-http-client-gson:jar:1.42.3:compile [INFO] | +- com.google.auth:google-auth-library-credentials:jar:1.19.0:compile [INFO] | +- com.google.api-ads:google-ads-codegen:jar:28.0.0:compile [INFO] | | +- com.google.api-ads:google-ads-stubs-lib:jar:28.0.0:compile [INFO] | | +- com.google.api-ads:google-ads-stubs-v13:jar:28.0.0:compile [INFO] | | +- com.google.api-ads:google-ads-stubs-v14:jar:28.0.0:compile [INFO] | | +- com.google.api-ads:google-ads-stubs-v15:jar:28.0.0:compile [INFO] | | - com.squareup:javapoet:jar:1.11.1:runtime [INFO] | +- com.google.protobuf:protobuf-java-util:jar:3.23.2:runtime [INFO] | | +- com.google.code.gson:gson:jar:2.8.1:compile [INFO] | | - com.google.j2objc:j2objc-annotations:jar:1.3:compile [INFO] | +- com.google.guava:guava:jar:32.1.2-jre:compile [INFO] | | +- com.google.guava:failureaccess:jar:1.0.1:compile [INFO] | | +- com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile [INFO] | | - org.checkerframework:checker-qual:jar:3.33.0:compile [INFO] | +- com.google.auto.service:auto-service:jar:1.0.1:runtime [INFO] | | +- com.google.auto.service:auto-service-annotations:jar:1.0.1:runtime [INFO] | | - com.google.auto:auto-common:jar:1.2:runtime [INFO] | +- javax.annotation:javax.annotation-api:jar:1.3.2:compile [INFO] | +- org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] | - com.google.auto.value:auto-value-annotations:jar:1.10.2:compile [INFO] - com.opencsv:opencsv:jar:4.1:compile [INFO] +- org.apache.commons:commons-lang3:jar:3.6:compile [INFO] +- org.apache.commons:commons-text:jar:1.1:compile [INFO] - commons-beanutils:commons-beanutils:jar:1.9.3:compile [INFO] - commons-collections:commons-collections:jar:3.2.2:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.810 s [INFO] Finished at: 2023-10-27T12:00:35+05:30 [INFO] ------------------------------------------------------------------------