summaryrefslogtreecommitdiff
path: root/tests/net/java
Commit message (Collapse)AuthorAgeFilesLines
...
* | | | Merge "Adding support for multiple "default" networks" am: 8bb0310bbe am: ↵James Mattis2021-02-031-3/+3
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 0a3ad27abb am: 40ebaee7a5 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1532548 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ibcb06ea4004e988190ac8ae0dfaa2498d79777fb
| * | | Adding support for multiple "default" networksJames Mattis2021-02-021-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Updating ConnectivityService foundational support for multiple default networks by extending mDefaultRequest and mDefaultNetworkNai from single instances to a HashMap to support more than a single default network. Bug: 176027457 Bug: 172347841 Test: atest FrameworksNetTests atest NetworkStackTests atest FrameworksNetIntegrationTests atest NetworkStackIntegrationTests atest CtsNetTestCasesLatestSdk Change-Id: I2f5fa96c2d21ab883499e82afa74e73f3ca606cd
* | | | Merge "Update frameworks to use unbundled version of BouncyCastle." am: ↵Treehugger Robot2021-02-021-1/+1
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 19547685bb am: 36adf13e62 am: c3c1cd54e4 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1559779 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Iaf00137fbdfc3dacd99537f9f4e2da0ffbc9a844
| * | | Merge "Update frameworks to use unbundled version of BouncyCastle."Treehugger Robot2021-02-021-1/+1
| |\ \ \
| | * | | Update frameworks to use unbundled version of BouncyCastle.Daulet Zhanguzin2021-01-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously BouncyCastle methods were exposed as libcore APIs (@CorePlatformApi), which no longer possible when ART is updatable module (and can't guarantee BouncyCastle API stability) Bug: 154796679 Test: Treehugger Change-Id: I908681841a6766de88761767c77c4e2d4b5f56d5
* | | | | Merge changes I4f38a539,Id4f6c7f4 am: 22823382e4 am: f344ab8f12 am: 41db574a4dLorenzo Colitti2021-02-021-31/+13
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1565198 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I49cd86725c481827b4278e05afd4847c3a06e8d7
| * | | | Improve testing for network blocking.Lorenzo Colitti2021-02-021-31/+13
| | |_|/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This simplifies the uidNetworkingBlocked method and makes it more realistic by supporting more combinations of rules than just the four used by this test. Also support RULE_ALLOW_METERED, and add test coverage for it. Test: test-only change Change-Id: Id4f6c7f41429f3ae7841d3214b3e5e95ec591f85
* | | | Merge changes Idcc9e32c,I58769bb7 am: d4caba4daf am: 2425886baa am: 4cb54827a0Lorenzo Colitti2021-02-011-2/+69
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1552503 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I3d15c00910467d51531a25c025efb491b446b6a4
| * | | Merge changes Idcc9e32c,I58769bb7Lorenzo Colitti2021-02-011-2/+69
| |\ \ \ | | |_|/ | |/| | | | | | | | | | | | | | * changes: Remove getFilteredNetworkState and add @NonNull in NetworkState. Add test coverage for get*NetworkInfo on metered networks.
| | * | Add test coverage for get*NetworkInfo on metered networks.Lorenzo Colitti2021-02-011-2/+69
| | | | | | | | | | | | | | | | | | | | Test: test-only change Change-Id: I58769bb768978d0acff1da6d32c2f6942c43508b
* | | | Merge "[FUI04] Refactor VpnInfo" am: 561626b20d am: 0824b59f74 am: 9e10a5a1efJunyu Lai2021-01-294-65/+97
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1537211 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Icfa9918e41fc3f952a23956108df4db449741364
| * | | Merge "[FUI04] Refactor VpnInfo"Junyu Lai2021-01-294-65/+97
| |\ \ \ | | |/ / | |/| |
| | * | [FUI04] Refactor VpnInfojunyulai2021-01-294-65/+97
| | |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As a preparation of exposing system API. This patch does some harmless refactoring, which includes: 1. Change raw arrays into lists according to API guidelines. 2. Write test. 3. Rename class to UnderlyingNetworkInfo. 4. Rename vpnIface to iface. 5. Make underlyingIfaces @NonNull in order to adapt new unparceling code. 6. implement equals and hashCode for testing. Test: atest android.net.UnderlyingNetworkInfoTest Bug: 174123988 Change-Id: I405c21e57c4af8a12a9dd0a1749b9e6690f87045
* | | Merge "[VCN06] Support request background network" am: 7e0d8315d1 am: ↵Junyu Lai2021-01-292-3/+14
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | 5fa77ae82c am: 5ad75875bf Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1553866 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I50867bc7cb21eb134f20af9ef55c44c2bd8962e9
| * | Merge "[VCN06] Support request background network"Junyu Lai2021-01-292-3/+14
| |\ \
| | * | [VCN06] Support request background networkJunyu Lai2021-01-292-3/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This will be mainly used by VCN management service which will need to hold the networks but preserve the backgrounded-ness of the networks. Test: android.net.ConnectivityManagerTest#testRequestType Test: android.net.cts.ConnectivityManagerTest#testRequestBackgroundNetwork / --rerun-until-failure 100 Test: ConnectivityServiceTest#testBackgroundNetworks Test: m -j doc-comment-check-docs Bug: 175662146 Change-Id: I463c7a3139a286e50ea71e674060975ce228caa9
* | | | Merge "[VCN01] Add NOT_VCN_MANAGED capability" am: ce07556044 am: 6373b3b084 ↵Junyu Lai2021-01-281-26/+57
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | am: 8062b53a7c Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1549897 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ide501fcf659637c0ec175d3f6f5926c2482734e0
| * | | Merge "[VCN01] Add NOT_VCN_MANAGED capability"Junyu Lai2021-01-281-26/+57
| |\ \ \
| | * | | [VCN01] Add NOT_VCN_MANAGED capabilityJunyu Lai2021-01-271-26/+57
| | |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add new capability to indicate whether a network is managed by Virtual Carrier Network (VCN). This is needed to identify networks between VCN managed network and others. And this capability will be: 1. mutable 2. requestable 3. set by default for network agents and requests 4. allowed for test networks Note that this commit is identical to aosp/1529959 except the capability remains hidden to address the javadoc problem first. And this CL also needs to be bound with the counter part change to prevent build breakage. Test: 1. atest FrameworksNetTests CtsNetTestCases 2. adb shell dumpsys connectivity 3. atest ConnectivityServiceTest#testLoseMutableAndRequestableCaps Bug: 175662146 Change-Id: I37a6f492c2aba72836e36851b50b67398f8bdd36
| * | | Merge "Note network interfaces based on transport"Treehugger Robot2021-01-281-12/+14
| |\ \ \
| | * | | Note network interfaces based on transportRemi NGUYEN VAN2021-01-281-12/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of classifying interfaces by network type in BatteryStats, classify them based on the transports array provided by the NetworkAgent. Network types are deprecated and transports should be used instead. This change allows BatteryStats to stop depending on unstable APIs such as isNetworkTypeMobile. This change also updates nullability annotations in ConnectivityService and NetworkAgentInfo to show that the NetworkCapabilities are non-null (as provided by the network agent) when calling noteNetworkInterfaceTransports. Bug: 174436414 Test: atest atest ConnectivityServiceTest#testBatteryStatsNetworkType \ --rerun-until-failure 40 Merged-In: I4e928fac8a57a9b1fc758a44af2a5719b8c871b8 Change-Id: I4e928fac8a57a9b1fc758a44af2a5719b8c871b8
* | | | | Merge "Fix legacy APIs when VPN switches to suspended underlying network." ↵Lorenzo Colitti2021-01-281-19/+10
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | am: 4452f55a2e am: f8bac85e95 am: 2a0bb42e8e Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1547497 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I21c1c7913987a2bb4d486e6ce8da24a76ddf2dc6
| * | | | Merge "Fix legacy APIs when VPN switches to suspended underlying network."Lorenzo Colitti2021-01-281-19/+10
| |\ \ \ \ | | |_|_|/ | |/| | |
| | * | | Fix legacy APIs when VPN switches to suspended underlying network.Lorenzo Colitti2021-01-201-19/+10
| | |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently, when the VPN underlying network changes from a network that is not suspended to one that is suspended (or vice versa), some of the legacy APIs return incorrect results. This is because the VPN's NetworkInfo can get into SUSPENDED state even though the capabilities have the NOT_SUSPENDED capability. This happens because the code in updateCapabilities that checks for changes in NOT_SUSPENDED and NOT_ROAMING (which are the capabilities that can affect the NetworkInfo state) is only run when the capabilities change in a certain way. Fix this by always checking for changes in these capabilities, regardless of what else has changed. This results in sending a lot more SUSPENDED and RESUMED callbacks than the code sent previously. This should hopefully not impact apps because those callback methods have never been public API, though because they're just callbacks, it's possible that apps found out via code inspection that the callbacks existed and implemented them. Bug: 172870110 Test: changes to existing tests in ConnectivityServiceTest Change-Id: I6ec246a6a4e61f634956a165797fbb80296efd6a
* | | | Merge "Revert "Revert "Note network interfaces based on transport""" into sc-devTreeHugger Robot2021-01-281-12/+14
|\ \ \ \
| * | | | Revert "Revert "Note network interfaces based on transport""Remi NGUYEN VAN2021-01-271-12/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of classifying interfaces by network type in BatteryStats, classify them based on the transports array provided by the NetworkAgent. Network types are deprecated and transports should be used instead. This change allows BatteryStats to stop depending on unstable APIs such as isNetworkTypeMobile. This change also updates nullability annotations in ConnectivityService and NetworkAgentInfo to show that the NetworkCapabilities are non-null (as provided by the network agent) when calling noteNetworkInterfaceTransports. This is rolling forward a previously reverted change. The new change also fixes MobileRadioPowerCalculatorTest that was broken when submitting the previous change. Bug: 174436414 Test: atest atest ConnectivityServiceTest#testBatteryStatsNetworkType \ --rerun-until-failure 40 Merged-In: I4e928fac8a57a9b1fc758a44af2a5719b8c871b8 Change-Id: I4e928fac8a57a9b1fc758a44af2a5719b8c871b8 (cherry picked from commit 2d17d202bc709c205506c03149d847f00f92d78d)
* | | | | Merge "[FUI03] No-op refactoring of VpnInfo" am: f9dbe61693 am: b0989fd2d2 ↵Treehugger Robot2021-01-274-12/+6
|\ \ \ \ \ | |/ / / / |/| / / / | |/ / / | | | | | | | | | | | | | | | | | | | | | | | | am: 046ebf41b7 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1547637 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I05e6b14fca44919610317831c147413b0a431224
| * | / [FUI03] No-op refactoring of VpnInfojunyulai2021-01-274-12/+6
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As a preparation of exposing system API. This patch does some harmless refactoring, which includes: 1. Move VpnInfo to android.net 2. Add nullability annotations 3. Make members final Bug: 174123988 Test: TH Change-Id: I1530bb45d0e84c28c6deac33596bc686058afc0d
* | | Merge changes I713bc2ec,Ib9ab07c9 am: 3795a7d1d2 am: d8b7ab2076 am: 2d6430198cTreehugger Robot2021-01-272-69/+4
|\| | | | | | | | | | | | | | | | | | | | | | | Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1537264 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I4b291a4e82b89d3808e9bcd980d5b2aa4d2b1b71
| * | Merge changes I713bc2ec,Ib9ab07c9Treehugger Robot2021-01-262-69/+4
| |\ \ | | | | | | | | | | | | | | | | | | | | * changes: [FUI05] Remove wimax data usage unit test [FUI14] Get SSID from NetworkCapabilities
| | * | [FUI05] Remove wimax data usage unit testjunyulai2021-01-221-67/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In follow-up patches, the network type will be derived from transport types, which officially doesn't support wimax. Thus, remove the test which rely on it first since it is not needed and will not be needed. Test: atest FrameworksNetTests Bug: 174123988 Change-Id: I713bc2ec39e3a4fa19ed13d2e9ff9ae35477d726
| | * | [FUI14] Get SSID from NetworkCapabilitiesjunyulai2021-01-222-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This allows subsequent patches to remove the need of exposing SSID in NetworkState. Test: atest NetworkStatsServiceTest Bug: 174123988 Change-Id: Ib9ab07c9610954c9a5de035a3aefbf6d0bb0b53b
* | | | Merge "Revert "Note network interfaces based on transport""Remi NGUYEN VAN2021-01-261-14/+12
|\ \ \ \
| * | | | Revert "Note network interfaces based on transport"Remi NGUYEN VAN2021-01-261-14/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit ef0d81b294aa8c9d554084209037b7b2604406e6. Reason for revert: Broke build of tests: b/178441996 Change-Id: Idaf35fa02f76852fa8134b0d505467007f6d0f60
* | | | | Merge "Note network interfaces based on transport"Remi NGUYEN VAN2021-01-261-12/+14
|\| | | |
| * | | | Note network interfaces based on transportRemi NGUYEN VAN2021-01-201-12/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of classifying interfaces by network type in BatteryStats, classify them based on the transports array provided by the NetworkAgent. Network types are deprecated and transports should be used instead. This change allows BatteryStats to stop depending on unstable APIs such as isNetworkTypeMobile. This change also updates nullability annotations in ConnectivityService and NetworkAgentInfo to show that the NetworkCapabilities are non-null (as provided by the network agent) when calling noteNetworkInterfaceTransports. Bug: 174436414 Test: atest atest ConnectivityServiceTest#testBatteryStatsNetworkType \ --rerun-until-failure 40 Change-Id: Icc912473d97a42eef73eb953607c9161fdbeb794
* | | | | Merge "Add method to match address \ port with QosFilter" am: 8910e2c51b am: ↵Daniel Bright2021-01-261-0/+75
|\ \ \ \ \ | | |/ / / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ccc311dde9 am: 28f288ea56 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1510591 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Id9951a0be8821192e3fb403787d096c538d691cf
| * | | | Add method to match address \ port with QosFilterDaniel Bright2021-01-221-0/+75
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * The match method is only for local address and port since we have no other use case. Bug: 155176305 Test: Added new test Change-Id: I7b45f9912af6a192fc60606f5e0b4cc479aea93f
* | | | Merge "Add Qos Callback support" am: 8e39c04b56 am: d52695827d am: cc08384548Chalard Jean2021-01-222-4/+168
|\| | | | |/ / |/| | | | | | | | | | | | | | | | | Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1386623 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: If0a123f16951c88cc5881fba8865fae822ba92f0
| * | Add Qos Callback supportDaniel Bright2021-01-212-4/+168
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Provide App Developers Qos related info associated to a bound socket through ConnectivityManager * Qos sessions are generated and filtered by Network Agents and sent back through the Connectivity Service to the API consumer. * The structure of the code within com.android.server is designed to support different types of filters in the the future. * The first type of Qos Attributes are related to EPS Bearers in order support RCS. Bug: 155176305 Test: Added to cts/NetworkAgentTest Test: Added to ConnectivityServiceTest Change-Id: I145dd065d9deeee449eb9695ab3f6c8556ee7c09
* | Merge "Revert "[VCN06] Support request background network"" am: b380466d29 ↵Junyu Lai2021-01-192-14/+3
|\| | | | | | | | | | | | | | | | | | | am: 932ab25ed6 am: 707465a26a Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1553864 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I896c2008e29163527b03f031623e1c70d16e1da4
| * Merge "Revert "[VCN06] Support request background network""Junyu Lai2021-01-192-14/+3
| |\
| | * Revert "[VCN06] Support request background network"Junyu Lai2021-01-192-14/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Revert submission 1545847-vcn06 Reason for revert: b/177876289 presubmit failure Reverted Changes: I8042ce197:[VCN06.1] Add CTS for request background network If9aaa87b7:[VCN06] Support request background network Change-Id: I9270b02a2d6d1ffcdd83b4f41becaf09a2b91e0a
* | | Merge changes I475502fd,Ibf376a6f,Ia52f9caf am: 58a2186be0 am: 6ff1005d16 ↵Treehugger Robot2021-01-191-8/+141
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | am: 4a5b422455 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1553958 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Ic7c2c6289bcc469f43f0293ca4bfd7d6b15ce80a
| * | Merge changes I475502fd,Ibf376a6f,Ia52f9cafTreehugger Robot2021-01-191-8/+141
| |\ \ | | | | | | | | | | | | | | | | | | | | | | | | * changes: Address comments on aosp/1539753, aosp/1542487 and aosp/1547496. Fix propagating underlying caps when a network disconnects. Test for bugs with suspended VPN underlying networks.
| | * | Address comments on aosp/1539753, aosp/1542487 and aosp/1547496.Lorenzo Colitti2021-01-191-9/+19
| | | | | | | | | | | | | | | | | | | | | | | | Bug: 173331190 Test: test-only change Change-Id: I475502fde55d24e7ae3f7fe9f43c54740c57a9cf
| | * | Fix propagating underlying caps when a network disconnects.Lorenzo Colitti2021-01-191-10/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | aosp/1513052, which generalized support for underlying networks, broke default network switching when the network underlying a VPN disconnects. This is because it calls propagateUnderlyingNetworkCapabilities in the middle of the bookkeeping operations needed when a network is disconnected (specifically, after all satisified requests are removed from the disconnecting network, but before mDefaultNetworkNai is updated). This is completely incorrect because propagateUnderlyingNetworkCapabilities can trigger a network rematch, and running a rematch when the request data structures are inconsistent is obviously wrong. See the test changes in this CL for an example of the damage. Fix this by moving propagateUnderlyingNetworkCapabilities to before the bookeeping operations begin. It must be before mDefaultNetworkNai is updated, because otherwise it will not know that the default network is disconnecting, and it will not be able to propagate capabilities to VPNs that set underlying networks to null (i.e., to the default network). It must be after the nai is removed from mNetworkForNetId because otherwise it will think that the underlying network is still connected. Bug: 173331190 Test: accompanying unit test shows lots of bugs removed Change-Id: Ibf376a6fa4b34d1c96f8506fa8abbb7595a8c272
| | * | Test for bugs with suspended VPN underlying networks.Lorenzo Colitti2021-01-191-0/+115
| | | | | | | | | | | | | | | | | | | | Test: atest --rerun-until-failure 100 ConnectivityServiceTest#testVpnSwitchFromSuspendedToNonSuspended Change-Id: Ia52f9cafef3f49ae70ad135d017e207eb57fddfe
* | | | Merge "[VCN06] Support request background network" am: a18490bdde am: ↵Junyu Lai2021-01-192-3/+14
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 1856a60c7b am: 645596b998 Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1545847 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I12d2cbe4a5fc10a7ec7abf8038c088fe13b02d59
| * | | Merge "[VCN06] Support request background network"Junyu Lai2021-01-192-3/+14
| |\ \ \ | | |/ / | |/| / | | |/