Commit Graph

1014 Commits

Author SHA1 Message Date
Adam Pardyl
e75b4a7d08 Merge "WindowManager ProtoLog feature" 2019-09-24 09:23:39 +00:00
Jiyong Park
acac2c9174 Merge changes Iea1d2ae2,I1d3c8e48 am: d708ea7b4a am: ebde74e7b1 am: fd4c08b689
am: 4de7f5eaac

Change-Id: Icf780d431f0dd596eee4d07ed26f33f5e0819ed9
2019-09-23 15:45:09 -07:00
TreeHugger Robot
c62ba18c94 Merge "Replacing @Nullable with @RecentlyNullable for apis annotated since API 28" 2019-09-23 19:29:51 +00:00
Adam Pardyl
0f1b3d4602 WindowManager ProtoLog feature
This CL implements the on-device part of ProtoLog
- the new logging system for WindowManager.

Design doc: go/windowmanager-log2proto

Change-Id: I2c88c97dabb3465ffc0615b8017b335a494bca59
Bug:
Test: atest FrameworksServicesTests:com.android.server.protolog protologtool-tests
2019-09-23 15:47:29 +00:00
Chen Xu
aeb356ca84 Merge "telephony-stack util API lib" 2019-09-23 03:05:52 +00:00
Chen Xu
192bf1f1e3 telephony-stack util API lib
attach copyable hidden util API classes to create a jar
file containing these, and statically link it from
telephony mainline modules. Need to jarjar those classes
otherwise classloader will load classes with the same
name in boot class path(framework.jar)

TODO: some Util APIs like AsyncResult which returned from
telephony-common library and used by other apps like Settings.
We should decouple Settings from telephony-common first before
we make a copy and rename AsyncResult.

Bug: 137202333
Test: Manual & Build
Change-Id: I81a6948246f1453481962699855560c2f64bb413
2019-09-20 16:50:04 -07:00
Jeff Gaston
1b51142eb6 Replacing @Nullable with @RecentlyNullable for apis annotated since API 28
(temporarily). This causes Metalava to downgrade @Nullable/@NonNull to
@RecentlyNullable/@RecentlyNonNull for now.

This should provide more time to migrate calling code.

Note that we're still checking compatibility against API 29.

Test: m api-stubs-docs # and unzip out/target/common/docs/api-stubs-docs-stubs.srcjar \
      and notice that @Nullable/@NonNull are replaced by @RecentlyNullable/@RecentlyNonNull

Test: m checkapi

Test: echo "package samplePackage { public class sampleClass { } }" >> prebuilts/sdk/29/public/api/android.txt \
      && m checkapi # and notice that it correctly reports an error

Bug: 140127380
Change-Id: I616438183ef80d1da7cbbe1c0eb01d1f71eaad8c
2019-09-20 16:36:02 -04:00
Jiyong Park
0d94fae8ac Merge "Use filter_packages to unbunden metalava" am: 385291c36d am: 14698c6e71 am: 382aaf00de
am: a02ab098db

Change-Id: I2d43dcd8190966610e874775024a5b83e262f751
2019-09-19 07:10:14 -07:00
Jiyong Park
b1d2701f76 Build java_sdk_libraries with much less sources
This change fixes a regression that java_sdk_libraries under
frameworks/base were built with all framework sources.

Bug: 141149570
Test: m
Change-Id: Iea1d2ae20ca1c5b514a52d8b2a22e8a1d7543efd
2019-09-17 23:17:47 +09:00
Jiyong Park
ae9972bda4 Use filter_packages to unbunden metalava
This change fixes a problem that entire framework source files are given
to metalava even when many of the source files are not for public. Using
the new property filter_packages, only source files that belongs to the
public packages are given to metalava.

This CL also changes the name of the filegroup 'framework-srcs' to
'framework-non-updatable-sources' to better describe its contents. In
addition, a build-time only library 'framework-all' is introduced. This
library produces a header jar for all framework sources for both
non-updatable and updatable parts. It is put to the classpath when
invoking metalava to give information on the hidden classes that were
filtered-out.

Bug: 140764681
Test: m
Change-Id: I6e16679109ac07820e35037754d4327442c014f2
2019-09-16 13:12:59 +09:00
Amit Mahajan
22e2260dd1 Merge "Move nist-sip from ext.jar to voip-common.jar" 2019-09-11 23:38:17 +00:00
Amit Mahajan
18f5877436 Move nist-sip from ext.jar to voip-common.jar
No component other than voip-common uses it.

Test: basic sanity
Bug: 140872785
Change-Id: Ie8c9a7266d1ed9ea67b43c9267610e236b6e547a
2019-09-11 14:00:54 -07:00
Adam Pardyl
5020703beb Fix a workaround for "required" property bug.
The build system does not propagate "required" properties correctly,
they need to be applied to the final installed java_library to work.

Bug:
Test: make

Change-Id: I7268a5bd56ee5be791782a0e584a9ada01538b98
2019-09-09 14:41:30 +02:00
Jiyong Park
70fb81076e Merge changes from topic "drop_circular_dep" into stage-aosp-master
* changes:
  Cut the dependency to framework from droiddoc modules
  Remove -without-aidls filegroups for the media apex.
2019-08-30 05:14:21 +00:00
Jiyong Park
5366ea2089 Cut the dependency to framework from droiddoc modules
droiddoc modules for the SDK API documentation and stubs library
generations have depended on the 'framework' (which was recently changed
to framework-minus-apex' module to get the list of Java source files to
be processed.

This however caused a circular dependency when we tried to modularize
some classes in the framework library as a separate library. The
separate java library depended on the stubs library (because it should
only use SDK APIs) and the stubs library depended on the framework
library. The framework library itself depended on the separated library
(or its stub) to use APIs from the separated library, thus forming a
circular dependency.

This change fixes the problem by directly giving the framework source
files via a filegroup `framework-sources-to-document` where all Java
and AIDL files that are to be documented are included in.

This change also put the generated R.java and Manifest.java files from
framework-res into the filegroup for framework sources.

Bug: 70046217
Bug: 135922046
Test: m

Exempt-From-Owner-Approval: Approved internally
Merged-In: I09ad88da47540d31ad089aad5e1151a4b6877ec2
(cherry picked from commit 20426538f8)
Change-Id: I09ad88da47540d31ad089aad5e1151a4b6877ec2
2019-08-30 05:14:08 +00:00
Jiyong Park
df6c25d518 Remove -without-aidls filegroups for the media apex.
When there is no *.aidl file in a filegroup, include path for the aidl
compiler is not set to the path property of the filegroup. This blocks
the plan to cut the dependency from API stubs libs to the framework,
because then we have to rely on the include paths deducted from the
input filegroups, rather than AIDL include paths exported from the
framework.

To make that happen, this change first removes the *-without-aidls
filegroups and replace the reference to them with the corresponding file
groups having AIDLs. Adding the AIDL files for media apex to the API
stubs is fine because the AIDL files are @hidden ones.

Bug: 70046217
Bug: 135922046
Test: m

Exempt-From-Owner-Approval: Approved internally
Merged-In: I794f6d0a7bcbef311d345d6e18ca311800af8ef4
(cherry picked from commit d2411f730f)
Change-Id: I794f6d0a7bcbef311d345d6e18ca311800af8ef4
2019-08-30 05:12:14 +00:00
Anna Trostanetski
bfd56df443 Merge "Remove prefix property from platform_compat_config module" am: cc55cca985 am: eb6576d67d am: 68c7df5124 am: d8327e2b74
am: d8ad090cf0

Change-Id: If371525951302629018504590bbb168f10d89107
2019-08-29 10:45:22 -07:00
Anna Trostanetski
eb6576d67d Merge "Remove prefix property from platform_compat_config module"
am: cc55cca985

Change-Id: Id0739fe8a6460a361243a029d259c608e3d9e736
2019-08-29 10:08:38 -07:00
atrost
7aa64a78ae Remove prefix property from platform_compat_config module
It's no longer needed as the configs moved to their own directory. Also CompatConfig now reads from the new location.
Bug: 140074769
Bug: 140092095
Test: m, atest FrameworksServicesTests

Change-Id: Ia800a63096693717b027c7291dc8005ca1c93fe5
2019-08-29 14:22:13 +01:00
Tobias Thierer
92d2e65f0f Merge changes from topic "bug136256059_revert" am: aff95e5e7c am: 2d7cc3acf3 am: 2cf0f7a6c3 am: 0e77247fee
am: 901f252e89

Change-Id: I89ff2c864f64f8f6498adcacba7eaed8026afcee
2019-08-29 04:14:19 -07:00
Tobias Thierer
2d7cc3acf3 Merge changes from topic "bug136256059_revert"
am: aff95e5e7c

Change-Id: I7b1caa27badbe5f77a0c12704d0050a6c15eb178
2019-08-29 03:25:10 -07:00
Tobias Thierer
aff95e5e7c Merge changes from topic "bug136256059_revert"
* changes:
  Revert "Move default MimeMap implementation to frameworks."
  Revert "Tweak RuntimeInit docs around MimeMap registration."
2019-08-29 10:05:20 +00:00
TreeHugger Robot
6149bebf66 Merge changes from topic "drop_circular_dep"
* changes:
  Cut the dependency to framework from droiddoc modules
  Remove -without-aidls filegroups for the media apex.
2019-08-29 01:18:45 +00:00
Jiyong Park
20426538f8 Cut the dependency to framework from droiddoc modules
droiddoc modules for the SDK API documentation and stubs library
generations have depended on the 'framework' (which was recently changed
to framework-minus-apex' module to get the list of Java source files to
be processed.

This however caused a circular dependency when we tried to modularize
some classes in the framework library as a separate library. The
separate java library depended on the stubs library (because it should
only use SDK APIs) and the stubs library depended on the framework
library. The framework library itself depended on the separated library
(or its stub) to use APIs from the separated library, thus forming a
circular dependency.

This change fixes the problem by directly giving the framework source
files via a filegroup `framework-sources-to-document` where all Java
and AIDL files that are to be documented are included in.

This change also put the generated R.java and Manifest.java files from
framework-res into the filegroup for framework sources.

Bug: 70046217
Bug: 135922046
Test: m

Change-Id: I09ad88da47540d31ad089aad5e1151a4b6877ec2
2019-08-29 07:44:38 +09:00
Tobias Thierer
f83bd777f3 Revert "Move default MimeMap implementation to frameworks."
This reverts commit 53f15f39f8.

Reason for revert: Caused slower app startup (I don't know why).

Change-Id: Id9e3811078bc435073f42996767589a711172400
2019-08-28 22:43:33 +00:00
Tiem Song
9baac69022 Merge "Update droiddoc with combined generation of Java and Kotlin docs" am: ca31913b92 am: fccf7d8949 am: 24838df3f3 am: 35b5db56c9
am: c330c997f5

Change-Id: Ica75d21ca628bafb77e23a056b7b498730b1f456
2019-08-27 18:38:32 -07:00
Jiyong Park
f4b1cdfe5d Merge "Use framework_native_aidl for AIDL files in frameworks/native/aidl"
am: 46993bb4f5

Change-Id: Ib87a5f2563707ffbd2eb2420487f618ee9eb39c7
2019-08-27 17:35:39 -07:00
Treehugger Robot
46993bb4f5 Merge "Use framework_native_aidl for AIDL files in frameworks/native/aidl" 2019-08-28 00:07:25 +00:00
Tiem Song
fccf7d8949 Merge "Update droiddoc with combined generation of Java and Kotlin docs"
am: ca31913b92

Change-Id: I1b701c9165800a22179b6a0d3cb161c27c908687
2019-08-27 15:20:47 -07:00
Tiem Song
730c19b99d Update droiddoc with combined generation of Java and Kotlin docs
Due to ownership change, this CL is a combination of the two CLs:

1) 1102398: Added droiddoc module to combined dokka, doclava and add
switcher.

Added ds-docs-switched that merges outputs of dokka, doclava, and
applies switcher4 to them.

Bug: 128540915
Test: m -j ds-docs-switched

===

2) 1098541: Combined target for dokka and doclava

Created a droiddoc module that creates reference docs using Kotlin.
Renamed droiddoc modules that only create one language ref-docs, and
created a genrule that merges them together.

Bug: 72394196
Bug: 138396395
Test: m -j ds-docs-kt
Test: m -j ds-docs-java
Test: m -j ds-docs

===

Change-Id: If9bed782feae84e986395a9ea6401025a51bc316
2019-08-26 22:44:49 -07:00
Jiyong Park
d2411f730f Remove -without-aidls filegroups for the media apex.
When there is no *.aidl file in a filegroup, include path for the aidl
compiler is not set to the path property of the filegroup. This blocks
the plan to cut the dependency from API stubs libs to the framework,
because then we have to rely on the include paths deducted from the
input filegroups, rather than AIDL include paths exported from the
framework.

To make that happen, this change first removes the *-without-aidls
filegroups and replace the reference to them with the corresponding file
groups having AIDLs. Adding the AIDL files for media apex to the API
stubs is fine because the AIDL files are @hidden ones.

Bug: 70046217
Bug: 135922046
Test: m

Change-Id: I794f6d0a7bcbef311d345d6e18ca311800af8ef4
2019-08-27 11:30:21 +09:00
Jiyong Park
5ca8fe3cfd Use framework_native_aidl for AIDL files in frameworks/native/aidl
The AIDL files under frameworks/native/aidl have been referenced via
their absolute paths. This required any module that has an AIDL file
depending on the AIDL types in the frameworks directory to explicitly
set the include path.

Fixing the problem by abstracting the AIDL files using filegroup where
the path property is set to the base directory for the files. The base
directory is used as include paths when the filegroup is added to srcs.

Bug: 135922046
Test: m
Test: m on sdk_phone_arm7
Merged-In: I8acb39522541f1e06d1a4b69b7a53b328c202eff
(cherry picked from commit 82f94056ce)
Change-Id: I8acb39522541f1e06d1a4b69b7a53b328c202eff
2019-08-27 02:20:39 +00:00
Jiyong Park
7563aabeb3 Remove duplicated sources that go into hiddenapi-mappins
framework-srcs are already coming from metalava-api-stubs-default (via
framework-minus-apex). We don't need to give framework-srcs again.

Test: choosecombo into sdk_phone_arm7
Test: m
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/api-versions.xml
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/dex-mapping.txt
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings-stubs.srcjar
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings_annotations.zip
is successful

Exempt-From-Owner-Approval: Approved internally
Merged-In: I9ea6e06e8bd388f3a495acb6ff5555c0ce2f75b2
(cherry picked from commit 68020f8f63)
Change-Id: I9ea6e06e8bd388f3a495acb6ff5555c0ce2f75b2
2019-08-27 10:46:42 +09:00
Treehugger Robot
8b4c9376c9 Merge "Implement sysprop_library API stability check" 2019-08-27 00:44:34 +00:00
Jiyong Park
d6be579720 Use filegroup to simplify Android.bp for frameworks and its friends
Java and AIDL source files under frameworks/base are now modularized
using filegroup. Each filegroup has 'path' property set to the base
directory of the ssource files. This allows us to not rely on
aidl.[local_]include_dirs and srcs_lib_whitelist_dirs to get the base
directories.

Bug: 70046217
Test: m
Exempt-From-Owner-Approval: Approved internally
Merged-In: I0705ddf76b3c628127f65d75e0a8b06c6c250fe2
(cherry picked from commit b360931bf0)
Change-Id: I0705ddf76b3c628127f65d75e0a8b06c6c250fe2
2019-08-26 08:09:49 +00:00
Tobias Thierer
89accb0841 Merge "Merge "Move default MimeMap implementation to frameworks." am: 19c3bdc88a am: 3f1d5d92fc am: 1b6d718387 am: 4999ce080d" into qt-qpr1-dev-plus-aosp
am: 867daa7d82

Change-Id: I8ff51aa59aeebda8d117e5142100b9b86ccbfac9
2019-08-24 01:14:13 -07:00
Jiyong Park
0323b4d8a3 Remove duplicated sources that go into hiddenapi-mappins
framework-srcs are already coming from metalava-api-stubs-default (via
framework-minus-apex). We don't need to give framework-srcs again.

Test: choosecombo into sdk_phone_arm7
Test: m
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/api-versions.xml
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/dex-mapping.txt
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings-stubs.srcjar
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings_annotations.zip
is successful

Exempt-From-Owner-Approval: Approved internally
Merged-In: I9ea6e06e8bd388f3a495acb6ff5555c0ce2f75b2
(cherry picked from commit 68020f8f63)
Change-Id: I9ea6e06e8bd388f3a495acb6ff5555c0ce2f75b2
2019-08-24 06:28:36 +00:00
Jiyong Park
7e1339e055 Use filegroup to simplify Android.bp for frameworks and its friends
Java and AIDL source files under frameworks/base are now modularized
using filegroup. Each filegroup has 'path' property set to the base
directory of the ssource files. This allows us to not rely on
aidl.[local_]include_dirs and srcs_lib_whitelist_dirs to get the base
directories.

Bug: 70046217
Test: m
Exempt-From-Owner-Approval: Approved internally
Merged-In: I0705ddf76b3c628127f65d75e0a8b06c6c250fe2
(cherry picked from commit b360931bf0)
Change-Id: I0705ddf76b3c628127f65d75e0a8b06c6c250fe2
2019-08-24 00:04:18 +00:00
Jiyong Park
68020f8f63 Remove duplicated sources that go into hiddenapi-mappins
framework-srcs are already coming from metalava-api-stubs-default (via
framework-minus-apex). We don't need to give framework-srcs again.

Test: choosecombo into sdk_phone_arm7
Test: m
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/api-versions.xml
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/dex-mapping.txt
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings-stubs.srcjar
out/soong/.intermediates/frameworks/base/hiddenapi-mappings/android_common/hiddenapi-mappings_annotations.zip
is successful

Change-Id: I9ea6e06e8bd388f3a495acb6ff5555c0ce2f75b2
2019-08-23 20:39:30 +09:00
Tobias Thierer
3f1d5d92fc Merge "Move default MimeMap implementation to frameworks."
am: 19c3bdc88a

Change-Id: I4bb456d64ad27dabb7db920d6e40dd32c92af900
2019-08-23 02:13:28 -07:00
Inseob Kim
b7c0cc3053 Implement sysprop_library API stability check
sysprop_library now checks the API stability itself, cutting dependency
on java_sdk_library. Under the directory {module_dir}/api,
{module_name}-current.txt and {module_name}-latest.txt hold API
signatures.

When sysprop_library is built, or a user run "m {module_name}-check-api"
command, API check is performed. First, current.txt must have exactly
same signature with built sysprop_library module. Second, current.txt
must be compatible with latest.txt.

Build system emits a handy error message to generate/update those API
files, in case of missing or mismatching. Also, a script file for
freezing API files is introduced.

Bug: 131637873
Test: 1) m && boot blueline
Test: 2) m {sysprop_library} performs API check
Test: 3) manual test for check-api, freezing api
Change-Id: I6d69fb418bac675bbb9e4ac25c3269dfa3029219
Merged-In: I6d69fb418bac675bbb9e4ac25c3269dfa3029219
Merged-In: I8217f0ad136df63f9861bdb3e18b9d0ae8812214
(cherry picked from commit 4fe9f0f8fd)
2019-08-23 06:29:05 +00:00
Jiyong Park
82f94056ce Use framework_native_aidl for AIDL files in frameworks/native/aidl
The AIDL files under frameworks/native/aidl have been referenced via
their absolute paths. This required any module that has an AIDL file
depending on the AIDL types in the frameworks directory to explicitly
set the include path.

Fixing the problem by abstracting the AIDL files using filegroup where
the path property is set to the base directory for the files. The base
directory is used as include paths when the filegroup is added to srcs.

Bug: 135922046
Test: m
Test: m on sdk_phone_arm7
Change-Id: I8acb39522541f1e06d1a4b69b7a53b328c202eff
2019-08-23 13:38:49 +09:00
Jiyong Park
b360931bf0 Use filegroup to simplify Android.bp for frameworks and its friends
Java and AIDL source files under frameworks/base are now modularized
using filegroup. Each filegroup has 'path' property set to the base
directory of the ssource files. This allows us to not rely on
aidl.[local_]include_dirs and srcs_lib_whitelist_dirs to get the base
directories.

Bug: 70046217
Test: m
Change-Id: I0705ddf76b3c628127f65d75e0a8b06c6c250fe2
2019-08-22 20:07:38 +09:00
Inseob Kim
90b0395647 Merge "Implement sysprop_library API stability check" into stage-aosp-master 2019-08-22 02:52:17 +00:00
Treehugger Robot
19c3bdc88a Merge "Move default MimeMap implementation to frameworks." 2019-08-21 16:39:33 +00:00
Tobias Thierer
53f15f39f8 Move default MimeMap implementation to frameworks.
This CL topic moves the default MimeMap implementation to frameworks.
Libcore starts with a minimal implementation sufficient to pass
CtsLibcoreTestCases,  but frameworks can inject the real implementation.
Before this CL topic, the data files and logic (MimeMapImpl) were part of
core-*.jar on device; after this CL, they instead live in framework.jar.

Tests from MimeMapTest that check behavior of that default
implementation also move to a non-libcore CTS test.

Specifically, the logic and android.mime.types now live in
frameworks/base/mime. The default implementation is injected
into libcore from RuntimeInit. I chose to use a separate directory
(frameworks/base/mime/) and build java_library target ("mimemap")
in order to keep this as separate as possible from the rest of
frameworks code, to make it as easy as possible to factor this
out into a separate APEX module if we ever choose to do so.

Planned work for follow-up CL:
 1. Make CTS more opinionated, with a plan to assert that all of
    the default mappings are present. How exactly the expectated
    mapping will be bundled in CTS is still TBD.
 2. Add a vendor.mime.types file (defaults to empty) where vendors
    can add additional mappings; I plan to make it such that mappings
    in that file are parsed last but never override any earlier
    mappings, as if each mime type / file extension was prefixed
    with '?'.
 3. Perhaps enforce that public APIs android.webkit.MimeTypeMap
    and java.net.URLConnection.getFileNameMap() behave consistently
    with MimeMap.getDefault().

Test: atest CtsLibcoreTestCases
Test: atest CtsMimeMapTestCases
Bug: 136256059
Change-Id: Ib955699694d24a25c33ef2445443afb7c35ed9e7
2019-08-21 14:46:50 +01:00
Anna Trostanetski
608e763d50 Merge "Add a platform-compat-config to the framework services." am: 6162efbfa7 am: 8ee5669a5e am: 8c41982cbe am: 6333182547
am: cbadaa42a2

Change-Id: I23f9f1adc2d83ad9cbd13532ff3c7598f2457c3a
2019-08-21 04:56:00 -07:00
Anna Trostanetski
8ee5669a5e Merge "Add a platform-compat-config to the framework services."
am: 6162efbfa7

Change-Id: Iad2e3ebdabad091387cba59fb4c8ac5bec60da97
2019-08-21 04:05:51 -07:00
Anna Trostanetski
6162efbfa7 Merge "Add a platform-compat-config to the framework services." 2019-08-21 10:53:33 +00:00
Inseob Kim
617a722048 Implement sysprop_library API stability check
sysprop_library now checks the API stability itself, cutting dependency
on java_sdk_library. Under the directory {module_dir}/api,
{module_name}-current.txt and {module_name}-latest.txt hold API
signatures.

When sysprop_library is built, or a user run "m {module_name}-check-api"
command, API check is performed. First, current.txt must have exactly
same signature with built sysprop_library module. Second, current.txt
must be compatible with latest.txt.

Build system emits a handy error message to generate/update those API
files, in case of missing or mismatching. Also, a script file for
freezing API files is introduced.

Bug: 131637873
Test: 1) m && boot blueline
Test: 2) m {sysprop_library} performs API check
Test: 3) manual test for check-api, freezing api
Change-Id: I6d69fb418bac675bbb9e4ac25c3269dfa3029219
Merged-In: I6d69fb418bac675bbb9e4ac25c3269dfa3029219
(cherry picked from commit 4fe9f0f8fd)
2019-08-21 01:38:10 +00:00