Skip to content

Commit 45af4bd

Browse files
authored
Merge pull request #298 from MicrosoftDocs/master
rmerge
2 parents dc1db62 + a4c847f commit 45af4bd

File tree

315 files changed

+5085
-3555
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

315 files changed

+5085
-3555
lines changed

.openpublishing.redirection.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56257,6 +56257,11 @@
5625756257
"source_path_from_root": "/articles/governance/policy/how-to/guestconfiguration-create-linux.md",
5625856258
"redirect_url": "/azure/governance/policy/how-to/guest-configuration-create",
5625956259
"redirect_document_id": false
56260+
},
56261+
{
56262+
"source_path_from_root": "/articles/storage/files/storage-files-enable-smb-multichannel.md",
56263+
"redirect_url": "/azure/storage/files/files-smb-protocol#smb-multichannel",
56264+
"redirect_document_id": false
5626056265
}
5626156266
]
5626256267
}

articles/active-directory-b2c/deploy-custom-policies-devops.md

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: how-to
12-
ms.date: 06/01/2021
12+
ms.date: 08/26/2021
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -52,8 +52,8 @@ Param(
5252
[Parameter(Mandatory = $true)][string]$ClientID,
5353
[Parameter(Mandatory = $true)][string]$ClientSecret,
5454
[Parameter(Mandatory = $true)][string]$TenantId,
55-
[Parameter(Mandatory = $true)][string]$PolicyId,
56-
[Parameter(Mandatory = $true)][string]$PathToFile
55+
[Parameter(Mandatory = $true)][string]$Folder,
56+
[Parameter(Mandatory = $true)][string]$Files
5757
)
5858
5959
try {
@@ -66,15 +66,42 @@ try {
6666
$headers.Add("Content-Type", 'application/xml')
6767
$headers.Add("Authorization", 'Bearer ' + $token)
6868
69-
$graphuri = 'https://graph.microsoft.com/beta/trustframework/policies/' + $PolicyId + '/$value'
70-
$policycontent = Get-Content $PathToFile
71-
72-
# Optional: Change the content of the policy. For example, replace the tenant-name with your tenant name.
73-
# $policycontent = $policycontent.Replace("your-tenant.onmicrosoft.com", "contoso.onmicrosoft.com")
74-
75-
$response = Invoke-RestMethod -Uri $graphuri -Method Put -Body $policycontent -Headers $headers
76-
77-
Write-Host "Policy" $PolicyId "uploaded successfully."
69+
# Get the list of files to upload
70+
$filesArray = $Files.Split(",")
71+
72+
Foreach ($file in $filesArray) {
73+
74+
$filePath = $Folder + $file.Trim()
75+
76+
# Check if file exists
77+
$FileExists = Test-Path -Path $filePath -PathType Leaf
78+
79+
if ($FileExists) {
80+
$policycontent = Get-Content $filePath
81+
82+
# Optional: Change the content of the policy. For example, replace the tenant-name with your tenant name.
83+
# $policycontent = $policycontent.Replace("your-tenant.onmicrosoft.com", "contoso.onmicrosoft.com")
84+
85+
86+
# Get the policy name from the XML document
87+
$match = Select-String -InputObject $policycontent -Pattern '(?<=\bPolicyId=")[^"]*'
88+
89+
If ($match.matches.groups.count -ge 1) {
90+
$PolicyId = $match.matches.groups[0].value
91+
92+
Write-Host "Uploading the" $PolicyId "policy..."
93+
94+
$graphuri = 'https://graph.microsoft.com/beta/trustframework/policies/' + $PolicyId + '/$value'
95+
$response = Invoke-RestMethod -Uri $graphuri -Method Put -Body $policycontent -Headers $headers
96+
97+
Write-Host "Policy" $PolicyId "uploaded successfully."
98+
}
99+
}
100+
else {
101+
$warning = "File " + $filePath + " couldn't be not found."
102+
Write-Warning -Message $warning
103+
}
104+
}
78105
}
79106
catch {
80107
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
@@ -141,35 +168,18 @@ A pipeline task is a pre-packaged script that performs an action. Add a task tha
141168
* **Display name**: The name of the policy that this task should upload. For example, *B2C_1A_TrustFrameworkBase*.
142169
* **Type**: File Path
143170
* **Script Path**: Select the ellipsis (***...***), navigate to the *Scripts* folder, and then select the *DeployToB2C.ps1* file.
144-
* **Arguments:**
145-
146-
Enter the following values for **Arguments**. Replace the `{alias-name}` with the alias you specified in the previous section. Replace the `{policy-id}` with the policy name. Replace the `{policy-file-name}` with the policy file name.
147-
148-
The first policy your upload must be the *TrustFrameworkBase.xml*.
149-
150-
```PowerShell
151-
-ClientID $(clientId) -ClientSecret $(clientSecret) -TenantId $(tenantId) -PolicyId {policy-id} -PathToFile $(System.DefaultWorkingDirectory)/{alias-name}/B2CAssets/{policy-file-name}
152-
```
153-
154-
The `PolicyId` is a value found at the start of an XML policy file within the TrustFrameworkPolicy node. For example, the `PolicyId` in the following policy XML is *B2C_1A_TrustFrameworkBase*:
155-
156-
```xml
157-
<TrustFrameworkPolicy
158-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
159-
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
160-
xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06"
161-
PolicySchemaVersion="0.3.0.0"
162-
TenantId="your-tenant.onmicrosoft.com"
163-
PolicyId= "B2C_1A_TrustFrameworkBase"
164-
PublicPolicyUri="http://your-tenant.onmicrosoft.com/B2C_1A_TrustFrameworkBase">
165-
```
171+
* **Arguments**: Enter the following PowerShell script.
166172

167-
Your final arguments should look like the following example:
168173

169174
```PowerShell
170-
-ClientID $(clientId) -ClientSecret $(clientSecret) -TenantId $(tenantId) -PolicyId B2C_1A_TrustFrameworkBase -PathToFile $(System.DefaultWorkingDirectory)/policyRepo/B2CAssets/TrustFrameworkBase.xml
175+
-ClientID $(clientId) -ClientSecret $(clientSecret) -TenantId $(tenantId) -Folder $(System.DefaultWorkingDirectory)/policyRepo/B2CAssets/ -Files "TrustFrameworkBase.xml,TrustFrameworkExtensions.xml,SignUpOrSignin.xml,ProfileEdit.xml,PasswordReset.xml"
171176
```
172-
177+
178+
The `-Files` parameter is a comma delimiter list of policy files to deploy. Update the list with your policy files.
179+
180+
> [!IMPORTANT]
181+
> Ensure the policies are uploaded in the correct order. First the base policy, the extensions policy, then the relying party policies. For example, `TrustFrameworkBase.xml,TrustFrameworkExtensions.xml,SignUpOrSignin.xml`.
182+
173183
1. Select **Save** to save the Agent job.
174184
175185
## Test your pipeline
@@ -182,17 +192,6 @@ To test your release pipeline:
182192
183193
You should see a notification banner that says that a release has been queued. To view its status, select the link in the notification banner, or select it in the list on the **Releases** tab.
184194
185-
## Add more pipeline tasks
186-
187-
To deploy the rest of your policies, repeat the [preceding steps](#add-pipeline-tasks) for each of the custom policy files.
188-
189-
When running the agents and uploading the policy files, ensure they're uploaded in the correct order:
190-
191-
1. *TrustFrameworkBase.xml*
192-
1. *TrustFrameworkExtensions.xml*
193-
1. *SignUpOrSignin.xml*
194-
1. *ProfileEdit.xml*
195-
1. *PasswordReset.xml*
196195
197196
## Next steps
198197

articles/active-directory-b2c/disable-email-verification.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: how-to
12-
ms.date: 12/10/2020
12+
ms.date: 08/25/2021
1313
ms.custom: project-no-code
1414
ms.author: mimart
1515
ms.subservice: B2C
@@ -40,11 +40,11 @@ Follow these steps to disable email verification:
4040
1. Use the **Directory + subscription** filter in the top menu to select the directory that contains your Azure AD B2C tenant.
4141
1. In the left menu, select **Azure AD B2C**. Or, select **All services** and search for and select **Azure AD B2C**.
4242
1. Select **User flows**.
43-
1. Select the user flow for which you want to disable email verification. For example, *B2C_1_signinsignup*.
43+
1. Select the user flow for which you want to disable email verification.
4444
1. Select **Page layouts**.
4545
1. Select **Local account sign-up page**.
4646
1. Under **User attributes**, select **Email Address**.
47-
1. In the **REQUIRES VERIFICATION** drop-down, select **No**.
47+
1. In the **Requires Verification** drop-down, select **No**.
4848
1. Select **Save**. Email verification is now disabled for this user flow.
4949

5050
::: zone-end

articles/active-directory-b2c/identity-provider-generic-saml-options.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: how-to
12-
ms.date: 03/22/2021
12+
ms.date: 08/25/2021
1313
ms.custom: project-no-code
1414
ms.author: mimart
1515
ms.subservice: B2C

articles/active-directory-b2c/page-layout.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 08/03/2021
12+
ms.date: 08/25/2021
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---
@@ -151,6 +151,7 @@ Azure AD B2C page layout uses the following versions of the [jQuery library](htt
151151

152152
- Added support for multiple sign-up links.
153153
- Added support for user input validation according to the predicate rules defined in the policy.
154+
- When the [sign-in option](sign-in-options.md) is set to Email, the sign-in header presents "Sign in with your sign in name". The username field presents "Sign in name". For more information, see [localization](localization-string-ids.md#sign-up-or-sign-in-page-elements).
154155

155156
**1.2.0**
156157

articles/active-directory-b2c/saml-identity-provider-technical-profile.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ manager: celestedg
99
ms.service: active-directory
1010
ms.workload: identity
1111
ms.topic: reference
12-
ms.date: 12/01/2020
12+
ms.date: 08/25/2021
1313
ms.author: mimart
1414
ms.subservice: B2C
1515
---

articles/active-directory/app-provisioning/application-provisioning-config-problem-scim-compatibility.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ms.service: active-directory
88
ms.subservice: app-provisioning
99
ms.workload: identity
1010
ms.topic: reference
11-
ms.date: 05/11/2021
11+
ms.date: 08/25/2021
1212
ms.author: kenwith
1313
ms.reviewer: arvinh
1414
---
@@ -43,7 +43,7 @@ In the table below, any item marked as fixed means that the proper behavior can
4343
## Flags to alter the SCIM behavior
4444
Use the flags below in the tenant URL of your application in order to change the default SCIM client behavior.
4545

46-
:::image type="content" source="media/application-provisioning-config-problem-scim-compatibility/scim-flags.jpg" alt-text="SCIM flags to later behavior.":::
46+
:::image type="content" source="media/application-provisioning-config-problem-scim-compatibility/scim-flags.png" alt-text="SCIM flags to later behavior.":::
4747

4848
Use the following URL to update PATCH behavior and ensure SCIM compliance. The flag will alter the following behaviors:
4949
- Requests made to disable users

articles/active-directory/app-provisioning/functions-for-customizing-application-data.md

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ms.service: active-directory
88
ms.subservice: app-provisioning
99
ms.workload: identity
1010
ms.topic: reference
11-
ms.date: 07/29/2021
11+
ms.date: 08/25/2021
1212
ms.author: kenwith
1313
ms.reviewer: arvinh
1414
---
@@ -34,7 +34,7 @@ The syntax for Expressions for Attribute Mappings is reminiscent of Visual Basic
3434

3535
## List of Functions
3636

37-
[Append](#append) &nbsp;&nbsp;&nbsp;&nbsp; [AppRoleAssignmentsComplex](#approleassignmentscomplex) &nbsp;&nbsp;&nbsp;&nbsp; [BitAnd](#bitand) &nbsp;&nbsp;&nbsp;&nbsp; [CBool](#cbool) &nbsp;&nbsp;&nbsp;&nbsp; [CDate](#cdate) &nbsp;&nbsp;&nbsp;&nbsp; [Coalesce](#coalesce) &nbsp;&nbsp;&nbsp;&nbsp; [ConvertToBase64](#converttobase64) &nbsp;&nbsp;&nbsp;&nbsp; [ConvertToUTF8Hex](#converttoutf8hex) &nbsp;&nbsp;&nbsp;&nbsp; [Count](#count) &nbsp;&nbsp;&nbsp;&nbsp; [CStr](#cstr) &nbsp;&nbsp;&nbsp;&nbsp; [DateAdd](#dateadd) &nbsp;&nbsp;&nbsp;&nbsp; [DateFromNum](#datefromnum) &nbsp;[FormatDateTime](#formatdatetime) &nbsp;&nbsp;&nbsp;&nbsp; [Guid](#guid) &nbsp;&nbsp;&nbsp;&nbsp; [IgnoreFlowIfNullOrEmpty](#ignoreflowifnullorempty) &nbsp;&nbsp;&nbsp;&nbsp;[IIF](#iif) &nbsp;&nbsp;&nbsp;&nbsp;[InStr](#instr) &nbsp;&nbsp;&nbsp;&nbsp; [IsNull](#isnull) &nbsp;&nbsp;&nbsp;&nbsp; [IsNullOrEmpty](#isnullorempty) &nbsp;&nbsp;&nbsp;&nbsp; [IsPresent](#ispresent) &nbsp;&nbsp;&nbsp;&nbsp; [IsString](#isstring) &nbsp;&nbsp;&nbsp;&nbsp; [Item](#item) &nbsp;&nbsp;&nbsp;&nbsp; [Join](#join) &nbsp;&nbsp;&nbsp;&nbsp; [Left](#left) &nbsp;&nbsp;&nbsp;&nbsp; [Mid](#mid) &nbsp;&nbsp;&nbsp;&nbsp; [NormalizeDiacritics](#normalizediacritics) &nbsp;&nbsp; &nbsp;&nbsp; [Not](#not) &nbsp;&nbsp;&nbsp;&nbsp; [Now](#now) &nbsp;&nbsp;&nbsp;&nbsp; [NumFromDate](#numfromdate) &nbsp;&nbsp;&nbsp;&nbsp; [RemoveDuplicates](#removeduplicates) &nbsp;&nbsp;&nbsp;&nbsp; [Replace](#replace) &nbsp;&nbsp;&nbsp;&nbsp; [SelectUniqueValue](#selectuniquevalue)&nbsp;&nbsp;&nbsp;&nbsp; [SingleAppRoleAssignment](#singleapproleassignment)&nbsp;&nbsp;&nbsp;&nbsp; [Split](#split)&nbsp;&nbsp;&nbsp;&nbsp;[StripSpaces](#stripspaces) &nbsp;&nbsp;&nbsp;&nbsp; [Switch](#switch)&nbsp;&nbsp;&nbsp;&nbsp; [ToLower](#tolower)&nbsp;&nbsp;&nbsp;&nbsp; [ToUpper](#toupper)&nbsp;&nbsp;&nbsp;&nbsp; [Word](#word)
37+
[Append](#append) &nbsp;&nbsp;&nbsp;&nbsp; [AppRoleAssignmentsComplex](#approleassignmentscomplex) &nbsp;&nbsp;&nbsp;&nbsp; [BitAnd](#bitand) &nbsp;&nbsp;&nbsp;&nbsp; [CBool](#cbool) &nbsp;&nbsp;&nbsp;&nbsp; [CDate](#cdate) &nbsp;&nbsp;&nbsp;&nbsp; [Coalesce](#coalesce) &nbsp;&nbsp;&nbsp;&nbsp; [ConvertToBase64](#converttobase64) &nbsp;&nbsp;&nbsp;&nbsp; [ConvertToUTF8Hex](#converttoutf8hex) &nbsp;&nbsp;&nbsp;&nbsp; [Count](#count) &nbsp;&nbsp;&nbsp;&nbsp; [CStr](#cstr) &nbsp;&nbsp;&nbsp;&nbsp; [DateAdd](#dateadd) &nbsp;&nbsp;&nbsp;&nbsp; [DateDiff](#datediff) &nbsp;&nbsp;&nbsp;&nbsp; [DateFromNum](#datefromnum) &nbsp;[FormatDateTime](#formatdatetime) &nbsp;&nbsp;&nbsp;&nbsp; [Guid](#guid) &nbsp;&nbsp;&nbsp;&nbsp; [IgnoreFlowIfNullOrEmpty](#ignoreflowifnullorempty) &nbsp;&nbsp;&nbsp;&nbsp;[IIF](#iif) &nbsp;&nbsp;&nbsp;&nbsp;[InStr](#instr) &nbsp;&nbsp;&nbsp;&nbsp; [IsNull](#isnull) &nbsp;&nbsp;&nbsp;&nbsp; [IsNullOrEmpty](#isnullorempty) &nbsp;&nbsp;&nbsp;&nbsp; [IsPresent](#ispresent) &nbsp;&nbsp;&nbsp;&nbsp; [IsString](#isstring) &nbsp;&nbsp;&nbsp;&nbsp; [Item](#item) &nbsp;&nbsp;&nbsp;&nbsp; [Join](#join) &nbsp;&nbsp;&nbsp;&nbsp; [Left](#left) &nbsp;&nbsp;&nbsp;&nbsp; [Mid](#mid) &nbsp;&nbsp;&nbsp;&nbsp; [NormalizeDiacritics](#normalizediacritics) &nbsp;&nbsp; &nbsp;&nbsp; [Not](#not) &nbsp;&nbsp;&nbsp;&nbsp; [Now](#now) &nbsp;&nbsp;&nbsp;&nbsp; [NumFromDate](#numfromdate) &nbsp;&nbsp;&nbsp;&nbsp; [RemoveDuplicates](#removeduplicates) &nbsp;&nbsp;&nbsp;&nbsp; [Replace](#replace) &nbsp;&nbsp;&nbsp;&nbsp; [SelectUniqueValue](#selectuniquevalue)&nbsp;&nbsp;&nbsp;&nbsp; [SingleAppRoleAssignment](#singleapproleassignment)&nbsp;&nbsp;&nbsp;&nbsp; [Split](#split)&nbsp;&nbsp;&nbsp;&nbsp;[StripSpaces](#stripspaces) &nbsp;&nbsp;&nbsp;&nbsp; [Switch](#switch)&nbsp;&nbsp;&nbsp;&nbsp; [ToLower](#tolower)&nbsp;&nbsp;&nbsp;&nbsp; [ToUpper](#toupper)&nbsp;&nbsp;&nbsp;&nbsp; [Word](#word)
3838

3939
---
4040
### Append
@@ -277,11 +277,8 @@ Returns a date/time string representing a date to which a specified time interva
277277

278278
The **interval** string must have one of the following values:
279279
* yyyy Year
280-
* q Quarter
281280
* m Month
282-
* y Day of year
283281
* d Day
284-
* w Weekday
285282
* ww Week
286283
* h Hour
287284
* n Minute
@@ -311,6 +308,57 @@ The **interval** string must have one of the following values:
311308
`DateAdd("yyyy", 2, CDate([StatusHireDate]))`
312309
* **INPUT** (StatusHireDate): 2012-03-16-07:00
313310
* **OUTPUT**: 3/16/2014 7:00:00 AM
311+
---
312+
### DateDiff
313+
**Function:**
314+
`DateDiff(interval, date1, date2)`
315+
316+
**Description:**
317+
This function uses the *interval* parameter to return a number that indicates the difference between the two input dates. It returns
318+
* a positive number if date2 > date1,
319+
* a negative number if date2 < date1,
320+
* 0 if date2 == date1
321+
322+
**Parameters:**
323+
324+
| Name | Required/Optional | Type | Notes |
325+
| --- | --- | --- | --- |
326+
| **interval** |Required | String | Interval of time to use for calculating the difference. |
327+
| **date1** |Required | DateTime | DateTime representing a valid date. |
328+
| **date2** |Required | DateTime | DateTime representing a valid date. |
329+
330+
The **interval** string must have one of the following values:
331+
* yyyy Year
332+
* m Month
333+
* d Day
334+
* ww Week
335+
* h Hour
336+
* n Minute
337+
* s Second
338+
339+
**Example 1: Compare current date with hire date from Workday with different intervals** <br>
340+
`DateDiff("d", Now(), CDate([StatusHireDate]))`
341+
342+
| Example | interval | date1 | date2 | output |
343+
| --- | --- | --- | --- | --- |
344+
| Positive difference in days between two dates | d | 2021-08-18+08:00 | 2021-08-31+08:00 | 13 |
345+
| Negative difference in days between two dates | d | 8/25/2021 5:41:18 PM | 2012-03-16-07:00 | -3449 |
346+
| Difference in weeks between two dates | ww | 8/25/2021 5:41:18 PM | 2012-03-16-07:00 | -493 |
347+
| Difference in months between two dates | m | 8/25/2021 5:41:18 PM | 2012-03-16-07:00 | -113 |
348+
| Difference in years between two dates | yyyy | 8/25/2021 5:41:18 PM | 2012-03-16-07:00 | -9 |
349+
| Difference when both dates are same | d | 2021-08-31+08:00 | 2021-08-31+08:00 | 0 |
350+
| Difference in hours between two dates | h | 2021-08-24 | 2021-08-25 | 24 |
351+
| Difference in minutes between two dates | n | 2021-08-24 | 2021-08-25 | 1440 |
352+
| Difference in seconds between two dates | s | 2021-08-24 | 2021-08-25 | 86400 |
353+
354+
**Example 2: Combine DateDiff with IIF function to set attribute value** <br>
355+
If an account is Active in Workday, set the *accountEnabled* attribute of the user to True only if hire date is within the next 5 days.
356+
357+
```
358+
Switch([Active], ,
359+
"1", IIF(DateDiff("d", Now(), CDate([StatusHireDate])) > 5, "False", "True"),
360+
"0", "False")
361+
```
314362

315363
---
316364

@@ -661,11 +709,11 @@ The NumFromDate function converts a DateTime value to Active Directory format th
661709
**Example:**
662710
* Workday example
663711
Assuming you want to map the attribute *ContractEndDate* from Workday which is in the format *2020-12-31-08:00* to *accountExpires* field in AD, here is how you can use this function and change the timezone offset to match your locale.
664-
`NumFromDate(Join("", FormatDateTime([ContractEndDate], ,"yyyy-MM-ddzzz", "yyyy-MM-dd"), "T23:59:59-08:00"))`
712+
`NumFromDate(Join("", FormatDateTime([ContractEndDate], ,"yyyy-MM-ddzzz", "yyyy-MM-dd"), " 23:59:59-08:00"))`
665713

666714
* SuccessFactors example
667715
Assuming you want to map the attribute *endDate* from SuccessFactors which is in the format *M/d/yyyy hh:mm:ss tt* to *accountExpires* field in AD, here is how you can use this function and change the time zone offset to match your locale.
668-
`NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd"),"T23:59:59-08:00"))`
716+
`NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-08:00"))`
669717

670718

671719
---
32.3 KB
Loading

0 commit comments

Comments
 (0)