ICU-21389 Merge maint/maint-68 to master

diff --git a/icu4c/APIChangeReport.html b/icu4c/APIChangeReport.html
index e583825..53919cd 100644
--- a/icu4c/APIChangeReport.html
+++ b/icu4c/APIChangeReport.html
@@ -46,13 +46,21 @@
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto">LocalArray&lt;MeasureUnit&gt; icu::MeasureUnit::splitToSingleUnits(int32_t&amp;, UErrorCode&amp;) const</td><td class="">Internal<br>ICU 67</td><td>(missing)<br>
+<td class="file">fmtable.h</td><td class="proto">const UFormattable* icu::Formattable::toUFormattable()</td><td class="stabchange">Stable<br>ICU 52</td><td>(missing)<br>
 <span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
+<td class="file">measunit.h</td><td class="proto">LocalArray&lt;MeasureUnit&gt; icu::MeasureUnit::splitToSingleUnits(int32_t&amp;, UErrorCode&amp;) const</td><td class="">Internal<br>ICU 67</td><td>(missing)<br>
+<span class=""><span></span></span></td>
+</tr>
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">int32_t icu::MeasureUnit::getIndex() const</td><td class="">Internal</td><td>(missing)<br>
 <span class=""><span></span></span></td>
 </tr>
+<tr class="row0">
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&amp;, const MeasureUnit&amp;, bool*)</td><td class="">Internal</td><td>(missing)<br>
+<span class=""><span></span></span></td>
+</tr>
 <tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> int32_t icu::MeasureUnit::getIndexCount()</td><td class="">Internal</td><td>(missing)<br>
 <span class=""><span></span></span></td>
@@ -93,6 +101,10 @@
 <td class="file">nounit.h</td><td class="proto">void* icu::NoUnit::clone() const</td><td class="">Draft<br>ICU 60</td><td>(missing)<br>
 <span class=""><span></span></span></td>
 </tr>
+<tr class="row1">
+<td class="file">uniset.h</td><td class="proto">const USet* icu::UnicodeSet::toUSet()</td><td class="stabchange">Stable<br>ICU 4.2</td><td>(missing)<br>
+<span class=""><span></span></span></td>
+</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
@@ -140,232 +152,256 @@
 <td class="file">bytestrie.h</td><td class="proto">uint64_t icu::BytesTrie::getState64() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
 <tr class="row1">
+<td class="file">listformatter.h</td><td class="proto"><tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
 <td class="file">localebuilder.h</td><td class="proto">UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::operator=(Builder&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setDefaultLocale(const Locale*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setDemotionPerDesiredLocale(ULocMatchDemotion)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setFavorSubtag(ULocMatchFavorSubtag)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setSupportedLocales(Iter, Iter)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setSupportedLocalesFromListString(StringPiece)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setSupportedLocalesViaConverter(Iter, Iter, Conv)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Locale icu::LocaleMatcher::Result::makeResolvedLocale(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">LocaleMatcher icu::LocaleMatcher::Builder::build(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">LocaleMatcher&amp; icu::LocaleMatcher::operator=(LocaleMatcher&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Result icu::LocaleMatcher::getBestMatchResult(Locale::Iterator&amp;, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Result icu::LocaleMatcher::getBestMatchResult(const Locale&amp;, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Result&amp; icu::LocaleMatcher::Result::operator=(Result&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">UBool icu::LocaleMatcher::Builder::copyErrorTo(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">const Locale* icu::LocaleMatcher::Result::getDesiredLocale() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">const Locale* icu::LocaleMatcher::Result::getSupportedLocale() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">const Locale* icu::LocaleMatcher::getBestMatch(Locale::Iterator&amp;, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">const Locale* icu::LocaleMatcher::getBestMatch(const Locale&amp;, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">const Locale* icu::LocaleMatcher::getBestMatchForListString(StringPiece, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchDemotion::ULOCMATCH_DEMOTION_NONE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchDemotion::ULOCMATCH_DEMOTION_REGION</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchFavorSubtag::ULOCMATCH_FAVOR_LANGUAGE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchFavorSubtag::ULOCMATCH_FAVOR_SCRIPT</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::Builder::Builder()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::Builder::Builder(Builder&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::Builder::~Builder()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::LocaleMatcher(LocaleMatcher&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::Result::Result(Result&amp;&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::Result::~Result()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">icu::LocaleMatcher::~LocaleMatcher()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">int32_t icu::LocaleMatcher::Result::getDesiredIndex() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">int32_t icu::LocaleMatcher::Result::getSupportedIndex() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">UBool icu::Locale::ConvertingIterator&lt; Iter, Conv &gt;::hasNext() const override</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">locid.h</td><td class="proto">UBool icu::Locale::Iterator::hasNext() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">UBool icu::Locale::RangeIterator&lt; Iter &gt;::hasNext() const override</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">locid.h</td><td class="proto">const Locale&amp; icu::Locale::ConvertingIterator&lt; Iter, Conv &gt;::next() override</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">const Locale&amp; icu::Locale::Iterator::next()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">locid.h</td><td class="proto">const Locale&amp; icu::Locale::RangeIterator&lt; Iter &gt;::next() override</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">icu::Locale::ConvertingIterator&lt; Iter, Conv &gt;::ConvertingIterator(Iter, Iter, Conv)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">locid.h</td><td class="proto">icu::Locale::Iterator::~Iterator()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">icu::Locale::RangeIterator&lt; Iter &gt;::RangeIterator(Iter, Iter)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getBar()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDecade()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDotPerCentimeter()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDotPerInch()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getEm()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getMegapixel()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPascal()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPixel()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPixelPerCentimeter()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPixelPerInch()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getThermUs()</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createBar(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDecade(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDotPerCentimeter(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDotPerInch(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createEm(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createMegapixel(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPascal(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPixel(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPixelPerCentimeter(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPixelPerInch(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createThermUs(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">StringClass icu::number::FormattedNumber::toDecimalNumber(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberrangeformatter.h</td><td class="proto">UnicodeString icu::number::FormattedNumberRange::getFirstDecimal(UErrorCode&amp;) const</td><td class="">Draft<br>ICU 63</td><td>Deprecated<br>
 <span class="verchange"><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberrangeformatter.h</td><td class="proto">UnicodeString icu::number::FormattedNumberRange::getSecondDecimal(UErrorCode&amp;) const</td><td class="">Draft<br>ICU 63</td><td>Deprecated<br>
 <span class="verchange"><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">reldatefmt.h</td><td class="proto"><tt>enum</tt> UDateAbsoluteUnit::UDAT_ABSOLUTE_HOUR</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">reldatefmt.h</td><td class="proto"><tt>enum</tt> UDateAbsoluteUnit::UDAT_ABSOLUTE_MINUTE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">stringpiece.h</td><td class="proto">icu::StringPiece::StringPiece(T)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">ucal.h</td><td class="proto">int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">ucharstrie.h</td><td class="proto">UCharsTrie&amp; icu::UCharsTrie::resetToState64(uint64_t)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">ucharstrie.h</td><td class="proto">uint64_t icu::UCharsTrie::getState64() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
+<tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto">UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
 <tr class="row0">
 <td class="file">uloc.h</td><td class="proto">UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
@@ -417,6 +453,13 @@
 <td class="file">bytestrie.h</td><td class="proto">uint64_t icu::BytesTrie::getState64() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
 <tr class="row1">
+<td class="file">fmtable.h</td><td class="proto">UFormattable* icu::Formattable::toUFormattable()</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 52</span></span></td>
+</tr>
+<tr class="row0">
+<td class="file">listformatter.h</td><td class="proto"><tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
 <td class="file">localebuilder.h</td><td class="proto">UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
 <tr class="row0">
@@ -636,17 +679,42 @@
 <td class="file">ucharstrie.h</td><td class="proto">uint64_t icu::UCharsTrie::getState64() const</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
 <tr class="row0">
-<td class="file">uloc.h</td><td class="proto">UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+<td class="file">ulistformatter.h</td><td class="proto">UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
 </tr>
 <tr class="row1">
-<td class="file">uloc.h</td><td class="proto"><tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_DEFAULT</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
 </tr>
 <tr class="row0">
-<td class="file">uloc.h</td><td class="proto"><tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
 </tr>
 <tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row0">
+<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 67</td>
+</tr>
+<tr class="row1">
+<td class="file">uloc.h</td><td class="proto">UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*)</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+</tr>
+<tr class="row0">
+<td class="file">uloc.h</td><td class="proto"><tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_DEFAULT</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+</tr>
+<tr class="row1">
+<td class="file">uloc.h</td><td class="proto"><tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
+</tr>
+<tr class="row0">
 <td class="file">uloc.h</td><td class="proto"><tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
+<tr class="row1">
+<td class="file">uniset.h</td><td class="proto">USet* icu::UnicodeSet::toUSet()</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 4.2</span></span></td>
+</tr>
 <tr class="row0">
 <td class="file">utrace.h</td><td class="proto"><tt>enum</tt> UTraceFunctionNumber::UTRACE_UDATA_BUNDLE</td><td class="" colspan="2" align="center">Draft&rarr;Stable<br>ICU 65</td>
 </tr>
@@ -684,177 +752,185 @@
 <span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
+<td class="file">fmtable.h</td><td class="proto">UFormattable* icu::Formattable::toUFormattable()</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 52</span></span></td>
+</tr>
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setMaxDistance(const Locale&amp;, const Locale&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setNoDefaultLocale()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">UBool icu::LocaleMatcher::isMatch(const Locale&amp;, const Locale&amp;, UErrorCode&amp;) const</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">int32_t icu::MeasureUnit::getOffset() const</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getCandela()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoon()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoonImperial()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDot()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDram()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDrop()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getEarthRadius()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getGrain()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getJigger()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getLumen()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPinch()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getQuartImperial()</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&amp;)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">std::pair&lt; LocalArray&lt; MeasureUnit &gt;, int32_t &gt; icu::MeasureUnit::splitToSingleUnits(UErrorCode&amp;) const</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::usage(StringPiece) const&amp;</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings&lt; Derived &gt;::usage(StringPiece)&amp;&amp;</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&amp;) const</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberformatter.h</td><td class="proto">Usage&amp; icu::number::impl::Usage::operator=(Usage&amp;&amp;)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">Usage&amp; icu::number::impl::Usage::operator=(const Usage&amp;)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberformatter.h</td><td class="proto">bool icu::number::impl::Usage::isSet() const</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">icu::number::impl::Usage::Usage(Usage&amp;&amp;)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberformatter.h</td><td class="proto">icu::number::impl::Usage::Usage(const Usage&amp;)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">icu::number::impl::Usage::~Usage()</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberformatter.h</td><td class="proto">int16_t icu::number::impl::Usage::length() const</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">numberformatter.h</td><td class="proto">void icu::number::impl::Usage::set(StringPiece)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">numberrangeformatter.h</td><td class="proto">std::pair&lt; StringClass, StringClass &gt; icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&amp;) const</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&amp;, UErrorCode&amp;) const</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const number::impl::UFormattedNumberRangeData*, UErrorCode&amp;) const</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
 </tr>
+<tr class="row0">
+<td class="file">plurrule.h</td><td class="proto">int32_t icu::PluralRules::getSamples(const UnicodeString&amp;, FixedDecimal*, int32_t, UErrorCode&amp;)</td><td class="">(missing)</td><td>Internal<br>
+<span class=""><span></span></span></td>
+</tr>
 <tr class="row1">
 <td class="file">timezone.h</td><td class="proto"><tt>static</tt> TimeZone* icu::TimeZone::forLocaleOrDefault(const Locale&amp;)</td><td class="">(missing)</td><td>Internal<br>
 <span class=""><span></span></span></td>
@@ -880,66 +956,70 @@
 <span class=""><span>ICU 68</span></span></td>
 </tr>
 <tr class="row1">
+<td class="file">uniset.h</td><td class="proto">USet* icu::UnicodeSet::toUSet()</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 4.2</span></span></td>
+</tr>
+<tr class="row0">
 <td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberformatter.h</td><td class="proto">int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberrangeformatter.h</td><td class="proto">UFormattedNumberRange* unumrf_openResult(UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberrangeformatter.h</td><td class="proto">const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_close(UNumberRangeFormatter*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_closeResult(UFormattedNumberRange*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">upluralrules.h</td><td class="proto">int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
 <span class=""><span>ICU 68</span></span></td>
 </tr>
@@ -966,122 +1046,98 @@
 <td class="file">dtptngen.h</td><td class="proto">UDateFormatHourCycle icu::DateTimePatternGenerator::getDefaultHourCycle(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
 <tr class="row0">
-<td class="file">listformatter.h</td><td class="proto"><tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto">Builder&amp; icu::LocaleMatcher::Builder::setDirection(ULocMatchDirection)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchDirection::ULOCMATCH_DIRECTION_ONLY_TWO_WAY</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">localematcher.h</td><td class="proto"><tt>enum</tt> ULocMatchDirection::ULOCMATCH_DIRECTION_WITH_ONE_WAY</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">locid.h</td><td class="proto">void icu::Locale::canonicalize(UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measfmt.h</td><td class="proto">void icu::MeasureFormat::parseObject(const UnicodeString&amp;, Formattable&amp;, ParsePosition&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 53</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::product(const MeasureUnit&amp;, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::reciprocal(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::withDimensionality(int32_t, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::withSIPrefix(UMeasureSIPrefix, UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">MeasureUnit&amp; icu::MeasureUnit::operator=(MeasureUnit&amp;&amp;) noexcept</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">UMeasureSIPrefix icu::MeasureUnit::getSIPrefix(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">UMeasureUnitComplexity icu::MeasureUnit::getComplexity(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">const char* icu::MeasureUnit::getIdentifier() const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto">icu::MeasureUnit::MeasureUnit(MeasureUnit&amp;&amp;) noexcept</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">measunit.h</td><td class="proto">int32_t icu::MeasureUnit::getDimensionality(UErrorCode&amp;) const</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::forIdentifier(StringPiece, UErrorCode&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">stringpiece.h</td><td class="proto">icu::StringPiece::StringPiece(const char8_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">stringpiece.h</td><td class="proto">icu::StringPiece::StringPiece(const char8_t*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">stringpiece.h</td><td class="proto">icu::StringPiece::StringPiece(const std::u8string&amp;)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">stringpiece.h</td><td class="proto">icu::StringPiece::StringPiece(std::nullptr_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">stringpiece.h</td><td class="proto">int32_t icu::StringPiece::compare(StringPiece)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">stringpiece.h</td><td class="proto">int32_t icu::StringPiece::find(StringPiece, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">stringpiece.h</td><td class="proto">void icu::StringPiece::set(const char8_t*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">stringpiece.h</td><td class="proto">void icu::StringPiece::set(const char8_t*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatHourCycle::UDAT_HOUR_CYCLE_11</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatHourCycle::UDAT_HOUR_CYCLE_12</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatHourCycle::UDAT_HOUR_CYCLE_23</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatHourCycle::UDAT_HOUR_CYCLE_24</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">udateintervalformat.h</td><td class="proto">void udtitvfmt_formatCalendarToResult(const UDateIntervalFormat*, UCalendar*, UCalendar*, UFormattedDateInterval*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
+<tr class="row1">
 <td class="file">udateintervalformat.h</td><td class="proto">void udtitvfmt_formatToResult(const UDateIntervalFormat*, UDate, UDate, UFormattedDateInterval*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row1">
+<tr class="row0">
 <td class="file">udatpg.h</td><td class="proto">UDateFormatHourCycle udatpg_getDefaultHourCycle(const UDateTimePatternGenerator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
 </tr>
-<tr class="row0">
-<td class="file">ulistformatter.h</td><td class="proto">UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row1">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row0">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row1">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row0">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row1">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
-<tr class="row0">
-<td class="file">ulistformatter.h</td><td class="proto"><tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE</td><td class="" colspan="2" align="center">Draft<br>ICU 67</td>
-</tr>
 <tr class="row1">
 <td class="file">uregex.h</td><td class="proto"><tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ</td><td class="" colspan="2" align="center">Draft<br>ICU 2.4</td>
 </tr>
@@ -1122,7 +1178,7 @@
 <a href="#_top">(jump back to top)</a>
 <hr>
 <p>
-<i><font size="-1">Contents generated by StableAPI tool on Wed Sep 30 17:55:30 PDT 2020<br>
+<i><font size="-1">Contents generated by StableAPI tool on Fri Oct 23 11:35:16 PDT 2020<br>
         Copyright &copy; 2017 and later: Unicode, Inc. and others.<br>
         License &amp; terms of use: http://www.unicode.org/copyright.html
     </font></i>
diff --git a/icu4c/APIChangeReport.md b/icu4c/APIChangeReport.md
index 0cf9ed5..5385904 100644
--- a/icu4c/APIChangeReport.md
+++ b/icu4c/APIChangeReport.md
@@ -23,8 +23,10 @@
   
 | File | API | ICU 67 | ICU 68 |
 |---|---|---|---|
+| fmtable.h | const UFormattable* icu::Formattable::toUFormattable() |  StableICU 52 | (missing)
 | measunit.h | LocalArray&lt;MeasureUnit&gt; icu::MeasureUnit::splitToSingleUnits(int32_t&amp;, UErrorCode&amp;) const |  InternalICU 67 | (missing)
 | measunit.h | int32_t icu::MeasureUnit::getIndex() const |  Internal | (missing)
+| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::resolveUnitPerUnit(const MeasureUnit&amp;, const MeasureUnit&amp;, bool*) |  Internal | (missing)
 | measunit.h | <tt>static</tt> int32_t icu::MeasureUnit::getIndexCount() |  Internal | (missing)
 | measunit.h | <tt>static</tt> int32_t icu::MeasureUnit::internalGetIndexForTypeAndSubtype(const char*, const char*) |  Internal | (missing)
 | nounit.h | UClassID icu::NoUnit::getDynamicClassID() const |  DraftICU 60 | (missing)
@@ -35,6 +37,7 @@
 | nounit.h | <tt>static</tt> NoUnit icu::NoUnit::permille() |  DraftICU 60 | (missing)
 | nounit.h | <tt>static</tt> UClassID icu::NoUnit::getStaticClassID() |  DraftICU 60 | (missing)
 | nounit.h | void* icu::NoUnit::clone() const |  DraftICU 60 | (missing)
+| uniset.h | const USet* icu::UnicodeSet::toUSet() |  StableICU 4.2 | (missing)
 
 ## Deprecated
 
@@ -57,6 +60,7 @@
 |---|---|---|---|
 | bytestrie.h | BytesTrie&amp; icu::BytesTrie::resetToState64(uint64_t) |  Draft→StableICU 65
 | bytestrie.h | uint64_t icu::BytesTrie::getState64() const |  Draft→StableICU 65
+| listformatter.h | <tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;) |  Draft→StableICU 67
 | localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&amp;) const |  Draft→StableICU 65
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&amp;) |  Draft→StableICU 65
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::operator=(Builder&amp;&amp;) |  Draft→StableICU 65
@@ -132,6 +136,13 @@
 | ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) |  Draft→StableICU 65
 | ucharstrie.h | UCharsTrie&amp; icu::UCharsTrie::resetToState64(uint64_t) |  Draft→StableICU 65
 | ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const |  Draft→StableICU 65
+| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE |  Draft→StableICU 67
 | uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) |  Draft→StableICU 65
 | uloc.h | <tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_DEFAULT |  Draft→StableICU 65
 | uloc.h | <tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES |  Draft→StableICU 65
@@ -151,6 +162,8 @@
 |---|---|---|---|
 | bytestrie.h | BytesTrie&amp; icu::BytesTrie::resetToState64(uint64_t) |  Draft→StableICU 65
 | bytestrie.h | uint64_t icu::BytesTrie::getState64() const |  Draft→StableICU 65
+| fmtable.h | UFormattable* icu::Formattable::toUFormattable() |  (missing) | StableICU 52
+| listformatter.h | <tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;) |  Draft→StableICU 67
 | localebuilder.h | UBool icu::LocaleBuilder::copyErrorTo(UErrorCode&amp;) const |  Draft→StableICU 65
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::addSupportedLocale(const Locale&amp;) |  Draft→StableICU 65
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::operator=(Builder&amp;&amp;) |  Draft→StableICU 65
@@ -224,10 +237,18 @@
 | ucal.h | int32_t ucal_getHostTimeZone(UChar*, int32_t, UErrorCode*) |  Draft→StableICU 65
 | ucharstrie.h | UCharsTrie&amp; icu::UCharsTrie::resetToState64(uint64_t) |  Draft→StableICU 65
 | ucharstrie.h | uint64_t icu::UCharsTrie::getState64() const |  Draft→StableICU 65
+| ulistformatter.h | UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT |  Draft→StableICU 67
+| ulistformatter.h | <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE |  Draft→StableICU 67
 | uloc.h | UEnumeration* uloc_openAvailableByType(ULocAvailableType, UErrorCode*) |  Draft→StableICU 65
 | uloc.h | <tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_DEFAULT |  Draft→StableICU 65
 | uloc.h | <tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_ONLY_LEGACY_ALIASES |  Draft→StableICU 65
 | uloc.h | <tt>enum</tt> ULocAvailableType::ULOC_AVAILABLE_WITH_LEGACY_ALIASES |  Draft→StableICU 65
+| uniset.h | USet* icu::UnicodeSet::toUSet() |  (missing) | StableICU 4.2
 | utrace.h | <tt>enum</tt> UTraceFunctionNumber::UTRACE_UDATA_BUNDLE |  Draft→StableICU 65
 | utrace.h | <tt>enum</tt> UTraceFunctionNumber::UTRACE_UDATA_DATA_FILE |  Draft→StableICU 65
 | utrace.h | <tt>enum</tt> UTraceFunctionNumber::UTRACE_UDATA_RES_FILE |  Draft→StableICU 65
@@ -242,6 +263,7 @@
 | dtitvfmt.h | UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&amp;) const |  (missing) | DraftICU 68
 | dtitvfmt.h | void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&amp;) |  (missing) | DraftICU 68
 | dtptngen.h | <tt>static</tt> DateTimePatternGenerator* icu::DateTimePatternGenerator::createInstanceNoStdPat(const Locale&amp;, UErrorCode&amp;) |  (missing) | Internal
+| fmtable.h | UFormattable* icu::Formattable::toUFormattable() |  (missing) | StableICU 52
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::setMaxDistance(const Locale&amp;, const Locale&amp;) |  (missing) | DraftICU 68
 | localematcher.h | Builder&amp; icu::LocaleMatcher::Builder::setNoDefaultLocale() |  (missing) | DraftICU 68
 | localematcher.h | UBool icu::LocaleMatcher::isMatch(const Locale&amp;, const Locale&amp;, UErrorCode&amp;) const |  (missing) | DraftICU 68
@@ -285,12 +307,14 @@
 | numberrangeformatter.h | std::pair&lt; StringClass, StringClass &gt; icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&amp;) const |  (missing) | DraftICU 68
 | plurrule.h | UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&amp;, UErrorCode&amp;) const |  (missing) | DraftICU 68
 | plurrule.h | UnicodeString icu::PluralRules::select(const number::impl::UFormattedNumberRangeData*, UErrorCode&amp;) const |  (missing) | Internal
+| plurrule.h | int32_t icu::PluralRules::getSamples(const UnicodeString&amp;, FixedDecimal*, int32_t, UErrorCode&amp;) |  (missing) | Internal
 | timezone.h | <tt>static</tt> TimeZone* icu::TimeZone::forLocaleOrDefault(const Locale&amp;) |  (missing) | Internal
 | ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME |  (missing) | DraftICU 68
 | ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME |  (missing) | DraftICU 68
 | udateintervalformat.h | UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*) |  (missing) | DraftICU 68
 | udateintervalformat.h | void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*) |  (missing) | DraftICU 68
 | umachine.h | <tt>#define</tt> U_DEFINE_FALSE_AND_TRUE |  (missing) | InternalICU 68
+| uniset.h | USet* icu::UnicodeSet::toUSet() |  (missing) | StableICU 4.2
 | unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO |  (missing) | DraftICU 68
 | unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2 |  (missing) | DraftICU 68
 | unumberformatter.h | <tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL |  (missing) | DraftICU 68
@@ -317,7 +341,6 @@
 | bytestream.h |  void icu::ByteSink::AppendU8(const char*, int32_t) | DraftICU 67 | 
 | bytestream.h |  void icu::ByteSink::AppendU8(const char8_t*, int32_t) | DraftICU 67 | 
 | dtptngen.h |  UDateFormatHourCycle icu::DateTimePatternGenerator::getDefaultHourCycle(UErrorCode&amp;) const | DraftICU 67 | 
-| listformatter.h |  <tt>static</tt> ListFormatter* icu::ListFormatter::createInstance(const Locale&amp;, UListFormatterType, UListFormatterWidth, UErrorCode&amp;) | DraftICU 67 | 
 | localematcher.h |  Builder&amp; icu::LocaleMatcher::Builder::setDirection(ULocMatchDirection) | DraftICU 67 | 
 | localematcher.h |  <tt>enum</tt> ULocMatchDirection::ULOCMATCH_DIRECTION_ONLY_TWO_WAY | DraftICU 67 | 
 | localematcher.h |  <tt>enum</tt> ULocMatchDirection::ULOCMATCH_DIRECTION_WITH_ONE_WAY | DraftICU 67 | 
@@ -349,13 +372,6 @@
 | udateintervalformat.h |  void udtitvfmt_formatCalendarToResult(const UDateIntervalFormat*, UCalendar*, UCalendar*, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | 
 | udateintervalformat.h |  void udtitvfmt_formatToResult(const UDateIntervalFormat*, UDate, UDate, UFormattedDateInterval*, UErrorCode*) | DraftICU 67 | 
 | udatpg.h |  UDateFormatHourCycle udatpg_getDefaultHourCycle(const UDateTimePatternGenerator*, UErrorCode*) | DraftICU 67 | 
-| ulistformatter.h |  UListFormatter* ulistfmt_openForType(const char*, UListFormatterType, UListFormatterWidth, UErrorCode*) | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_AND | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_OR | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterType::ULISTFMT_TYPE_UNITS | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_NARROW | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_SHORT | DraftICU 67 | 
-| ulistformatter.h |  <tt>enum</tt> UListFormatterWidth::ULISTFMT_WIDTH_WIDE | DraftICU 67 | 
 | uregex.h |  <tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ | DraftICU 2.4 | 
 | utrace.h |  <tt>enum</tt> UTraceFunctionNumber::UTRACE_UBRK_CREATE_BREAK_ENGINE | DraftICU 67 | 
 | utrace.h |  <tt>enum</tt> UTraceFunctionNumber::UTRACE_UBRK_CREATE_CHARACTER | DraftICU 67 | 
@@ -373,7 +389,7 @@
 
 ## Colophon
 
-Contents generated by StableAPI tool on Wed Sep 30 17:44:26 PDT 2020
+Contents generated by StableAPI tool on Fri Oct 23 11:32:42 PDT 2020
 
 Copyright © 2019 and later: Unicode, Inc. and others.
 License & terms of use: http://www.unicode.org/copyright.html
diff --git a/icu4c/source/common/locid.cpp b/icu4c/source/common/locid.cpp
index 2804e36..feadbcb 100644
--- a/icu4c/source/common/locid.cpp
+++ b/icu4c/source/common/locid.cpp
@@ -35,6 +35,7 @@
 
 #include "unicode/bytestream.h"
 #include "unicode/locid.h"
+#include "unicode/localebuilder.h"
 #include "unicode/strenum.h"
 #include "unicode/stringpiece.h"
 #include "unicode/uloc.h"
@@ -1336,7 +1337,10 @@
         // Cannot use nullptr for language because that will construct
         // the default locale, in that case, use "und" to get the correct
         // locale.
-        Locale l(language == nullptr ? "und" : language, nullptr, script);
+        Locale l = LocaleBuilder()
+            .setLanguage(language == nullptr ? "und" : language)
+            .setScript(script)
+            .build(status);
         l.addLikelySubtags(status);
         const char* likelyRegion = l.getCountry();
         CharString* item = nullptr;
@@ -1453,7 +1457,7 @@
         int32_t variantsStart = out.length();
         for (int32_t i = 0; i < variants.size(); i++) {
              out.append(SEP_CHAR, status)
-                 .append((const char*)((UVector*)variants.elementAt(i)),
+                 .append((const char*)(variants.elementAt(i)),
                          status);
         }
         T_CString_toUpperCase(out.data() + variantsStart);
@@ -2453,9 +2457,13 @@
     if (U_FAILURE(status)) {
         return;
     }
+    if (status == U_STRING_NOT_TERMINATED_WARNING) {
+        status = U_ZERO_ERROR;
+    }
     int32_t bufferLength = uprv_max((int32_t)(uprv_strlen(fullName) + 1), ULOC_FULLNAME_CAPACITY);
     int32_t newLength = uloc_setKeywordValue(keywordName, keywordValue, fullName,
                                              bufferLength, &status) + 1;
+    U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING);
     /* Handle the case the current buffer is not enough to hold the new id */
     if (status == U_BUFFER_OVERFLOW_ERROR) {
         U_ASSERT(newLength > bufferLength);
@@ -2472,6 +2480,7 @@
         fullName = newFullName;
         status = U_ZERO_ERROR;
         uloc_setKeywordValue(keywordName, keywordValue, fullName, newLength, &status);
+        U_ASSERT(status != U_STRING_NOT_TERMINATED_WARNING);
     } else {
         U_ASSERT(newLength <= bufferLength);
     }
diff --git a/icu4c/source/common/rbbitblb.cpp b/icu4c/source/common/rbbitblb.cpp
index bcbdab9..70e260f 100644
--- a/icu4c/source/common/rbbitblb.cpp
+++ b/icu4c/source/common/rbbitblb.cpp
@@ -1402,12 +1402,13 @@
             U_ASSERT (sd->fAccepting <= 255);
             U_ASSERT (sd->fLookAhead <= 255);
             U_ASSERT (0 <= sd->fTagsIdx && sd->fTagsIdx <= 255);
-            row->r8.fAccepting = sd->fAccepting;
-            row->r8.fLookAhead = sd->fLookAhead;
-            row->r8.fTagsIdx   = sd->fTagsIdx;
+            RBBIStateTableRow8 *r8 = (RBBIStateTableRow8*)row;
+            r8->fAccepting = sd->fAccepting;
+            r8->fLookAhead = sd->fLookAhead;
+            r8->fTagsIdx   = sd->fTagsIdx;
             for (col=0; col<catCount; col++) {
                 U_ASSERT (sd->fDtran->elementAti(col) <= kMaxStateFor8BitsTable);
-                row->r8.fNextState[col] = sd->fDtran->elementAti(col);
+                r8->fNextState[col] = sd->fDtran->elementAti(col);
             }
         } else {
             U_ASSERT (sd->fAccepting <= 0xffff);
@@ -1603,12 +1604,13 @@
         UnicodeString *rowString = (UnicodeString *)fSafeTable->elementAt(state);
         RBBIStateTableRow   *row = (RBBIStateTableRow *)(table->fTableData + state*table->fRowLen);
         if (use8BitsForSafeTable()) {
-            row->r8.fAccepting = 0;
-            row->r8.fLookAhead = 0;
-            row->r8.fTagsIdx    = 0;
+            RBBIStateTableRow8 *r8 = (RBBIStateTableRow8*)row;
+            r8->fAccepting = 0;
+            r8->fLookAhead = 0;
+            r8->fTagsIdx    = 0;
             for (col=0; col<catCount; col++) {
                 U_ASSERT(rowString->charAt(col) <= kMaxStateFor8BitsTable);
-                row->r8.fNextState[col] = static_cast<uint8_t>(rowString->charAt(col));
+                r8->fNextState[col] = static_cast<uint8_t>(rowString->charAt(col));
             }
         } else {
             row->r16.fAccepting = 0;
diff --git a/icu4c/source/common/uloc.cpp b/icu4c/source/common/uloc.cpp
index 522f33d..ebfbb50 100644
--- a/icu4c/source/common/uloc.cpp
+++ b/icu4c/source/common/uloc.cpp
@@ -877,6 +877,9 @@
     if(U_FAILURE(*status)) {
         return -1;
     }
+    if (*status == U_STRING_NOT_TERMINATED_WARNING) {
+        *status = U_ZERO_ERROR;
+    }
     if (keywordName == NULL || keywordName[0] == 0 || bufferCapacity <= 1) {
         *status = U_ILLEGAL_ARGUMENT_ERROR;
         return 0;
@@ -914,6 +917,7 @@
     startSearchHere = (char*)locale_getKeywordsStart(buffer);
     if(startSearchHere == NULL || (startSearchHere[1]==0)) {
         if(keywordValueLen == 0) { /* no keywords = nothing to remove */
+            U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING);
             return bufLen;
         }
 
@@ -933,6 +937,7 @@
         startSearchHere += keywordNameLen;
         *startSearchHere++ = '=';
         uprv_strcpy(startSearchHere, keywordValueBuffer);
+        U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING);
         return needLen;
     } /* end shortcut - no @ */
 
@@ -1047,13 +1052,27 @@
     if (!handledInputKeyAndValue || U_FAILURE(*status)) {
         /* if input key/value specified removal of a keyword not present in locale, or
          * there was an error in CharString.append, leave original locale alone. */
+        U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING);
         return bufLen;
     }
 
     // needLen = length of the part before '@'
     needLen = (int32_t)(startSearchHere - buffer);
-    return needLen + updatedKeysAndValues.extract(
+    // Check to see can we fit the startSearchHere, if not, return
+    // U_BUFFER_OVERFLOW_ERROR without copy updatedKeysAndValues into it.
+    // We do this because this API function does not behave like most others:
+    // It promises never to set a U_STRING_NOT_TERMINATED_WARNING.
+    // When the contents fits but without the terminating NUL, in this case we need to not change
+    // the buffer contents and return with a buffer overflow error.
+    int32_t appendLength = updatedKeysAndValues.length();
+    if (appendLength >= bufferCapacity - needLen) {
+        *status = U_BUFFER_OVERFLOW_ERROR;
+        return needLen + appendLength;
+    }
+    needLen += updatedKeysAndValues.extract(
                          startSearchHere, bufferCapacity - needLen, *status);
+    U_ASSERT(*status != U_STRING_NOT_TERMINATED_WARNING);
+    return needLen;
 }
 
 /* ### ID parsing implementation **************************************************/
diff --git a/icu4c/source/common/unicode/docmain.h b/icu4c/source/common/unicode/docmain.h
index b7984ad..edcb5d4 100644
--- a/icu4c/source/common/unicode/docmain.h
+++ b/icu4c/source/common/unicode/docmain.h
@@ -143,6 +143,11 @@
  *     <td>icu::MessageFormat</td>
  *   </tr>
  *   <tr>
+ *     <td>List Formatting</td>
+ *     <td>ulistformatter.h</td>
+ *     <td>icu::ListFormatter</td>
+ *   </tr>
+ *   <tr>
  *     <td>Number Formatting<br/>(includes currency and unit formatting)</td>
  *     <td>unumberformatter.h, unum.h</td>
  *     <td>icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions)</td>
diff --git a/icu4c/source/common/wintz.cpp b/icu4c/source/common/wintz.cpp
index 3730232..580ceda 100644
--- a/icu4c/source/common/wintz.cpp
+++ b/icu4c/source/common/wintz.cpp
@@ -36,17 +36,58 @@
 
 U_NAMESPACE_BEGIN
 
+// Note these constants and the struct are only used when dealing with the fallback path for RDP sesssions.
+
+// This is the location of the time zones in the registry on Vista+ systems.
+// See: https://docs.microsoft.com/windows/win32/api/timezoneapi/ns-timezoneapi-dynamic_time_zone_information
+#define WINDOWS_TIMEZONES_REG_KEY_PATH L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"
+
+// Max length for a registry key is 255. +1 for null.
+// See: https://docs.microsoft.com/windows/win32/sysinfo/registry-element-size-limits
+#define WINDOWS_MAX_REG_KEY_LENGTH 256
+
+#if U_PLATFORM_HAS_WINUWP_API == 0
+
+// This is the layout of the TZI binary value in the registry.
+// See: https://docs.microsoft.com/windows/win32/api/timezoneapi/ns-timezoneapi-time_zone_information
+typedef struct _REG_TZI_FORMAT {
+    LONG Bias;
+    LONG StandardBias;
+    LONG DaylightBias;
+    SYSTEMTIME StandardDate;
+    SYSTEMTIME DaylightDate;
+} REG_TZI_FORMAT;
+
+#endif // U_PLATFORM_HAS_WINUWP_API
+
 /**
-* Main Windows time zone detection function.
-* Returns the Windows time zone converted to an ICU time zone as a heap-allocated buffer, or nullptr upon failure.
+* This is main Windows time zone detection function.
+* 
+* It returns the Windows time zone converted to an ICU time zone as a heap-allocated buffer, or nullptr upon failure.
 *
-* Note: We use the Win32 API GetDynamicTimeZoneInformation (available since Vista+) to get the current time zone info.
-* This API returns a non-localized time zone name, which is mapped to an ICU time zone ID (~ Olsen ID).
+* We use the Win32 API GetDynamicTimeZoneInformation (which is available since Vista) to get the current time zone info,
+* as this API returns a non-localized time zone name which can be then mapped to an ICU time zone.
+* 
+* However, in some RDP/terminal services situations, this struct isn't always fully complete, and the TimeZoneKeyName
+* field of the struct might be NULL. This can happen with some 3rd party RDP clients, and also when using older versions
+* of the RDP protocol, which don't send the newer TimeZoneKeyNamei information and only send the StandardName and DaylightName.
+* 
+* Since these 3rd party clients and older RDP clients only send the pre-Vista time zone information to the server, this means that we 
+* need to fallback on using the pre-Vista methods to determine the time zone. This unfortunately requires examining the registry directly
+* in order to try and determine the current time zone.
+* 
+* Note that this can however still fail in some cases though if the client and server are using different languages, as the StandardName
+* that is sent by client is localized in the client's language. However, we must compare this to the names that are on the server, which
+* are localized in registry using the server's language. Despite that, this is the best we can do.
+* 
+* Note: This fallback method won't work for the UWP version though, as we can't use the registry APIs in UWP.
+* 
+* Once we have the current Windows time zone, then we can then map it to an ICU time zone ID (~ Olsen ID).
 */
 U_CAPI const char* U_EXPORT2
 uprv_detectWindowsTimeZone()
 {
-    // Obtain the DYNAMIC_TIME_ZONE_INFORMATION info to get the non-localized time zone name.
+    // We first try to obtain the time zone directly by using the TimeZoneKeyName field of the DYNAMIC_TIME_ZONE_INFORMATION struct.
     DYNAMIC_TIME_ZONE_INFORMATION dynamicTZI;
     uprv_memset(&dynamicTZI, 0, sizeof(dynamicTZI));
     SYSTEMTIME systemTimeAllZero;
@@ -86,22 +127,138 @@
             // Note '-' before 'utcOffsetMin'. The timezone ID's sign convention
             // is that a timezone ahead of UTC is Etc/GMT-<offset> and a timezone
             // behind UTC is Etc/GMT+<offset>.
-            int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+d", -utcOffsetMins / 60);
+            int ret = snprintf(gmtOffsetTz, UPRV_LENGTHOF(gmtOffsetTz), "Etc/GMT%+ld", -utcOffsetMins / 60);
             if (ret > 0 && ret < UPRV_LENGTHOF(gmtOffsetTz)) {
                 return uprv_strdup(gmtOffsetTz);
             }
         }
     }
 
-    // If DST is NOT disabled, but we have an empty TimeZoneKeyName, then it is unclear
-    // what we should do as this should not happen.
+    // If DST is NOT disabled, but the TimeZoneKeyName field of the struct is NULL, then we may be dealing with a
+    // RDP/terminal services session where the 'Time Zone Redirection' feature is enabled. However, either the RDP
+    // client sent the server incomplete info (some 3rd party RDP clients only send the StandardName and  DaylightName,
+    // but do not send the important TimeZoneKeyName), or if the RDP server has not appropriately populated the struct correctly.
+    //
+    // In this case we unfortunately have no choice but to fallback to using the pre-Vista method of determining the
+    // time zone, which requires examining the registry directly.
+    //
+    // Note that this can however still fail though if the client and server are using different languages, as the StandardName
+    // that is sent by client is *localized* in the client's language. However, we must compare this to the names that are
+    // on the server, which are *localized* in registry using the server's language.
+    //
+    // One other note is that this fallback method doesn't work for the UWP version, as we can't use the registry APIs.
+
+    // windowsTimeZoneName will point at timezoneSubKeyName if we had to fallback to using the registry, and we found a match.
+    WCHAR timezoneSubKeyName[WINDOWS_MAX_REG_KEY_LENGTH];
+    WCHAR *windowsTimeZoneName = dynamicTZI.TimeZoneKeyName;
+
     if (dynamicTZI.TimeZoneKeyName[0] == 0) {
+
+// We can't use the registry APIs in the UWP version.
+#if U_PLATFORM_HAS_WINUWP_API == 1
+        (void)timezoneSubKeyName; // suppress unused variable warnings.
         return nullptr;
+#else
+        // Open the path to the time zones in the Windows registry.
+        LONG ret;
+        HKEY hKeyAllTimeZones = nullptr;
+        ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, WINDOWS_TIMEZONES_REG_KEY_PATH, 0, KEY_READ,
+                            reinterpret_cast<PHKEY>(&hKeyAllTimeZones));
+        
+        if (ret != ERROR_SUCCESS) {
+            // If we can't open the key, then we can't do much, so fail.
+            return nullptr;
+        }
+
+        // Read the number of subkeys under the time zone registry path.
+        DWORD numTimeZoneSubKeys;
+        ret = RegQueryInfoKeyW(hKeyAllTimeZones, nullptr, nullptr, nullptr, &numTimeZoneSubKeys,
+                               nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
+        
+        if (ret != ERROR_SUCCESS) {
+            RegCloseKey(hKeyAllTimeZones);
+            return nullptr;
+        }
+
+        // Examine each of the subkeys to try and find a match for the localized standard name ("Std").
+        //
+        // Note: The name of the time zone subkey itself is not localized, but the "Std" name is localized. This means
+        // that we could fail to find a match if the RDP client and RDP server are using different languages, but unfortunately
+        // there isn't much we can do about it.
+        HKEY hKeyTimeZoneSubKey = nullptr;
+        ULONG registryValueType;
+        WCHAR registryStandardName[WINDOWS_MAX_REG_KEY_LENGTH];
+
+        for (DWORD i = 0; i < numTimeZoneSubKeys; i++) {
+            // Note: RegEnumKeyExW wants the size of the buffer in characters.
+            DWORD size = UPRV_LENGTHOF(timezoneSubKeyName);
+            ret = RegEnumKeyExW(hKeyAllTimeZones, i, timezoneSubKeyName, &size, nullptr, nullptr, nullptr, nullptr);
+
+            if (ret != ERROR_SUCCESS) {
+                RegCloseKey(hKeyAllTimeZones);
+                return nullptr;
+            }
+            
+            ret = RegOpenKeyExW(hKeyAllTimeZones, timezoneSubKeyName, 0, KEY_READ,
+                                reinterpret_cast<PHKEY>(&hKeyTimeZoneSubKey));
+            
+            if (ret != ERROR_SUCCESS) {
+                RegCloseKey(hKeyAllTimeZones);
+                return nullptr;
+            }
+
+            // Note: RegQueryValueExW wants the size of the buffer in bytes.
+            size = sizeof(registryStandardName);
+            ret = RegQueryValueExW(hKeyTimeZoneSubKey, L"Std", nullptr, &registryValueType,
+                                   reinterpret_cast<LPBYTE>(registryStandardName), &size);
+            
+            if (ret != ERROR_SUCCESS || registryValueType != REG_SZ) {
+                RegCloseKey(hKeyTimeZoneSubKey);
+                RegCloseKey(hKeyAllTimeZones);
+                return nullptr;
+            }
+
+            // Note: wcscmp does an ordinal (byte) comparison.
+            if (wcscmp(reinterpret_cast<WCHAR *>(registryStandardName), dynamicTZI.StandardName) == 0) {
+                // Since we are comparing the *localized* time zone name, it's possible that some languages might use
+                // the same string for more than one time zone. Thus we need to examine the TZI data in the registry to
+                // compare the GMT offset (the bias), and the DST transition dates, to ensure it's the same time zone
+                // as the currently reported one.
+                REG_TZI_FORMAT registryTziValue;
+                uprv_memset(&registryTziValue, 0, sizeof(registryTziValue));
+
+                // Note: RegQueryValueExW wants the size of the buffer in bytes.
+                DWORD timezoneTziValueSize = sizeof(registryTziValue);
+                ret = RegQueryValueExW(hKeyTimeZoneSubKey, L"TZI", nullptr, &registryValueType,
+                                     reinterpret_cast<LPBYTE>(&registryTziValue), &timezoneTziValueSize);
+
+                if (ret == ERROR_SUCCESS) {
+                    if ((dynamicTZI.Bias == registryTziValue.Bias) &&
+                        (memcmp((const void *)&dynamicTZI.StandardDate, (const void *)&registryTziValue.StandardDate, sizeof(SYSTEMTIME)) == 0) &&
+                        (memcmp((const void *)&dynamicTZI.DaylightDate, (const void *)&registryTziValue.DaylightDate, sizeof(SYSTEMTIME)) == 0))
+                    {
+                        // We found a matching time zone.
+                        windowsTimeZoneName = timezoneSubKeyName;
+                        break;
+                    }
+                }
+            }
+            RegCloseKey(hKeyTimeZoneSubKey);
+            hKeyTimeZoneSubKey = nullptr;
+        }
+
+        if (hKeyTimeZoneSubKey != nullptr) {
+            RegCloseKey(hKeyTimeZoneSubKey);
+        }
+        if (hKeyAllTimeZones != nullptr) {
+            RegCloseKey(hKeyAllTimeZones);
+        }
+#endif // U_PLATFORM_HAS_WINUWP_API
     }
 
     CharString winTZ;
     UErrorCode status = U_ZERO_ERROR;
-    winTZ.appendInvariantChars(UnicodeString(TRUE, dynamicTZI.TimeZoneKeyName, -1), status);
+    winTZ.appendInvariantChars(UnicodeString(TRUE, windowsTimeZoneName, -1), status);
 
     // Map Windows Timezone name (non-localized) to ICU timezone ID (~ Olson timezone id).
     StackUResourceBundle winTZBundle;
@@ -123,18 +280,29 @@
     int regionCodeLen = GetGeoInfoW(geoId, GEO_ISO2, regionCodeW, UPRV_LENGTHOF(regionCodeW), 0);
 
     const UChar *icuTZ16 = nullptr;
-    int32_t tzLen;
+    int32_t tzListLen = 0;
 
     if (regionCodeLen != 0) {
         for (int i = 0; i < UPRV_LENGTHOF(regionCodeW); i++) {
             regionCode[i] = static_cast<char>(regionCodeW[i]);
         }
-        icuTZ16 = ures_getStringByKey(winTZBundle.getAlias(), regionCode, &tzLen, &status);
+        icuTZ16 = ures_getStringByKey(winTZBundle.getAlias(), regionCode, &tzListLen, &status);
     }
     if (regionCodeLen == 0 || U_FAILURE(status)) {
         // fallback to default "001" (world)
         status = U_ZERO_ERROR;
-        icuTZ16 = ures_getStringByKey(winTZBundle.getAlias(), "001", &tzLen, &status);
+        icuTZ16 = ures_getStringByKey(winTZBundle.getAlias(), "001", &tzListLen, &status);
+    }
+
+    // Note: We want the first entry in the string returned by ures_getStringByKey.
+    // However this string can be a space delimited list of timezones:
+    //  Ex: "America/New_York America/Detroit America/Indiana/Petersburg ..."
+    // We need to stop at the first space, so we pass tzLen (instead of tzListLen) to appendInvariantChars below.
+    int32_t tzLen = 0;
+    if (tzListLen > 0) {
+        while (!(icuTZ16[tzLen] == u'\0' || icuTZ16[tzLen] == u' ')) {
+            tzLen++;
+        }
     }
 
     // Note: cloneData returns nullptr if the status is a failure, so this
diff --git a/icu4c/source/data/misc/langInfo.txt b/icu4c/source/data/misc/langInfo.txt
index f86df3e..90f1b8a 100644
--- a/icu4c/source/data/misc/langInfo.txt
+++ b/icu4c/source/data/misc/langInfo.txt
@@ -474,7 +474,6 @@
             "zh","Hant","HK",
             "zh","Hant","ID",
             "zh","Hant","MO",
-            "zh","Hant","MY",
             "zh","Hant","PF",
             "zh","Hant","PH",
             "zh","Hant","PA",
@@ -1872,623 +1871,623 @@
             "ZR","CD",
         }
         trie:bin{
-001a6dcc0e74c4ef77c26677a2b678a4
-5179a4c17a0f6d7c7a5b7a30e1ad9be8
-2ef5af3e10e1a53a022a3c42cc1d4811
-616e01e2a3fef4a3f90b4d24540e54ca
-c4552a5610cea3fc10d3a3fb4dcacd50
-2a5310d2a3f702c1a3f6c6a3f4c8a3f5
-47d4da473248d81e384910c4a3f101c2
-a3fac6a3ef6d326e36733a7910e2ad9b
-10e9af3c10e5af3d10ed22012aa90f43
-10c3a9106817683269366b3a6c10edaf
-3b10f8adb810e1af3a10f4ad96613264
-36653a6710e8adc710e7af3710eaaf38
-10e1af3900126d46741b743475387742
-e1adebefaf0210edaf0701f5af08f6af
-0910e1af0a6d3c6e406f50725a7301e7
-ad87ebaf0610efadfe02e3adffe9af00
-f5af0101e2af03f3af0410f3af056726
-6736683a693e6a4e6c10f3adfd10e9ad
-f610e7adf702e2adf8f5adf9f6adfa01
-e1adfbe9adfc6138625463646501eca5
-21f2adf504e5adeceaadedecadeeeead
-eff2adf002f0adf1f1adf2f2adf310e9
-adf40c6e3d7221722e7332774ee8af0e
-10e2af1404e1adbfe9af15eca530edaf
-16f2af1710e5af186e346f3e7001e5a7
-8ef2adbc01e1adb6f2af1101e7af12ee
-af13651d653a6c3e6d02e6af10eeadac
-f2adaf10f3af0d02e1af0fe3ada8e4ad
-a9613462386301efad76f2ad7510f6af
-0b10e9af0c0d6d49733073307534e9a7
-34efaf2b10f3af3004e1af31e532eaaf
-34f4af35f7af36012a2e4812616ef3af
-33012aaf324310ceaf336d3a6f3e7202
-e2af2de5af2eecaf2f10ecaf2a10eeaf
-2c6520653e67426b4c6c02e5af27e7af
-28ecaf2910f2af2301f2af24f7af2510
-efaf26612e62606410e4a73407f40cf4
-af1cf6af1df9af1efaaf1feda7b7efaf
-19f0af1af3af1b02e1af20e2af21f9af
-2274a25275a4d0760a6f1fe509e5adde
-e9ad62efade66f3472387501eeade9f4
-adea10f4ade710efade8613c654c6956
-6c606d01e6ade4f7ade502e7addce9ad
-cceeaddd01e3addff0ade001e3ade1f6
-ade210f3ade300267576e91ff20ef2ab
-c7f3abcbf4abd1f767f9abe1e9abaceb
-abb3ecabb7eeabbdefabbf7a247a36e1
-ab8be5ab9de72ee8aba810edabe4012a
-2e41127261e2aba4012aaba35010cbab
-a4753e7654776478ccf37901e1abe2f6
-abe303e8abd8ecabd9edabdaf1abdb02
-e4a7baecabdcf5abdd01e8abdef1abdf
-6b7d7049705e716e727273827406f10c
-f1abbbf2abd5f3abd6f4abd7e4abd2e5
-abd3eaabd402e9abc3edabc4faabc510
-efabc602f5abc8f6abc9f7abca04e4ab
-cce6abcde7abceeaabcff7abd06b426c
-526d626e6c6f02e6abc0e7abc1f1abc2
-02ecabb4f2abb5f4abb602e6abb8f8ab
-b9f9abba01e8abbbf9abbc10e8abbe65
-46655e6674677868886906eb0cebabaf
-edabb0efabb1f6abb2e2a3b1e6abade7
-abae03e4ab9eedab9fefaba0f4aba110
-e9aba202e3aba5efaba6f5aba702ecab
-a9f1abaaf2abab6144625a63866403e4
-ab99e7ab9ae8ab9bf5ab9c03eaab8cec
-ab8deeab8ef1ab8f06e70ce7ab93efab
-94f7ab95faab96e3ab90e4ab91e6ab92
-01e9ab97f9ab980f7362e72ce742ebab
-ebf2ad4afa012a8641127261e2adda01
-2a2e43127972ecabe8022aabe74b2a4d
-10ceabe910daabe873607464766e7a10
-ee012a2e41127261e2adda022aabf641
-2a4310ceaddb10c6adda10e1add601e8
-a54af2add701e8add8ecadd96d326d3e
-6e426f707202e9add3f4add4f7add510
-e2abed01f226f8add1012a2e44126576
-e1add0012aadcf4e10d0add010ebadd2
-62326436673a6c10e9abec10f5abe510
-edabe610e1abea70c39570a4f971a6d7
-72a6e47300287884ec39f229f509f5ab
-7af6ab80f7ab81f22cf3ab73f4ab7722
-032aab2d4da4bf522a5410d2ab3101cf
-ab30d5ab2eecab55edab5aeeab61efab
-67f16de429e438e5ab3de7ab42e9ab4b
-ebab51032aab3744324b3a5312696ee4
-ab3a126576e1ab3812686feaab397834
-793e7a48e1ab21e3ab2c01eeab87f7ab
-8801ecab89f2a50d10ecab8a6cad724f
-725873747484758e7705e809e8ab81f0
-ab85f6ab86e2ab82e3ab83e7ab8404e2
-ab70e3ab2ceeab71f2ab72f8a5f202e4
-ab74e7ab75f9ab7601ebab78f1ab7904
-e1ab7be5ab7cebab7df2ab7ef3ab7f6c
-4a6d666e8c6fa2437003e4ab6decab6e
-f3ab6ff9a77504e4ab56e9ab57ecab58
-efab51f9ab5905f009f0ab5ef1ab5ff3
-ab60e1ab5beaab5ceeab5d04e3ab62eb
-ab63f0ab64f8ab65f9ab6604e7ab68eb
-ab69f1ab6af5ab6bf9ab6c673e674268
-58696e6a846b02e3ab52f2ab53f3ab54
-03e1ab43f3ab44f7ab45faab4603e9ab
-47ebab48eeab49f5ab4a03e4ab4ce7ab
-4decab4eedab4f10f2ab50614a627663
-8664a26b6503e6ab3ee8ab3fe9ab40f3
-ab4106f30cf3ab25f4ab26f6ab27faab
-28e6ab22e8ab23f1ab2402e1ab29e5ab
-2af0ab2b06ee0ceeab34efab35f2a700
-f3ab36e32cebab32ecab332205521152
-2e53325410d2ab3110cfab3010d5ab2e
-2aab2d312a4d10c5ab2f1137b2ab2e01
-e3ab3be8ab3c00166e63752bec09eca9
-ecf3a9ddf4a9f9754c7750e1012a2e41
-127261e2a9d5012aa9d45010cba9d510
-f5a9fb10e1a9fc7217722e733e7410f0
-a9fa02e1a9f5e4a9f6e7a9f710f3a9f8
-6e346f4a7001e1a9f3efa9f403e2a7cd
-e7a9efeea9f0f4a9f110eea9f266306b
-176b2e6c386d10f3a9ee01e1a9eaefa9
-eb01e1a9edf4a92f663468386901eca9
-e8f0a9e910eca9e501eca9e6eea9e761
-4e627e638864926504e4a9e2efa9e3f2
-a571f3a571f8a9e404e7a9d6ec32eda9
-d9f0a9daf5a9db012aa9d75012686cf0
-a9d801e9a9dcf5a9dd01e4a9deeda9df
-01e3a9e0f4a9e1017526f5a9fd02e3a9
-fee7a9fffaa9fd00146f457917ef09ef
-a94cf5ab1af7ab1d792cedab0deeab12
-10f5ab206f3c724c745075547701ebab
-1eefab1f02e2ab15e6ab16efab1710ef
-ab1810edab1902e5ab1be7ab1ceda94c
-6934693c6a566b5a6d5e6e01e1ab13e7
-ab1401e1ab08e622012aab094e10ccab
-0a10f3ab0b10f4ab0c03e6ab0eefab0f
-f4ab10f5ab1161366346654a675a6810
-e7ab0702e9ab00eaa961efab0110e6ab
-0202eaab03ecab04f3ab0510eeab066d
-a2576ea63e6f0b741ded09eda5a2f2a9
-ccf3a9cf742a7a34e3a9c401e1a9d1eb
-a9d210eda9d37017702e72327310e1a9
-d010eda9cb02efa9cdf5a9cef9a9cc67
-3a6b3e6e02e7a9c8eea9c9f3a9ca10e3
-a9c501f2a9c6f6a9c70022749fe926ef
-0fefa94cf2a957f3a492f4a95bf9a3ce
-e9a90ceba906eca941ee012abacc4d12
-6f6ee7a540783d7834793e7a64e7a92f
-e8a93501e3a96aeda96b05f709f7a96f
-f8a970faa971eba96ceda96df6a96e05
-f009f0a975f7a976faa977eba972eda9
-73eea9747444755a76707703eba967f2
-a538f6a968f7a96903e3a95ce6a95de9
-a95ef2a95f03e1a960f0a961f2a962f3
-a96302e1a964eea965f9a96669856e44
-6e426f5e707a71907202e4a958eaa959
-efa95a04e1a948e6a949e9a94aebb61a
-f7a94b04e1a94de5a94ee8a94ff3a950
-f8a95103f0a952f3a953f4a954f8a955
-10eca956693e6b686c7e6d02efa945f5
-a946f8a94703e6a938eea939f326f7a9
-3c012aa93a4d126564e6a93b03e9a93d
-eca93ef0a93ff7a94002e5a942f0a943
-f3a9446549653e666a67866802e9a936
-eca937f2a50006ee0ceea926f2a927f4
-a928f5a929e4a923e5a924eba92504e1
-a92ae5a92beea92cefa92df1a92e04e8
-a930eca931efa932f0a933f9a934615e
-62a25063a25d6406e80ce8a91feaa920
-f2a921f8a922e1a91ce5a91de6a91e0b
-ee1df712f7a90ef926faa91122012aa9
-0f4310c3a910eeb431efa90cf3a90de7
-09e7a909e9a90aeba90be3a906e4a907
-e6a90804e8a912efa913f1a914f5a915
-f7a91604e9a917f0a918f1a919f2a91a
-f5a91b0021745fe41dee0feea9a2efa9
-a8f2a9aff6a9bcf9a9c0e4a987e5a98a
-e7a98feca54c791579307a3ae1a978e2
-a98001eda9c1eea9c210e9a9c3743875
-42775e7801f1a9bef2a9bf01eda9b5f2
-a9b604e9a9b7f0a9b8f3a9b9f6a9baf8
-a9bb10e2a9bd6a5d6f326f4870647168
-726c7303eba9b1eea9b2efa9b3f3a9b4
-04e4a9a9e5a9aaeea9abf0a9acf5a9ad
-10e9a98a10efa9ae10e2a9b06a4a6b4e
-6d586e04e6a9a3e8a9a4eba9a5eda9a6
-f0a9a710efa99d01e7a99eefa99f01e7
-a9a0faa9a16637665a675e686e6906ee
-0ceea999f5a99af9a99bfaa99ce6a996
-e9a997eaa99810f2a98e02e1a990e2a9
-91eca99202e2a993e5a994f7a995613e
-636a64906502e2a98bf7a98cf8a98d06
-ee0ceea97cf0a97df1a97ef3a97fe3a9
-79e6a97aeba97b05e809e8a984efa985
-f5a986e1a981e5a982e6a98301e3a988
-f3a98966c75369c49669a4166aa4c46b
-a6116c001b744ae717ef0cefa7f4f4a7
-fcf5a7fef6a902e7a7dee9a7e0eea7f1
-771577307a34e1a7c9e2a7d010eca903
-01e8a904faa905742e75327610f3a902
-10e7a7fd03e1a7ffefa900f9a3d5faa9
-016a4a6d316d326e426f4c7210e3a7fb
-02eea7eeefa7eff0a7f001f3a7f2f5a7
-f305f209f2a7f8f3a7f9faa7faeaa7f5
-eba7f6eca7f76a346b386c01e5a7ecee
-a7ed10f0a7e901e9a7eaf4a7eb644864
-6c6570679c6906e70ce7a7e5e8a7e6ea
-a7e7f3a7e8e1a7e1e4a7e2e6012aa7e3
-4c12696de2a7e410e2a7d606f00cf0a7
-daf1a7dbf5a7dcfaa7dde4a7d7e5a7d8
-eda7d910e7a7df6134625a6301eda7d4
-f0a7d505e809e8a7cdeaa7cef3a7cfe2
-a7cae4a7cbe7a7cc02e5a7d1f5a7d2f7
-a7d300197739eb17f30cf3a70ef4a726
-f5a71af7a727eba568eea721efa723e4
-09e4a710e7a715e9a718772a7a34e1a7
-0701eda728f3a72901e8a72ae9a72b6a
-366d176d326e366f3a7210e9a72510ef
-a72010e8a72210f5a7246a2e6b326c10
-efa71f10eaa71904e5a71aeba71bf4a7
-1cf7a71df8a71e641a643466446701e2
-a716e5a71702e4a711e9a712f5a71310
-e5a714613a62446302e1a70de5a70ee8
-a70f01eea708f2a70902e1a70ae2a70b
-f9a70c0b721ae909e9a734f6a73af7a7
-3b722a752ee1a72c10e1a73810f4a739
-67176734693e6d01e3a736eca73701eb
-a72fefa73310e2a735612e623e6510ee
-a73202e2a72deda72ef2a72f01efa730
-f5a731002875c0edeb74f23ff628f6a7
-92f7a7b4f9022a32414c4c126174eea7
-c2022aa7c0432a5410d2a7c210cea7c1
-127261e2a7c1f2a785f3a79ef5022aa4
-6441a46a5912657ae9a780eb38eca774
-eda779eea784efa789012a2e41127261
-e2a76f042aa76d41324336493a4d10ce
-a77110c6a76e10cea76f10d2a7707a1b
-7a38e1a5b1e7a758e9a764eaa76803e8
-a7c5eaa7c6f2a7c7f4a7c8753c766e77
-7e788e7901e5a7c3f8a7c407ed0ceda7
-adeea7aef0a7aff3a7b0e2a7a9e4a7aa
-e5a7abeaa7ac02e7a7b1f2a7b2f8a7b3
-02eaa7b5efa7b6f1a7b707ed0ceda7bc
-f0a7bdf7a7befaa7bfe1a7b8e3a7b9e5
-a7baeca7bb6bc0d57063704a71707286
-73a2457403e2a7a5eda7a6efa7a7f2a7
-a805f209f2a791f6a792f8a793e5a78e
-e6a78fefa79003e2a794e6a795f3a796
-f9a79705ec09eca79bf3a79cf5a79de3
-a798e9a799eaa79a05e809e8a7a2eaa7
-a3f2a7a4e2a79fe4a7a0e6a7a16b506c
-5a6d706ea2576f04e9a78aeba787eca7
-8bf3a78cfaa78d01e3a772eaa77303ee
-a775f1a776f4a777f8a77806f226f232
-f3a781f5a782f7a783022a3241405912
-657ae9a780012aa77d4c10c2a77e1272
-61e2a77fe2a77ae8a77befa77c04e3a7
-85e6a786e7a758eea787f0a788665266
-486758686869a06a03e4a769e7a76af3
-a76bf9a76c02efa755f2a756f9a75702
-e5a759e6a75af0a75b08f10ff1a75ff3
-a760f4a761f7a762faa763e1a75ce2a7
-5debac8ceea75e02eaa765f5a766f7a7
-6761446276639c64a2486502e1a752ee
-a753faa75407e90ce9a740eaa741eda7
-42efa743e1a73ce2a73de3a73ee4a73f
-05f109f1a747f8a748f9a749e4a744ed
-a745f0a74603e7a74aeba74beca74cf4
-a74d03e5a74ee8a74feca750f4a75166
-a2b567a46a6800137539f20ff2a700f4
-a703f5a704f9a342faa7067536e13ae5
-a5eae9a5ecefa5fc10e9a70522032aa5
-e0372e43345310c4a5e11133b6a5e110
-cda5e26c386c3c6d466e506f6c7301e2
-a701eea70201e1a5f3f5a5f401e4a5f5
-f4a5f604e4a5f7e5a5f8eaa5f9eea5fa
-efa5fb02e3a5fdeaa5fef4a5ff615862
-746478687c6905e809e8a5f0eca5f1ed
-a5f2e1a5ede6a5eee7a5ef04e7a5e3eb
-a5e4eda5e5f7a5e6faa5e710e2a5e810
-f9a5e910f9a5eb00117553e90fe9a57b
-eaa57fefa582f2a588f9a59775427694
-e1a571e6012aa5774112646ceda57809
-e80fe8a591f1a592f2a593f6a594f9a5
-95e2a58de332e4a58ee5a58fe6a59001
-2aa5774112646ceda57810f2a5966d2f
-6d4e6f52706271667204e3a589e5a588
-f0a58af2a58bf3a58c10f0a58102e4a5
-83eea584f2a58510e5a58610f3a58761
-32665669606c10f2a58005e908e9a575
-eea576f467e1a572e2a573e7a57401e9
-a579eda57a02e1a57ceca57df4a57e00
-1a6e9f791dec0ceca5bdeea5c1f5a5d1
-f6a5d9792ce1a598e4a5aa01e1a5a3e9
-a5df733a733e754276747702e3a5dce9
-a5ddf4a5de10f7a5d007f20cf2a5d5f7
-a5d6f8a5d7faa5d8e2a5d2e3a5d3e4a5
-d4e7a5c102e6a5daf2a5b4f3a5db6e5a
-6f6a7204e2a5a6e332e5a55bf4a5cef7
-a5cf012aa5cc4c12696ee2a5cd02e4a5
-c2e7a5c3efa5c407ee0ceea5c4f2a5c9
-f3a5caf4a5cbe4a5c5e6a5c6e9a5c7ed
-a5c8673c6a236a386b486c526d01eda5
-bff6a5c002eba5b8eea5b9f5a5ba01ee
-a5bbf0a5bc10eba5be6734683e6901ec
-a5b6eda5b701eea5b4efa56710f3a5b5
-6428642e653e6610eba5b302e5a5abee
-a5acf2a5ad05ef09efa5b1f2a52efaa5
-b2e2a5aeeaa5afeca5b0612e626c6310
-f2a5a909ed0feda59eeea59ff7a5a0f9
-a5a1faa5a2e1a599e6a59ae7a59be8a5
-9ceaa59d05ef09efa5a6f9a5a7faa5a8
-e1a5a3e6a5a4eda5a563c2f863a2a364
-a6026500127733ee19ee38efa564f3a5
-66f4a559f5a366012aa56053126861f7
-a561773478387a3ce5a554eca55b10ef
-a56e10f4a56f10e1a5706d466d486e7a
-728473887403f2a56af4a56bf5a56cf8
-a56d02e1a55ce9a55deb012a2e4e126b
-6fefa55f012aa55e4710cea55f01eea5
-62f1a56310e9a56502e7a567eba568f5
-a569623e664267466b02e1a558eba559
-f9a55a10f5a55310e9a55501eca556f9
-a557001b725ce821f316f3a51af52cf6
-a520f9a521012aa51e47126c61e7a51f
-e8a3ebefa510f2a513771277307a34e1
-a3e1e5a3e710e4a51310e5a51a722e73
-547410e4a51d05ec09eca517eda518f3
-a519e8a514eaa515eba51601e2a51bf7
-a51c69526c306c326d3c6f6c7010f3a5
-1201e1a50ce4a50d02e5a50ee7a50fee
-022aa26342a2b44811616e01e2a3fef4
-a3f910f0a51169406a446b03e2a508ec
-a509efa50af9a50b10e3a50402e1a505
-eda506f6a507659565a28666a28767a2
-886805ef09efa501f0a502f2a503e92c
-eba3ffeda500022a3c42a25f4811616e
-01e2a3fef4a3f90b4d335417542e5538
-5610c4a3fc01c8a3f8d7a3f901cba3fa
-d3a3fb4d2e50385310d2a3f701cfa3f2
-d9a3f302c6a3f4c8a3f5daa3f6470e47
-3048b46d4910c4a3f110c6a3ef2aa3ec
-412a4210cea3ee10d5a3ed126f70efa3
-fd10e2a3e810e1a3e910e7a3ea613462
-3e6301e8a3e5f0a3e601e4a3e2eea3e3
-10eaa3e40016726f791ce508e5a52ef6
-a54dfa45792a7a34e1a52201efa550f5
-a55110e7a552751d752e764a7710f7a5
-4f04e1a548e3a549e4a54ae7a54bf4a5
-4c10e1a54e724073747403eda544f0a5
-45f3a546f9a54702e82ce9a541f3a542
-012a2e4d126f6ee7a540012aa53f4310
-cea54010e2a54367446a1a6a406e446f
-03e2a53ce9a535f0a53df7a53e10e5a5
-3b10eaa524673468606901e1a539f1a5
-3a06ec0ceca534efa535f2a536faa537
-e1a531e8a532e9a53310e4a538613c62
-68637264766501e4a52feea53006e80c
-e8a526eba527f2a528f6a529e4a523e6
-a524e7a52501e4a52af1a52b10e3a52c
-10eea52d2aa4f761bea462002373a5e5
-1ded0feda3a8eea3adefa3b1f2a3baf3
-a3bfe5a37ce7a389e8a38de9a3937741
-7732783c794c7a72e1a36201e4a3d2f2
-a3d302e8a3d4eba3d5f2a3c705f309f3
-a3d9f6a3daf8a3dbe5a3d6eea3d7f2a3
-d804e1a3dce5a3dde6a3dee8a3dff7a3
-e07332744875587610e2a3d103eaa3c0
-f1a3c1f3a3c2f4a3c302efa3c4f4a3c5
-f6a3c609ed0feda3ccefa3cdf2a3cef3
-a3cff5a3d0e1a3c7e3a3c8e4a3c9e7a3
-caeba3cb6a7d6e3b6e486f587068716c
-7203e1a3bbe8a3bcf8a3bdfaa3be02e7
-a3aeeda3aff0a3b002eaa3b2eda3b3ee
-a3b410f9a3b503e3a3b6e9a3b7f0a3b8
-f6a3b96a466b786ca4ab6d03e8a3a9eb
-a3aaf1a3abf5a3ac07ef0cefa39ef2a3
-9ff4a3a0faa3a1e8a39ae9a39beaa39c
-eea39d04e3a3a2eda3a3f1a3a4f5a3a5
-f6a3a6656a6562669467a24468a24b69
-06ed0ceda396eea397efa398f1a399e2
-a394e7a395eba37507f40cf4a381f7a3
-82f8a383faa384e6a37de8a37eeaa37f
-eda38003e4a385f1a386f4a387f9a388
-02e3a38aeea38bf8a38c05ec09eca391
-efa38df9a392e2a38ee7a38fe9a39061
-32626463906410e4a37b07f20cf2a367
-f3a368f6a369f8a36aeca363eea364f0
-a365f1a36606e40ce4a36eeaa36ff0a3
-70f2a371e1a36be2a36ce3a36d09ed0f
-eda376eea377efa378f1a379f5a37ae3
-a363e6a372e8a373e9a374eca3750018
-4dc26554c0ca57365736584e59645a12
-616ee2adce01612c631168efa9a71172
-e1adcd01702a731175f8691165efa9e3
-01652c691169e9a718117ae9a7805434
-55a28756126169e9adcc056746674a68
-506901622a7210e8adcb10f4012aa3b1
-4210d445116ce7adc8106101e158e904
-2aaba843324b364c3a5410c8aba810ce
-a7d510c8adc910c1adca012aa54d4d10
-d6a54d6130657c66116ee7adc7056d11
-6d2e6e327610f4a3a710ecab8b10e7ab
-e067346b386c01e5ab99f5a75d10e2ad
-c510f2adc6116cf5ab9d126761f2abea
-50c0c350a27252a2a85306694369426f
-6a759079016c2a7210e3a50d10efadc4
-01643e6e01e4ab3ae8012aab4b4c10cb
-ab4b10e4adc102672e72387910efa50f
-01e4ab68efadc210e1ab70116ee4adc3
-613e675e6801612a7210e4adc010f7a5
-61026d2e72327510f2ab2810f2ab5e10
-e2adbf116ef7a34b046138654a68506c
-76721174e9adbc016c2a7510e3a51d10
-eda11172edadba02612e6c326e10f8a9
-e710e7adbb01e9a9d7f0a9d81172e4a5
-f5026a306f3675116ef2a9ab116ee7ad
-bd1168e7adbe4d7c4ea2a44f0367426c
-48724e7301672a6d10e1adb910e5a9d0
-1161edab431163ebab26016b2a7910e1
-a9cc10e8a9d207722e725a7460756679
-116df2032aa3ce492e4d325410c8adb4
-10cea76110cda3ce116fefa95a1165e9
-adb2116cf4adb3614265746c9a6f0164
-2a6e10e7a54010e9adb10368326b366e
-3a7210e3adad10eaadaa10e1adab01e4
-a971e9adac0264346e387201e3adafef
-adb010e6a93b10e4adae1179eda94104
-6138624c65506b56731168f5adb8016e
-2a7210e2adb610e4adb51161f49f1177
-e1adb7116fefa55f47c41b4ac32f4aa6
-c04ba6d94c03614665a69c69a69e7901
-632a6410e9ada910e9ada8026ea6796f
-a67a7410ee001a4bc139545b571457ac
-7058ac7459305a01c1abf2d7ab6110d4
-ad66544055825603c1ad61c5ad63cead
-62d5a3930bce14d609d6abdcd7abc9da
-ab81ceada6cfabbfd2abc7cbc5d4cbab
-b4ccad5dcdabb304c1ada7c7ad5fd3a5
-60d9ad60daabf64e824e8a50a24a52a2
-6d530cce17d40cd4ad57d5a79bd6ad58
-d9ada5cead55cfab67d2ad56ca09caad
-53cbab51cdad54c3ad52c5ab80c9ab55
-06c70cc7abeec9ad45cca54ccfa980c1
-ad42c3ad43c5ad440acc14d409d4ad4e
-d7a9dbd9a5c1cca9eccdad4bd2ad4cc1
-ad47c5ad48c6ad49c7abc3c8a57d03c5
-ad51cfa94cd5a79bd7ab1d4b9e4ca243
-4d0010cd1dd40fd4a95bd5a92bd8abf0
-d9a90fdaad41cda73ecfada3d1ad3fd2
-ada4c60cc6ad3ec7a92fcbada2cca3a8
-c1ada1c3ad3cc4ad3dc5ab2f01c5ad31
-cdada004c9ad37d3ad38d4a7fcd5ad39
-d6a90243c0c246644656476648a24d49
-05d209d2ad9fd3a70ed4a726c3ad2ec4
-a710c5ad2202c9a57bcfa582d2a5880c
-ce17d30cd3ad29d4ad2ad5abf5d7ad2b
-cead26d0ad27d1ad28c608c6ad25c867
-cca774c1ad24c2abf8c5ad9e04cdad2c
-cead2dd2a700d4a703d5a704435244a2
-424505d309d3a566d4ad98daad23c1ad
-1ec3ad1fc5a5590fcf1ad60cd6ad19d7
-abfad9ad9cdaa51acfad16d0ad17d2ad
-18d5abf3c9c68cc9ad13ccad14cdad15
-cead9b05cb09cba522cfad1cdaad9dc5
-a52ec7ad50caad1b345e34ae87417842
-0bce14d209d2a9f9d5a73ed6ad0fcead
-0ccfad0dd1ad0ec909c9ab12caad0acc
-ad0bc1a3bfc5ad07c6ad080cd217d50c
-d5abefd7ad05d8ad06daa35ed2ad02d3
-ad03d4ad04cd09cdad9acfad00d1ad01
-c4abfdc6ad99cc6d2aa560312c321133
-b0ad981137b2a79b10e1a9a910ef012a
-a7f44c10c1a7f41170e3a7da026d2e6e
-327310f5a7e810e2a7e401e1a7cae2a5
-cd01613a701161ee012aa72c4a10d0a7
-2c016d2a7610e1ad9410efad93056e1e
-6e306f36741168e9ad971164e1a78411
-72e5012aa7894b01d0ad33d2a7896130
-6844691174f3ad96016c2a6e10e1ad95
-10e9a55a02612e6d326f10eaab3910f2
-a9f510f2012aa7794b10c8a779473448
-a25c49127461eca56b0465466c5a6f60
-727a75016a2a7210f5a9d410f2a5d111
-6ff2012aa5b14710c5a5b11161e7a51f
-016e2a7410e8a5cb01e7ad87eda56701
-61506510eb032aa55b432e47325410d2
-a38c10d9ad1a10d2a55b10eead88056c
-186c306d3675116ee7ad921175f7a5f4
-106e01e7a5f9f0a9696130659c691172
-e1ad91016e2a7410f2a93a05ef24efad
-8bf34cf4032aa3f9482e4d325410d7a3
-f910cba3f010cfa3f2012aa3ec4310ce
-a3ece2a3fee7ad89e9ad8a1162f20549
-17493a533e5502c1ad8fcbad8dd3ad90
-10cca5ea10c5ad8e2aa5ea432a4710c2
-ad8d10c1ad8c43c107437044a2c04502
-67406c46741168e9012a754501d2ad21
-d4751179f0a55701622a7910edad8610
-e1ad850461a26968a2786fa28770a289
-791172ec0a4d335414542e55385810cb
-ad7e01caaba3d2ad7d10c1abeb4d2e52
-3e5310cbad7c02c4ad7acba906cea53f
-02cfad7bd3ab2dd5ab1a2aab1a413842
-3c474c4b01c7a7c0daad3510ccad7702
-c1ad78c7a389d9a37c01c5a9cfd2ad79
-026b2e6e327210e9ad7510eda3e610f3
-a51302612e65327210f3ad7610eda506
-10f2a5031170f4a5111172f4a5cc0365
-3469866f8c751170ecad841176e10649
-1749324d364e3a5010cba3c610cea5ec
-10d5ad8110d0a98a2aa5ec422a4610ca
-ad8010d4ad7f1161ebad821167f2ad83
-2aa25441aa3142056f1f6f3e72447501
-672a6810e4ad7410e9ad731170efa3fd
-106101e8a9eae9ad726130655c68116b
-f3ad71036c326d36733a7410ebad7010
-e9ad6f10f5a36a10f3a3c1116ee7012a
-a3ad4210c4a3ad00214ac1c052c0cc56
-38563c5758586259665a01d2abf1d7ab
-6104c1ad61c4ad62c5ad63cead62d5a3
-9301c6ad64d3ab5a10cbad6503c4abfc
-c5abfcd4ad66d5ab2d5246536c54a257
-5503c1abebc7ad5fd9ad60daabf605d3
-09d3ab2dd5ab1ad7ab1dc5ad51c8ab61
-cfa94c0ecd1ad40cd4ad57d5ab1ad6ad
-58d9ad59cdad54cead55cfab67d2ad56
-c50cc5ab80c9ab55caad53cbab51c1ab
-f7c3ad52c4abfb0ecd1ad20cd2abc7d6
-abdcd7a3f9daab81cdabb3cead5ecfab
-bfd0ad5dc80cc8aba8caaba3cbabb4cc
-ad5dc4ad5ac6ad5bc7ad5c4e644e404f
-a89650785102c1ad4fcfad50d5ad2209
-cc0fcca54ccfa980d0a98ad1ad01d4ab
-f7c1ad42c3ad43c5ad44c8a393c9ad45
-0dcd17d40cd4ad4ed7a9dbd9a5c1daad
-47cdad4bd2ad4cd3ad4dc70cc7abc3c8
-a57dcbad4acca9ecc1ad47c5ad48c6ad
-494aa2484ba24c4ca2644d0012ce20d5
-0fd5a92bd6a54dd8abf0d9a90fdaad41
-cea53fcfa3f2d1ad3fd2ad40d4a95bc6
-0fc6ad3ec7a92fcba906cca3a8cda3ce
-c1ad3bc3ad3cc4ad3dc5ab2f01cfad30
-d0a72c07d00cd0ad33d2a789d7ad34da
-ad35c5ad31c7a7c0c8a779cdad3208d3
-0fd3ad38d4a7fcd5ad39d6a902d9ad3a
-c1a7f4c2ad36c9ad37cbab4b41c16045
-98456a46a24147a24e48a2754907d10c
-d1ad2fd2a571d3a70ed4a726c3ad2ec4
-a710cca5eacea5ec09d20ed2ad21d3a5
-66d475d5ad22daad23c1ad1ec3ad1fc5
-a559c79bc8ad2004c9a57bcfa582d1ad
-01d2a588d8a5880bd014d309d3ad29d4
-ad2ad7ad2bd0ad27d1ad28d2a55bc808
-c867cca774cead26c1ad24c5a5b1c6ad
-2506d20cd2a700d4a703d5a704d6ad08
-cba3f0cdad2ccead2d415e42a24c43a2
-834406cb0ccba522cfad1cd9ad0adaad
-1dc4a52ec5a52ecaad1b0dd117d40cd4
-ad04d7ad05d8ad06daa35ed1ad01d2ad
-02d3ad03cc0bcc6dcda342ceabfacfad
-00c4abfdc5abfec6abff0010cc1cd20e
-d2a9f9d445d5a3ced6ad0fd9a37cccad
-0bcead0ccfad0dd1ad0ec70cc7a389c8
-ad09c9ab12caad0ac1a3bfc4a3adc5ad
-07c6ad080010cf1dd50fd5abf3d6ad19
-d7abfad9ad1adaa51acfad16d0ad17d2
-ad18d3ab2dc90cc9ad13ccad14cdad15
-cea3ecc4abf1c6ad10c7ad11c8ad1234
-2234423548374e3801382a3910b0ab2d
-10b6abfc1131b9abf91133b2abfa1133
-b6abfb2aa560305031a26b3202302e33
-383810b0a52e01b0a51ab2abee10b075
-0533233334354a3601b1ab5ab2a5ec03
-b0a3ecb4a5ecb5a710b9a72602b3abef
-b4abf4b7abf53034314a3201b1a560b9
-abf303b2abeeb3a560b5a9f9b9abef06
-b50bb59bb7abf1b8abf2b9a560b1abee
-b3abf0b4ab8102342e353e3710b2ab1a
-02b2a3ecb3abf6b5abf703b0ab1ab1ab
-1ab4abf8b5a52e046436673c68427246
-761173f44b116ceda5781168e2ad6711
-6fed6301613c6d01e99dee012aa34241
-10cda34210e200134c625131513c5340
-5450556a5901c5abfcd4ab8210c1ad4f
-02c1abf7c4abfbd9ad5904c791c8a92a
-caad6dcead5ed2ad6e10cbad684c3c4d
-464e624f665001cbad4ad3ad4d01c2ad
-36d9ad3a04c1ad3bcdab07cea771d2ad
-40d5ad6b10c7ad6c10cdad46452e4542
-474a494e4a644b02c8a505cdad32d7ad
-3401c79bc8ad2010c2ad6803c4ad69ce
-ad6ad1ad2fd2a57110cfad302a9b4132
-423c43464410daad1d01c5abfec6abff
-01c8ad09d5ab0701c3a910ceabe70021
-7588e62bf221f29bf3a349f6a353f9a3
-5cfa012a2e41127261e2a360022aa35e
-498a5210d5a361e651eb67ed75ee7f7a
-2d7a2ce125e22de54b10ea012a2e4112
-7261e2a360032aa35e312e49345310d5
-a3611137b2a36101d1a35fd2a3607538
-763c77527901e2a35df2a35c10f9a352
-03eca354eea355f4a356f5a35703e1a3
-58e2a359efa35af8a35b6b966f696f44
-704e726873a2507402e1a34fe7a350ea
-a35102ea89ed8bfa8d05f206f295f397
-fa99e38fe491e59309ef0fefa344f1a3
-45f3a346f9a347faa348e29be332e8a3
-41eda342eea343022a9d4e2c5012616c
-eda1126261f49f04e1a34ae5a34be7a3
-4cefa34df4a34e6b3c6c3e6d586e03e3
-81eb83ee85f98710eb6905ee06ee71f3
-6df473e16be26de96f03ed77ee79ef7b
-f07d65256530673668506a10e76501e2
-4df94f05ed06ed59ef5bf15de353e455
-e75702e15fec61ef6361486252636464
-05f006f045f947fa49e13fe541ea4302
-e927eb29f52b04e92ff131f233f435f9
-3702e439e53be83d
+001a6dcc0f74c4f077c26777a2b778a4
+5279a4c27a0f6d7d7a5c7a30e1ad9ae8
+2ef5af3d10e1a539022a3c42cc184811
+616e01e2a3fdf4a3f80b4d25540e54ca
+c5552a5610cea3fb10d3a3fa4dd81e50
+502a5310d2a3f602c1a3f5c6a3f3c8a3
+f447d4d4473248d81e324910c4a3f101
+c2a3f9c6a3ef6d326e36733a7910e2ad
+9a10e9af3b10e5af3c10ed22012aa90e
+4310c3a90f6817683269366b3a6c10ed
+af3a10f8adb710e1af3910f4ad956132
+6436653a6710e8adc610e7af3610eaaf
+3710e1af3800126d46741b7434753877
+42e1adeaefaf0110edaf0601f5af07f6
+af0810e1af096d3c6e406f50725a7301
+e7ad86ebaf0510efadfd02e3adfee9ad
+fff5af0001e2af02f3af0310f3af0467
+266736683a693e6a4e6c10f3adfc10e9
+adf510e7adf602e2adf7f5adf8f6adf9
+01e1adfae9adfb6138625463646501ec
+a520f2adf404e5adebeaadececadedee
+adeef2adef02f0adf0f1adf1f2adf210
+e9adf30c6e3d7221722e7332774ee8af
+0d10e2af1304e1adbee9af14eca52fed
+af15f2af1610e5af176e346f3e7001e5
+a78df2adbb01e1adb5f2af1001e7af11
+eeaf12651d653a6c3e6d02e6af0feead
+abf2adae10f3af0c02e1af0ee3ada7e4
+ada8613462386301efad75f2ad7410f6
+af0a10e9af0b0d6d49733073307534e9
+a733efaf2a10f3af2f04e1af30e532ea
+af33f4af34f7af35012a2e4812616ef3
+af32012aaf314310ceaf326d3a6f3e72
+02e2af2ce5af2decaf2e10ecaf2910ee
+af2b6520653e67426b4c6c02e5af26e7
+af27ecaf2810f2af2201f2af23f7af24
+10efaf25612e62606410e4a73307f40c
+f4af1bf6af1cf9af1dfaaf1eeda7b6ef
+af18f0af19f3af1a02e1af1fe2af20f9
+af2174a25275a4d0760a6f1fe509e5ad
+dde9ad61efade56f3472387501eeade8
+f4ade910f4ade610efade7613c654c69
+566c606d01e6ade3f7ade402e7addbe9
+adcbeeaddc01e3addef0addf01e3ade0
+f6ade110f3ade200267576e91ff20ef2
+abc6f3abcaf4abd0f767f9abe0e9abab
+ebabb2ecabb6eeabbcefabbe7a247a36
+e1ab8ae5ab9ce72ee8aba710edabe301
+2a2e41127261e2aba3012aaba25010cb
+aba3753e7654776478cced7901e1abe1
+f6abe203e8abd7ecabd8edabd9f1abda
+02e4a7b9ecabdbf5abdc01e8abddf1ab
+de6b7d7049705e716e727273827406f1
+0cf1abbaf2abd4f3abd5f4abd6e4abd1
+e5abd2eaabd302e9abc2edabc3faabc4
+10efabc502f5abc7f6abc8f7abc904e4
+abcbe6abcce7abcdeaabcef7abcf6b42
+6c526d626e6c6f02e6abbfe7abc0f1ab
+c102ecabb3f2abb4f4abb502e6abb7f8
+abb8f9abb901e8abbaf9abbb10e8abbd
+6546655e6674677868886906eb0cebab
+aeedabafefabb0f6abb1e2a3b1e6abac
+e7abad03e4ab9dedab9eefab9ff4aba0
+10e9aba102e3aba4efaba5f5aba602ec
+aba8f1aba9f2abaa6144625a63866403
+e4ab98e7ab99e8ab9af5ab9b03eaab8b
+ecab8ceeab8df1ab8e06e70ce7ab92ef
+ab93f7ab94faab95e3ab8fe4ab90e6ab
+9101e9ab96f9ab970f7362e72ce742eb
+abeaf2ad49fa012a8641127261e2add9
+012a2e43127972ecabe7022aabe64b2a
+4d10ceabe810daabe773607464766e7a
+10ee012a2e41127261e2add9022aabf5
+412a4310ceadda10c6add910e1add501
+e8a549f2add601e8add7ecadd86d326d
+3e6e426f707202e9add2f4add3f7add4
+10e2abec01f226f8add0012a2e441265
+76e1adcf012aadce4e10d0adcf10ebad
+d162326436673a6c10e9abeb10f5abe4
+10edabe510e1abe970c39570a4f971a6
+d772a6e47300287884ec39f229f509f5
+ab79f6ab7ff7ab80f22cf3ab72f4ab76
+22032aab2c4da4bf522a5410d2ab3001
+cfab2fd5ab2decab54edab59eeab60ef
+ab66f16de429e438e5ab3ce7ab41e9ab
+4aebab50032aab3644324b3a5312696e
+e4ab39126576e1ab3712686feaab3878
+34793e7a48e1ab20e3ab2b01eeab86f7
+ab8701ecab88f2a50c10ecab896cad72
+4f725873747484758e7705e809e8ab80
+f0ab84f6ab85e2ab81e3ab82e7ab8304
+e2ab6fe3ab2beeab70f2ab71f8a5f102
+e4ab73e7ab74f9ab7501ebab77f1ab78
+04e1ab7ae5ab7bebab7cf2ab7df3ab7e
+6c4a6d666e8c6fa2437003e4ab6cecab
+6df3ab6ef9a77404e4ab55e9ab56ecab
+57efab50f9ab5805f009f0ab5df1ab5e
+f3ab5fe1ab5aeaab5beeab5c04e3ab61
+ebab62f0ab63f8ab64f9ab6504e7ab67
+ebab68f1ab69f5ab6af9ab6b673e6742
+6858696e6a846b02e3ab51f2ab52f3ab
+5303e1ab42f3ab43f7ab44faab4503e9
+ab46ebab47eeab48f5ab4903e4ab4be7
+ab4cecab4dedab4e10f2ab4f614a6276
+638664a26b6503e6ab3de8ab3ee9ab3f
+f3ab4006f30cf3ab24f4ab25f6ab26fa
+ab27e6ab21e8ab22f1ab2302e1ab28e5
+ab29f0ab2a06ee0ceeab33efab34f2a5
+fff3ab35e32cebab31ecab3222055211
+522e53325410d2ab3010cfab2f10d5ab
+2d2aab2c312a4d10c5ab2e1137b2ab2d
+01e3ab3ae8ab3b00166e63752bec09ec
+a9ebf3a9dcf4a9f8754c7750e1012a2e
+41127261e2a9d4012aa9d35010cba9d4
+10f5a9fa10e1a9fb7217722e733e7410
+f0a9f902e1a9f4e4a9f5e7a9f610f3a9
+f76e346f4a7001e1a9f2efa9f303e2a7
+cce7a9eeeea9eff4a9f010eea9f16630
+6b176b2e6c386d10f3a9ed01e1a9e9ef
+a9ea01e1a9ecf4a92e663468386901ec
+a9e7f0a9e810eca9e401eca9e5eea9e6
+614e627e638864926504e4a9e1efa9e2
+f2a570f3a570f8a9e304e7a9d5ec32ed
+a9d8f0a9d9f5a9da012aa9d65012686c
+f0a9d701e9a9dbf5a9dc01e4a9ddeda9
+de01e3a9dff4a9e0017526f5a9fc02e3
+a9fde7a9fefaa9fc00146f457917ef09
+efa94bf5ab19f7ab1c792cedab0ceeab
+1110f5ab1f6f3c724c745075547701eb
+ab1defab1e02e2ab14e6ab15efab1610
+efab1710edab1802e5ab1ae7ab1beda9
+4b6934693c6a566b5a6d5e6e01e1ab12
+e7ab1301e1ab07e622012aab084e10cc
+ab0910f3ab0a10f4ab0b03e6ab0defab
+0ef4ab0ff5ab1061366346654a675a68
+10e7ab0602e9a9ffeaa960efab0010e6
+ab0102eaab02ecab03f3ab0410eeab05
+6da2576ea63e6f0b741ded09eda5a1f2
+a9cbf3a9ce742a7a34e3a9c301e1a9d0
+eba9d110eda9d27017702e72327310e1
+a9cf10eda9ca02efa9ccf5a9cdf9a9cb
+673a6b3e6e02e7a9c7eea9c8f3a9c910
+e3a9c401f2a9c5f6a9c60022749fe926
+ef0fefa94bf2a956f3a492f4a95af9a3
+cee9a90beba905eca940ee012abac64d
+126f6ee7a53f783d7834793e7a64e7a9
+2ee8a93401e3a969eda96a05f709f7a9
+6ef8a96ffaa970eba96beda96cf6a96d
+05f009f0a974f7a975faa976eba971ed
+a972eea9737444755a76707703eba966
+f2a537f6a967f7a96803e3a95be6a95c
+e9a95df2a95e03e1a95ff0a960f2a961
+f3a96202e1a963eea964f9a96569856e
+446e426f5e707a71907202e4a957eaa9
+58efa95904e1a947e6a948e9a949ebb6
+1af7a94a04e1a94ce5a94de8a94ef3a9
+4ff8a95003f0a951f3a952f4a953f8a9
+5410eca955693e6b686c7e6d02efa944
+f5a945f8a94603e6a937eea938f326f7
+a93b012aa9394d126564e6a93a03e9a9
+3ceca93df0a93ef7a93f02e5a941f0a9
+42f3a9436549653e666a67866802e9a9
+35eca936f2a3ff06ee0ceea925f2a926
+f4a927f5a928e4a922e5a923eba92404
+e1a929e5a92aeea92befa92cf1a92d04
+e8a92feca930efa931f0a932f9a93361
+5e62a25063a25d6406e80ce8a91eeaa9
+1ff2a920f8a921e1a91be5a91ce6a91d
+0bee1df712f7a90df926faa91022012a
+a90e4310c3a90feeb431efa90bf3a90c
+e709e7a908e9a909eba90ae3a905e4a9
+06e6a90704e8a911efa912f1a913f5a9
+14f7a91504e9a916f0a917f1a918f2a9
+19f5a91a0021745fe41dee0feea9a1ef
+a9a7f2a9aef6a9bbf9a9bfe4a986e5a9
+89e7a98eeca54b791579307a3ae1a977
+e2a97f01eda9c0eea9c110e9a9c27438
+7542775e7801f1a9bdf2a9be01eda9b4
+f2a9b504e9a9b6f0a9b7f3a9b8f6a9b9
+f8a9ba10e2a9bc6a5d6f326f48706471
+68726c7303eba9b0eea9b1efa9b2f3a9
+b304e4a9a8e5a9a9eea9aaf0a9abf5a9
+ac10e9a98910efa9ad10e2a9af6a4a6b
+4e6d586e04e6a9a2e8a9a3eba9a4eda9
+a5f0a9a610efa99c01e7a99defa99e01
+e7a99ffaa9a06637665a675e686e6906
+ee0ceea998f5a999f9a99afaa99be6a9
+95e9a996eaa99710f2a98d02e1a98fe2
+a990eca99102e2a992e5a993f7a99461
+3e636a64906502e2a98af7a98bf8a98c
+06ee0ceea97bf0a97cf1a97df3a97ee3
+a978e6a979eba97a05e809e8a983efa9
+84f5a985e1a980e5a981e6a98201e3a9
+87f3a98866c75369c49669a4166aa4c4
+6ba6116c001b744ae717ef0cefa7f3f4
+a7fbf5a7fdf6a901e7a7dde9a7dfeea7
+f0771577307a34e1a7c8e2a7cf10eca9
+0201e8a903faa904742e75327610f3a9
+0110e7a7fc03e1a7feefa7fff9a3d5fa
+a9006a4a6d316d326e426f4c7210e3a7
+fa02eea7edefa7eef0a7ef01f3a7f1f5
+a7f205f209f2a7f7f3a7f8faa7f9eaa7
+f4eba7f5eca7f66a346b386c01e5a7eb
+eea7ec10f0a7e801e9a7e9f4a7ea6448
+646c6570679c6906e70ce7a7e4e8a7e5
+eaa7e6f3a7e7e1a7e0e4a7e1e6012aa7
+e24c12696de2a7e310e2a7d506f00cf0
+a7d9f1a7daf5a7dbfaa7dce4a7d6e5a7
+d7eda7d810e7a7de6134625a6301eda7
+d3f0a7d405e809e8a7cceaa7cdf3a7ce
+e2a7c9e4a7cae7a7cb02e5a7d0f5a7d1
+f7a7d200197739eb17f30cf3a70df4a7
+25f5a719f7a726eba567eea720efa722
+e409e4a70fe7a714e9a717772a7a34e1
+a70601eda727f3a72801e8a729e9a72a
+6a366d176d326e366f3a7210e9a72410
+efa71f10e8a72110f5a7236a2e6b326c
+10efa71e10eaa71804e5a719eba71af4
+a71bf7a71cf8a71d641a643466446701
+e2a715e5a71602e4a710e9a711f5a712
+10e5a713613a62446302e1a70ce5a70d
+e8a70e01eea707f2a70802e1a709e2a7
+0af9a70b0b721ae909e9a733f6a739f7
+a73a722a752ee1a72b10e1a73710f4a7
+3867176734693e6d01e3a735eca73601
+eba72eefa73210e2a734612e623e6510
+eea73102e2a72ceda72df2a72e01efa7
+2ff5a730002875c0edeb74f23ff628f6
+a791f7a7b3f9022a32414c4c126174ee
+a7c1022aa7bf432a5410d2a7c110cea7
+c0127261e2a7c0f2a784f3a79df5022a
+a46441a46a5912657ae9a77feb38eca7
+73eda778eea783efa788012a2e411272
+61e2a76e042aa76c41324336493a4d10
+cea77010c6a76d10cea76e10d2a76f7a
+1b7a38e1a5b0e7a757e9a763eaa76703
+e8a7c4eaa7c5f2a7c6f4a7c7753c766e
+777e788e7901e5a7c2f8a7c307ed0ced
+a7aceea7adf0a7aef3a7afe2a7a8e4a7
+a9e5a7aaeaa7ab02e7a7b0f2a7b1f8a7
+b202eaa7b4efa7b5f1a7b607ed0ceda7
+bbf0a7bcf7a7bdfaa7bee1a7b7e3a7b8
+e5a7b9eca7ba6bc0d57063704a717072
+8673a2457403e2a7a4eda7a5efa7a6f2
+a7a705f209f2a790f6a791f8a792e5a7
+8de6a78eefa78f03e2a793e6a794f3a7
+95f9a79605ec09eca79af3a79bf5a79c
+e3a797e9a798eaa79905e809e8a7a1ea
+a7a2f2a7a3e2a79ee4a79fe6a7a06b50
+6c5a6d706ea2576f04e9a789eba786ec
+a78af3a78bfaa78c01e3a771eaa77203
+eea774f1a775f4a776f8a77706f226f2
+32f3a780f5a781f7a782022a32414059
+12657ae9a77f012aa77c4c10c2a77d12
+7261e2a77ee2a779e8a77aefa77b04e3
+a784e6a785e7a757eea786f0a7876652
+66486758686869a06a03e4a768e7a769
+f3a76af9a76b02efa754f2a755f9a756
+02e5a758e6a759f0a75a08f10ff1a75e
+f3a75ff4a760f7a761faa762e1a75be2
+a75cebac86eea75d02eaa764f5a765f7
+a76661446276639c64a2486502e1a751
+eea752faa75307e90ce9a73feaa740ed
+a741efa742e1a73be2a73ce3a73de4a7
+3e05f109f1a746f8a747f9a748e4a743
+eda744f0a74503e7a749eba74aeca74b
+f4a74c03e5a74de8a74eeca74ff4a750
+66a2b567a46a6800137539f20ff2a5ff
+f4a702f5a703f9a342faa7057536e13a
+e5a5e9e9a5ebefa5fb10e9a70422032a
+a5df372e43345310c4a5e01133b6a5e0
+10cda5e16c386c3c6d466e506f6c7301
+e2a700eea70101e1a5f2f5a5f301e4a5
+f4f4a5f504e4a5f6e5a5f7eaa5f8eea5
+f9efa5fa02e3a5fceaa5fdf4a5fe6158
+62746478687c6905e809e8a5efeca5f0
+eda5f1e1a5ece6a5ede7a5ee04e7a5e2
+eba5e3eda5e4f7a5e5faa5e610e2a5e7
+10f9a5e810f9a5ea00117553e90fe9a5
+7aeaa57eefa581f2a587f9a596754276
+94e1a570e6012aa5764112646ceda577
+09e80fe8a590f1a591f2a592f6a593f9
+a594e2a58ce332e4a58de5a58ee6a58f
+012aa5764112646ceda57710f2a5956d
+2f6d4e6f52706271667204e3a588e5a5
+87f0a589f2a58af3a58b10f0a58002e4
+a582eea583f2a58410e5a58510f3a586
+6132665669606c10f2a57f05e908e9a5
+74eea575f467e1a571e2a572e7a57301
+e9a578eda57902e1a57beca57cf4a57d
+001a6e9f791dec0ceca5bceea5c0f5a5
+d0f6a5d8792ce1a597e4a5a901e1a5a2
+e9a5de733a733e754276747702e3a5db
+e9a5dcf4a5dd10f7a5cf07f20cf2a5d4
+f7a5d5f8a5d6faa5d7e2a5d1e3a5d2e4
+a5d3e7a5c002e6a5d9f2a5b3f3a5da6e
+5a6f6a7204e2a5a5e332e5a55af4a5cd
+f7a5ce012aa5cb4c12696ee2a5cc02e4
+a5c1e7a5c2efa5c307ee0ceea5c3f2a5
+c8f3a5c9f4a5cae4a5c4e6a5c5e9a5c6
+eda5c7673c6a236a386b486c526d01ed
+a5bef6a5bf02eba5b7eea5b8f5a5b901
+eea5baf0a5bb10eba5bd6734683e6901
+eca5b5eda5b601eea5b3efa56610f3a5
+b46428642e653e6610eba5b202e5a5aa
+eea5abf2a5ac05ef09efa5b0f2a52dfa
+a5b1e2a5adeaa5aeeca5af612e626c63
+10f2a5a809ed0feda59deea59ef7a59f
+f9a5a0faa5a1e1a598e6a599e7a59ae8
+a59beaa59c05ef09efa5a5f9a5a6faa5
+a7e1a5a2e6a5a3eda5a463c2f263a2a3
+64a4fc6500127733ee19ee38efa563f3
+a565f4a558f5a366012aa55f53126861
+f7a560773478387a3ce5a553eca55a10
+efa56d10f4a56e10e1a56f6d466d486e
+7a728473887403f2a569f4a56af5a56b
+f8a56c02e1a55be9a55ceb012a2e4e12
+6b6fefa55e012aa55d4710cea55e01ee
+a561f1a56210e9a56402e7a566eba567
+f5a568623e664267466b02e1a557eba5
+58f9a55910f5a55210e9a55401eca555
+f9a556001b725ce821f316f3a519f52c
+f6a51ff9a520012aa51d47126c61e7a5
+1ee8a3ebefa50ff2a512771277307a34
+e1a3e1e5a3e710e4a51210e5a519722e
+73547410e4a51c05ec09eca516eda517
+f3a518e8a513eaa514eba51501e2a51a
+f7a51b69526c306c326d3c6f6c7010f3
+a51101e1a50be4a50c02e5a50de7a50e
+ee022aa26342a2ae4811616e01e2a3fd
+f4a3f810f0a51069406a446b03e2a507
+eca508efa509f9a50a10e3a50302e1a5
+04eda505f6a506658f65a28066a28167
+a2826805ef09efa500f0a501f2a502e9
+2ceba3feeda3ff022a3c42a259481161
+6e01e2a3fdf4a3f80b4d2d5417542e55
+385610c4a3fb01c8a3f7d7a3f801cba3
+f9d3a3fa4db489502a5310d2a3f602c6
+a3f3c8a3f4daa3f5470e473048b46d49
+10c4a3f110c6a3ef2aa3ec412a4210ce
+a3ee10d5a3ed126f70efa3fc10e2a3e8
+10e1a3e910e7a3ea6134623e6301e8a3
+e5f0a3e601e4a3e2eea3e310eaa3e400
+16726f791ce508e5a52df6a54cfa4579
+2a7a34e1a52101efa54ff5a55010e7a5
+51751d752e764a7710f7a54e04e1a547
+e3a548e4a549e7a54af4a54b10e1a54d
+724073747403eda543f0a544f3a545f9
+a54602e82ce9a540f3a541012a2e4d12
+6f6ee7a53f012aa53e4310cea53f10e2
+a54267446a1a6a406e446f03e2a53be9
+a534f0a53cf7a53d10e5a53a10eaa523
+673468606901e1a538f1a53906ec0cec
+a533efa534f2a535faa536e1a530e8a5
+31e9a53210e4a537613c626863726476
+6501e4a52eeea52f06e80ce8a525eba5
+26f2a527f6a528e4a522e6a523e7a524
+01e4a529f1a52a10e3a52b10eea52c2a
+a4f761bea462002373a5e51ded0feda3
+a8eea3adefa3b1f2a3baf3a3bfe5a37c
+e7a389e8a38de9a39377417732783c79
+4c7a72e1a36201e4a3d2f2a3d302e8a3
+d4eba3d5f2a3c705f309f3a3d9f6a3da
+f8a3dbe5a3d6eea3d7f2a3d804e1a3dc
+e5a3dde6a3dee8a3dff7a3e073327448
+75587610e2a3d103eaa3c0f1a3c1f3a3
+c2f4a3c302efa3c4f4a3c5f6a3c609ed
+0feda3ccefa3cdf2a3cef3a3cff5a3d0
+e1a3c7e3a3c8e4a3c9e7a3caeba3cb6a
+7d6e3b6e486f587068716c7203e1a3bb
+e8a3bcf8a3bdfaa3be02e7a3aeeda3af
+f0a3b002eaa3b2eda3b3eea3b410f9a3
+b503e3a3b6e9a3b7f0a3b8f6a3b96a46
+6b786ca4ab6d03e8a3a9eba3aaf1a3ab
+f5a3ac07ef0cefa39ef2a39ff4a3a0fa
+a3a1e8a39ae9a39beaa39ceea39d04e3
+a3a2eda3a3f1a3a4f5a3a5f6a3a6656a
+6562669467a24468a24b6906ed0ceda3
+96eea397efa398f1a399e2a394e7a395
+eba37507f40cf4a381f7a382f8a383fa
+a384e6a37de8a37eeaa37feda38003e4
+a385f1a386f4a387f9a38802e3a38aee
+a38bf8a38c05ec09eca391efa38df9a3
+92e2a38ee7a38fe9a390613262646390
+6410e4a37b07f20cf2a367f3a368f6a3
+69f8a36aeca363eea364f0a365f1a366
+06e40ce4a36eeaa36ff0a370f2a371e1
+a36be2a36ce3a36d09ed0feda376eea3
+77efa378f1a379f5a37ae3a363e6a372
+e8a373e9a374eca37500184dc26554c0
+ca57365736584e59645a12616ee2adcd
+01612c631168efa9a61172e1adcc0170
+2a731175f8691165efa9e201652c6911
+69e9a717117ae9a77f543455a2875612
+6169e9adcb056746674a68506901622a
+7210e8adca10f4012aa3b14210d44511
+6ce7adc7106101e158e9042aaba74332
+4b364c3a5410c8aba710cea7d410c8ad
+c810c1adc9012aa54c4d10d6a54c6130
+657c66116ee7adc6056d116d2e6e3276
+10f4a3a710ecab8a10e7abdf67346b38
+6c01e5ab98f5a75c10e2adc410f2adc5
+116cf5ab9c126761f2abe950c0c350a2
+7252a2a85306694369426f6a75907901
+6c2a7210e3a50c10efadc301643e6e01
+e4ab39e8012aab4a4c10cbab4a10e4ad
+c002672e72387910efa50e01e4ab67ef
+adc110e1ab6f116ee4adc2613e675e68
+01612a7210e4adbf10f7a560026d2e72
+327510f2ab2710f2ab5d10e2adbe116e
+f7a34b046138654a68506c76721174e9
+adbb016c2a7510e3a51c10eda11172ed
+adb902612e6c326e10f8a9e610e7adba
+01e9a9d6f0a9d71172e4a5f4026a306f
+3675116ef2a9aa116ee7adbc1168e7ad
+bd4d7c4ea2a44f0367426c48724e7301
+672a6d10e1adb810e5a9cf1161edab42
+1163ebab25016b2a7910e1a9cb10e8a9
+d107722e725a7460756679116df2032a
+a3ce492e4d325410c8adb310cea76010
+cda3ce116fefa9591165e9adb1116cf4
+adb2614265746c9a6f01642a6e10e7a5
+3f10e9adb00368326b366e3a7210e3ad
+ac10eaada910e1adaa01e4a970e9adab
+0264346e387201e3adaeefadaf10e6a9
+3a10e4adad1179eda940046138624c65
+506b56731168f5adb7016e2a7210e2ad
+b510e4adb41161f49f1177e1adb6116f
+efa55e47c41b4ac32f4aa6c04ba6d94c
+03614665a69c69a69e7901632a6410e9
+ada810e9ada7026ea6796fa67a7410ee
+001a4bc139545b571457ac7058ac7459
+305a01c1abf1d7ab6010d4ad65544055
+825603c1ad60c5ad62cead61d5a3930b
+ce14d609d6abdbd7abc8daab80ceada5
+cfabbed2abc6cbc5d4cbabb3ccad5ccd
+abb204c1ada6c7ad5ed3a55fd9ad5fda
+abf54e824e8a50a24a52a26d530cce17
+d40cd4ad56d5a79ad6ad57d9ada4cead
+54cfab66d2ad55ca09caad52cbab50cd
+ad53c3ad51c5ab7fc9ab5406c70cc7ab
+edc9ad44cca54bcfa97fc1ad41c3ad42
+c5ad430acc14d409d4ad4dd7a9dad9a5
+c0cca9ebcdad4ad2ad4bc1ad46c5ad47
+c6ad48c7abc2c8a57c03c5ad50cfa94b
+d5a79ad7ab1c4b9e4ca2434d0010cd1d
+d40fd4a95ad5a92ad8abefd9a90edaad
+40cda73dcfada2d1ad3ed2ada3c60cc6
+ad3dc7a92ecbada1cca3a8c1ada0c3ad
+3bc4ad3cc5ab2e01c5ad30cdad9f04c9
+ad36d3ad37d4a7fbd5ad38d6a90143c0
+c246644656476648a24d4905d209d2ad
+9ed3a70dd4a725c3ad2dc4a70fc5ad21
+02c9a57acfa581d2a5870cce17d30cd3
+ad28d4ad29d5abf4d7ad2acead25d0ad
+26d1ad27c608c6ad24c867cca773c1ad
+23c2abf7c5ad9d04cdad2bcead2cd2a5
+ffd4a702d5a703435244a2424505d309
+d3a565d4ad97daad22c1ad1dc3ad1ec5
+a5580fcf1ad60cd6ad18d7abf9d9ad9b
+daa519cfad15d0ad16d2ad17d5abf2c9
+c68cc9ad12ccad13cdad14cead9a05cb
+09cba521cfad1bdaad9cc5a52dc7ad4f
+caad1a345e34ae874178420bce14d209
+d2a9f8d5a73dd6ad0ecead0bcfad0cd1
+ad0dc909c9ab11caad09ccad0ac1a3bf
+c5ad06c6ad070cd217d50cd5abeed7ad
+04d8ad05daa35ed2ad01d3ad02d4ad03
+cd09cdad99cfabffd1ad00c4abfcc6ad
+98cc6d2aa55f312c321133b0ad971137
+b2a79a10e1a9a810ef012aa7f34c10c1
+a7f31170e3a7d9026d2e6e327310f5a7
+e710e2a7e301e1a7c9e2a5cc01613a70
+1161ee012aa72b4a10d0a72b016d2a76
+10e1ad9310efad92056e1e6e306f3674
+1168e9ad961164e1a7831172e5012aa7
+884b01d0ad32d2a78861306844691174
+f3ad95016c2a6e10e1ad9410e9a55902
+612e6d326f10eaab3810f2a9f410f201
+2aa7784b10c8a778473448a25c491274
+61eca56a0465466c5a6f60727a75016a
+2a7210f5a9d310f2a5d0116ff2012aa5
+b04710c5a5b01161e7a51e016e2a7410
+e8a5ca01e7ad86eda5660161506510eb
+032aa55a432e47325410d2a38c10d9ad
+1910d2a55a10eead87056c186c306d36
+75116ee7ad911175f7a5f3106e01e7a5
+f8f0a9686130659c691172e1ad90016e
+2a7410f2a93905ef24efad8af34cf403
+2aa3f8482e4d325410d7a3f810cba3f0
+10cfa3f2012aa3ec4310cea3ece2a3fd
+e7ad88e9ad891162f2054917493a533e
+5502c1ad8ecbad8cd3ad8f10cca5e910
+c5ad8d2aa5e9432a4710c2ad8c10c1ad
+8b43c107437044a2c0450267406c4674
+1168e9012a754501d2ad20d4751179f0
+a55601622a7910edad8510e1ad840461
+a26968a2786fa28770a289791172ec0a
+4d335414542e55385810cbad7d01caab
+a2d2ad7c10c1abea4d2e523e5310cbad
+7b02c4ad79cba905cea53e02cfad7ad3
+ab2cd5ab192aab194138423c474c4b01
+c7a7bfdaad3410ccad7602c1ad77c7a3
+89d9a37c01c5a9ced2ad78026b2e6e32
+7210e9ad7410eda3e610f3a51202612e
+65327210f3ad7510eda50510f2a50211
+70f4a5101172f4a5cb03653469866f8c
+751170ecad831176e106491749324d36
+4e3a5010cba3c610cea5eb10d5ad8010
+d0a9892aa5eb422a4610caad7f10d4ad
+7e1161ebad811167f2ad822aa25441aa
+3142056f1f6f3e72447501672a6810e4
+ad7310e9ad721170efa3fc106101e8a9
+e9e9ad716130655c68116bf3ad70036c
+326d36733a7410ebad6f10e9ad6e10f5
+a36a10f3a3c1116ee7012aa3ad4210c4
+a3ad00214ac1c052c0cc5638563c5758
+586259665a01d2abf0d7ab6004c1ad60
+c4ad61c5ad62cead61d5a39301c6ad63
+d3ab5910cbad6403c4abfbc5abfbd4ad
+65d5ab2c5246536c54a2575503c1abea
+c7ad5ed9ad5fdaabf505d309d3ab2cd5
+ab19d7ab1cc5ad50c8ab60cfa94b0ecd
+1ad40cd4ad56d5ab19d6ad57d9ad58cd
+ad53cead54cfab66d2ad55c50cc5ab7f
+c9ab54caad52cbab50c1abf6c3ad51c4
+abfa0ecd1ad20cd2abc6d6abdbd7a3f8
+daab80cdabb2cead5dcfabbed0ad5cc8
+0cc8aba7caaba2cbabb3ccad5cc4ad59
+c6ad5ac7ad5b4e644e404fa896507851
+02c1ad4ecfad4fd5ad2109cc0fcca54b
+cfa97fd0a989d1ad00d4abf6c1ad41c3
+ad42c5ad43c8a393c9ad440dcd17d40c
+d4ad4dd7a9dad9a5c0daad46cdad4ad2
+ad4bd3ad4cc70cc7abc2c8a57ccbad49
+cca9ebc1ad46c5ad47c6ad484aa2484b
+a24c4ca2644d0012ce20d50fd5a92ad6
+a54cd8abefd9a90edaad40cea53ecfa3
+f2d1ad3ed2ad3fd4a95ac60fc6ad3dc7
+a92ecba905cca3a8cda3cec1ad3ac3ad
+3bc4ad3cc5ab2e01cfad2fd0a72b07d0
+0cd0ad32d2a788d7ad33daad34c5ad30
+c7a7bfc8a778cdad3108d30fd3ad37d4
+a7fbd5ad38d6a901d9ad39c1a7f3c2ad
+35c9ad36cbab4a41c1604598456a46a2
+4147a24e48a2754907d10cd1ad2ed2a5
+70d3a70dd4a725c3ad2dc4a70fcca5e9
+cea5eb09d20ed2ad20d3a565d475d5ad
+21daad22c1ad1dc3ad1ec5a558c79bc8
+ad1f04c9a57acfa581d1ad00d2a587d8
+a5870bd014d309d3ad28d4ad29d7ad2a
+d0ad26d1ad27d2a55ac808c867cca773
+cead25c1ad23c5a5b0c6ad2406d20cd2
+a5ffd4a702d5a703d6ad07cba3f0cdad
+2bcead2c415e42a24c43a2834406cb0c
+cba521cfad1bd9ad09daad1cc4a52dc5
+a52dcaad1a0dd117d40cd4ad03d7ad04
+d8ad05daa35ed1ad00d2ad01d3ad02cc
+0bcc6dcda342ceabf9cfabffc4abfcc5
+abfdc6abfe0010cc1cd20ed2a9f8d445
+d5a3ced6ad0ed9a37cccad0acead0bcf
+ad0cd1ad0dc70cc7a389c8ad08c9ab11
+caad09c1a3bfc4a3adc5ad06c6ad0700
+10cf1dd50fd5abf2d6ad18d7abf9d9ad
+19daa519cfad15d0ad16d2ad17d3ab2c
+c90cc9ad12ccad13cdad14cea3ecc4ab
+f0c6ad0fc7ad10c8ad11342234423548
+374e3801382a3910b0ab2c10b6abfb11
+31b9abf81133b2abf91133b6abfa2aa5
+5f305031a26b3202302e33383810b0a5
+2d01b0a519b2abed10b0750533233334
+354a3601b1ab59b2a5eb03b0a3ecb4a5
+ebb5a70fb9a72502b3abeeb4abf3b7ab
+f43034314a3201b1a55fb9abf203b2ab
+edb3a55fb5a9f8b9abee06b50bb59bb7
+abf0b8abf1b9a55fb1abedb3abefb4ab
+8002342e353e3710b2ab1902b2a3ecb3
+abf5b5abf603b0ab19b1ab19b4abf7b5
+a52d046436673c68427246761173f44b
+116ceda5771168e2ad66116fed630161
+3c6d01e99dee012aa3424110cda34210
+e200134c625131513c53405450556a59
+01c5abfbd4ab8110c1ad4e02c1abf6c4
+abfad9ad5804c791c8a929caad6ccead
+5dd2ad6d10cbad674c3c4d464e624f66
+5001cbad49d3ad4c01c2ad35d9ad3904
+c1ad3acdab06cea770d2ad3fd5ad6a10
+c7ad6b10cdad45452e4542474a494e4a
+644b02c8a504cdad31d7ad3301c79bc8
+ad1f10c2ad6703c4ad68cead69d1ad2e
+d2a57010cfad2f2a9b4132423c434644
+10daad1c01c5abfdc6abfe01c8ad08d5
+ab0601c3a90fceabe600217588e62bf2
+21f29bf3a349f6a353f9a35cfa012a2e
+41127261e2a360022aa35e498a5210d5
+a361e651eb67ed75ee7f7a2d7a2ce125
+e22de54b10ea012a2e41127261e2a360
+032aa35e312e49345310d5a3611137b2
+a36101d1a35fd2a3607538763c775279
+01e2a35df2a35c10f9a35203eca354ee
+a355f4a356f5a35703e1a358e2a359ef
+a35af8a35b6b966f696f44704e726873
+a2507402e1a34fe7a350eaa35102ea89
+ed8bfa8d05f206f295f397fa99e38fe4
+91e59309ef0fefa344f1a345f3a346f9
+a347faa348e29be332e8a341eda342ee
+a343022a9d4e2c5012616ceda1126261
+f49f04e1a34ae5a34be7a34cefa34df4
+a34e6b3c6c3e6d586e03e381eb83ee85
+f98710eb6905ee06ee71f36df473e16b
+e26de96f03ed77ee79ef7bf07d652565
+30673668506a10e76501e24df94f05ed
+06ed59ef5bf15de353e455e75702e15f
+ec61ef636148625263646405f006f045
+f947fa49e13fe541ea4302e927eb29f5
+2b04e92ff131f233f435f93702e439e5
+3be83d
         }
     }
     match{
diff --git a/icu4c/source/data/misc/likelySubtags.txt b/icu4c/source/data/misc/likelySubtags.txt
index 004f5cb..c2db5fa 100644
--- a/icu4c/source/data/misc/likelySubtags.txt
+++ b/icu4c/source/data/misc/likelySubtags.txt
@@ -1843,7 +1843,6 @@
     zh_Hant{"zh_Hant_TW"}
     zh_ID{"zh_Hant_ID"}
     zh_MO{"zh_Hant_MO"}
-    zh_MY{"zh_Hant_MY"}
     zh_PA{"zh_Hant_PA"}
     zh_PF{"zh_Hant_PF"}
     zh_PH{"zh_Hant_PH"}
diff --git a/icu4c/source/data/misc/supplementalData.txt b/icu4c/source/data/misc/supplementalData.txt
index 5e6eed1..0db742a 100644
--- a/icu4c/source/data/misc/supplementalData.txt
+++ b/icu4c/source/data/misc/supplementalData.txt
@@ -30290,7 +30290,7 @@
                 49931000,
                 57326521,
             }
-            zh_Hant{
+            zh{
                 populationShareF:int{49170000}
             }
             zmi{
diff --git a/icu4c/source/data/misc/zoneinfo64.txt b/icu4c/source/data/misc/zoneinfo64.txt
index 71fa660..54a2a46 100644
--- a/icu4c/source/data/misc/zoneinfo64.txt
+++ b/icu4c/source/data/misc/zoneinfo64.txt
@@ -3,9 +3,9 @@
 // License & terms of use: http://www.unicode.org/copyright.html
 //---------------------------------------------------------
 // Build tool:  tz2icu
-// Build date:  Thu Oct  8 19:58:22 2020
+// Build date:  Wed Oct 21 21:13:50 2020
 // tz database: ftp://ftp.iana.org/tz/
-// tz version:  2020b
+// tz version:  2020d
 // ICU version: 68.1
 //---------------------------------------------------------
 // >> !!! >>   THIS IS A MACHINE-GENERATED FILE   << !!! <<
@@ -13,7 +13,7 @@
 //---------------------------------------------------------
 
 zoneinfo64:table(nofallback) {
- TZVersion { "2020b" }
+ TZVersion { "2020d" }
  Zones:array { 
   /* ACT */ :int { 356 } //Z#0
   /* AET */ :int { 368 } //Z#1
@@ -1363,22 +1363,22 @@
   } //Z#268
   /* Asia/Gaza */ :table {
     transPre32:intvector { -1, 2109557424 }
-    trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334015200, 337644000, 452556000, 462232800, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572040800 }
+    trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334015200, 337644000, 452556000, 462232800, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400 }
     typeOffsets:intvector { 8272, 0, 7200, 0, 7200, 3600 }
-    typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
+    typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     finalRule { "Palestine" }
     finalRaw:int { 7200 }
-    finalYear:int { 2020 }
+    finalYear:int { 2021 }
   } //Z#269
   /* Asia/Harbin */ :int { 315 } //Z#270
   /* Asia/Hebron */ :table {
     transPre32:intvector { -1, 2109557273 }
-    trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334015200, 337644000, 452556000, 462232800, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572040800 }
+    trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334015200, 337644000, 452556000, 462232800, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400 }
     typeOffsets:intvector { 8423, 0, 7200, 0, 7200, 3600 }
-    typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
+    typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" }
     finalRule { "Palestine" }
     finalRaw:int { 7200 }
-    finalYear:int { 2020 }
+    finalYear:int { 2021 }
   } //Z#271
   /* Asia/Ho_Chi_Minh */ :table {
     trans:intvector { -2004073600, -1851577590, -852105600, -782643600, -767869200, -718095600, -457776000, -315648000, 171820800 }
@@ -2601,12 +2601,12 @@
     typeMap:bin { "0102" }
   } //Z#560
   /* Pacific/Fiji */ :table {
-    trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000, 1452952800, 1478354400, 1484402400, 1509804000, 1515852000, 1541253600, 1547301600, 1573308000 }
+    trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000, 1452952800, 1478354400, 1484402400, 1509804000, 1515852000, 1541253600, 1547301600, 1573308000, 1578751200, 1608386400, 1610805600, 1636812000 }
     typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 }
-    typeMap:bin { "0102010201020102010201020102010201020102010201020102" }
+    typeMap:bin { "010201020102010201020102010201020102010201020102010201020102" }
     finalRule { "Fiji" }
     finalRaw:int { 43200 }
-    finalYear:int { 2020 }
+    finalYear:int { 2022 }
   } //Z#561
   /* Pacific/Funafuti */ :table {
     transPre32:intvector { -1, 2117471484 }
@@ -3127,7 +3127,7 @@
     8, -30, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600
   } //_#19
   Palestine:intvector {
-    2, -31, -6, 0, 0, 9, -31, -7, 3600, 0, 3600
+    2, 24, -7, 0, 0, 9, 24, -7, 3600, 0, 3600
   } //_#20
   Para:intvector {
     9, 1, -1, 0, 0, 2, 22, -1, 0, 0, 3600
diff --git a/icu4c/source/data/unit/uk.txt b/icu4c/source/data/unit/uk.txt
index f19c47a..2f7d4bf 100644
--- a/icu4c/source/data/unit/uk.txt
+++ b/icu4c/source/data/unit/uk.txt
@@ -461,11 +461,11 @@
                 other{"{0} електрон-вольта"}
             }
             foodcalorie{
-                dnam{"Калорії"}
-                few{"{0} Калорії"}
-                many{"{0} Калорій"}
-                one{"{0} Калорія"}
-                other{"{0} Калорії"}
+                dnam{"кілокалорії"}
+                few{"{0} кілокалорії"}
+                many{"{0} кілокалорій"}
+                one{"{0} кілокалорія"}
+                other{"{0} кілокалорії"}
             }
             joule{
                 dnam{"джоулі"}
@@ -2371,11 +2371,11 @@
                 other{"{0} еВ"}
             }
             foodcalorie{
-                dnam{"Кал"}
-                few{"{0} Кал"}
-                many{"{0} Кал"}
-                one{"{0} Кал"}
-                other{"{0} Кал"}
+                dnam{"ккал"}
+                few{"{0} ккал"}
+                many{"{0} ккал"}
+                one{"{0} ккал"}
+                other{"{0} ккал"}
             }
             joule{
                 dnam{"джоулі"}
@@ -2385,11 +2385,11 @@
                 other{"{0} Дж"}
             }
             kilocalorie{
-                dnam{"Ккал"}
-                few{"{0} Ккал"}
-                many{"{0} Ккал"}
-                one{"{0} Ккал"}
-                other{"{0} Ккал"}
+                dnam{"ккал"}
+                few{"{0} ккал"}
+                many{"{0} ккал"}
+                one{"{0} ккал"}
+                other{"{0} ккал"}
             }
             kilojoule{
                 dnam{"кілоджоуль"}
diff --git a/icu4c/source/data/zone/zh.txt b/icu4c/source/data/zone/zh.txt
index 17e5c69..ca469f5 100644
--- a/icu4c/source/data/zone/zh.txt
+++ b/icu4c/source/data/zone/zh.txt
@@ -1604,7 +1604,7 @@
             ls{"印度洋时间"}
         }
         "meta:Indochina"{
-            ls{"印度中国时间"}
+            ls{"印度支那时间"}
         }
         "meta:Indonesia_Central"{
             ls{"印度尼西亚中部时间"}
diff --git a/icu4c/source/data/zone/zh_Hant.txt b/icu4c/source/data/zone/zh_Hant.txt
index a070c75..f0aa4d8 100644
--- a/icu4c/source/data/zone/zh_Hant.txt
+++ b/icu4c/source/data/zone/zh_Hant.txt
@@ -1627,7 +1627,7 @@
             ls{"印度洋時間"}
         }
         "meta:Indochina"{
-            ls{"印度中國時間"}
+            ls{"印度支那時間"}
         }
         "meta:Indonesia_Central"{
             ls{"印尼中部時間"}
diff --git a/icu4c/source/i18n/dtitvfmt.cpp b/icu4c/source/i18n/dtitvfmt.cpp
index 2433a80..7cba167 100644
--- a/icu4c/source/i18n/dtitvfmt.cpp
+++ b/icu4c/source/i18n/dtitvfmt.cpp
@@ -1422,7 +1422,11 @@
         if ( field == UCAL_AM_PM ) {
             fInfo->getIntervalPattern(*bestSkeleton, UCAL_HOUR, pattern,status);
             if ( !pattern.isEmpty() ) {
-                setIntervalPattern(field, pattern);
+                UBool suppressDayPeriodField = fSkeleton.indexOf(CAP_J) != -1;
+                UnicodeString adjustIntervalPattern;
+                adjustFieldWidth(*skeleton, *bestSkeleton, pattern, differenceInfo,
+                                 suppressDayPeriodField, adjustIntervalPattern);
+                setIntervalPattern(field, adjustIntervalPattern);
             }
             return false;
         }
@@ -1694,27 +1698,23 @@
     DateIntervalInfo::parseSkeleton(inputSkeleton, inputSkeletonFieldWidth);
     DateIntervalInfo::parseSkeleton(bestMatchSkeleton, bestMatchSkeletonFieldWidth);
     if (suppressDayPeriodField) {
-        adjustedPtn.findAndReplace(UnicodeString(LOW_A), UnicodeString());
-        adjustedPtn.findAndReplace(UnicodeString("  "), UnicodeString(" "));
+        findReplaceInPattern(adjustedPtn, UnicodeString(LOW_A), UnicodeString());
+        findReplaceInPattern(adjustedPtn, UnicodeString("  "), UnicodeString(" "));
         adjustedPtn.trim();
     }
     if ( differenceInfo == 2 ) {
         if (inputSkeleton.indexOf(LOW_Z) != -1) {
-            adjustedPtn.findAndReplace(UnicodeString(LOW_V),
-                                       UnicodeString(LOW_Z));
-        }
-        if (inputSkeleton.indexOf(CAP_K) != -1) {
-            adjustedPtn.findAndReplace(UnicodeString(LOW_H),
-                                       UnicodeString(CAP_K));
-        }
-        if (inputSkeleton.indexOf(LOW_K) != -1) {
-            adjustedPtn.findAndReplace(UnicodeString(CAP_H),
-                                       UnicodeString(LOW_K));
-        }
-        if (inputSkeleton.indexOf(LOW_B) != -1) {
-            adjustedPtn.findAndReplace(UnicodeString(LOW_A),
-                                       UnicodeString(LOW_B));
-        }
+             findReplaceInPattern(adjustedPtn, UnicodeString(LOW_V), UnicodeString(LOW_Z));
+         }
+         if (inputSkeleton.indexOf(CAP_K) != -1) {
+             findReplaceInPattern(adjustedPtn, UnicodeString(LOW_H), UnicodeString(CAP_K));
+         }
+         if (inputSkeleton.indexOf(LOW_K) != -1) {
+             findReplaceInPattern(adjustedPtn, UnicodeString(CAP_H), UnicodeString(LOW_K));
+         }
+         if (inputSkeleton.indexOf(LOW_B) != -1) {
+             findReplaceInPattern(adjustedPtn, UnicodeString(LOW_A), UnicodeString(LOW_B));
+         }
     }
     if (adjustedPtn.indexOf(LOW_A) != -1 && bestMatchSkeletonFieldWidth[LOW_A - PATTERN_CHAR_BASE] == 0) {
         bestMatchSkeletonFieldWidth[LOW_A - PATTERN_CHAR_BASE] = 1;
@@ -1792,6 +1792,39 @@
     }
 }
 
+void
+DateIntervalFormat::findReplaceInPattern(UnicodeString& targetString,
+                                         const UnicodeString& strToReplace,
+                                         const UnicodeString& strToReplaceWith) {
+    int32_t firstQuoteIndex = targetString.indexOf(u'\'');
+    if (firstQuoteIndex == -1) {
+        targetString.findAndReplace(strToReplace, strToReplaceWith);
+    } else {
+        UnicodeString result;
+        UnicodeString source = targetString;
+        
+        while (firstQuoteIndex >= 0) {
+            int32_t secondQuoteIndex = source.indexOf(u'\'', firstQuoteIndex + 1);
+            if (secondQuoteIndex == -1) {
+                secondQuoteIndex = source.length() - 1;
+            }
+            
+            UnicodeString unquotedText(source, 0, firstQuoteIndex);
+            UnicodeString quotedText(source, firstQuoteIndex, secondQuoteIndex - firstQuoteIndex + 1);
+            
+            unquotedText.findAndReplace(strToReplace, strToReplaceWith);
+            result += unquotedText;
+            result += quotedText;
+            
+            source.remove(0, secondQuoteIndex + 1);
+            firstQuoteIndex = source.indexOf(u'\'');
+        }
+        source.findAndReplace(strToReplace, strToReplaceWith);
+        result += source;
+        targetString = result;
+    }
+}
+
 
 
 void
diff --git a/icu4c/source/i18n/formattedval_impl.h b/icu4c/source/i18n/formattedval_impl.h
index 837e89b..c0dec83 100644
--- a/icu4c/source/i18n/formattedval_impl.h
+++ b/icu4c/source/i18n/formattedval_impl.h
@@ -117,6 +117,12 @@
 };
 
 
+// Internal struct that must be exported for MSVC
+struct U_I18N_API SpanInfo {
+    int32_t spanValue;
+    int32_t length;
+};
+
 // Export an explicit template instantiation of the MaybeStackArray that
 //    is used as a data member of CEBuffer.
 //
@@ -126,7 +132,7 @@
 // See digitlst.h, pluralaffix.h, datefmt.h, and others for similar examples.
 //
 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
-template class U_I18N_API MaybeStackArray<int32_t, 8>;
+template class U_I18N_API MaybeStackArray<SpanInfo, 8>;
 #endif
 
 /**
@@ -162,13 +168,19 @@
         return fString;
     }
 
-    void appendSpanIndex(int32_t index);
-    void prependSpanIndex(int32_t index);
+    /**
+     * Adds additional metadata used for span fields.
+     * 
+     * spanValue: the index of the list item, for example.
+     * length: the length of the span, used to split adjacent fields.
+     */
+    void appendSpanInfo(int32_t spanValue, int32_t length, UErrorCode& status);
+    void prependSpanInfo(int32_t spanValue, int32_t length, UErrorCode& status);
 
 private:
     FormattedStringBuilder fString;
     FormattedStringBuilder::Field fNumericField;
-    MaybeStackArray<int32_t, 8> spanIndices;
+    MaybeStackArray<SpanInfo, 8> spanIndices;
 
     bool nextPositionImpl(ConstrainedFieldPosition& cfpos, FormattedStringBuilder::Field numericField, UErrorCode& status) const;
     static bool isIntOrGroup(FormattedStringBuilder::Field field);
diff --git a/icu4c/source/i18n/formattedval_sbimpl.cpp b/icu4c/source/i18n/formattedval_sbimpl.cpp
index b2ae4c3..84c2d00 100644
--- a/icu4c/source/i18n/formattedval_sbimpl.cpp
+++ b/icu4c/source/i18n/formattedval_sbimpl.cpp
@@ -46,19 +46,19 @@
 
 UBool FormattedValueStringBuilderImpl::nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const {
     // NOTE: MSVC sometimes complains when implicitly converting between bool and UBool
-    return nextPositionImpl(cfpos, fNumericField, status) ? TRUE : FALSE;
+    return nextPositionImpl(cfpos, fNumericField, status) ? true : false;
 }
 
 UBool FormattedValueStringBuilderImpl::nextFieldPosition(FieldPosition& fp, UErrorCode& status) const {
     int32_t rawField = fp.getField();
 
     if (rawField == FieldPosition::DONT_CARE) {
-        return FALSE;
+        return false;
     }
 
     if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) {
         status = U_ILLEGAL_ARGUMENT_ERROR;
-        return FALSE;
+        return false;
     }
 
     ConstrainedFieldPosition cfpos;
@@ -67,7 +67,7 @@
     if (nextPositionImpl(cfpos, kUndefinedField, status)) {
         fp.setBeginIndex(cfpos.getStart());
         fp.setEndIndex(cfpos.getLimit());
-        return TRUE;
+        return true;
     }
 
     // Special case: fraction should start after integer if fraction is not present
@@ -85,7 +85,7 @@
         fp.setEndIndex(i - fString.fZero);
     }
 
-    return FALSE;
+    return false;
 }
 
 void FormattedValueStringBuilderImpl::getAllFieldPositions(FieldPositionIteratorHandler& fpih,
@@ -103,23 +103,12 @@
 bool FormattedValueStringBuilderImpl::nextPositionImpl(ConstrainedFieldPosition& cfpos, Field numericField, UErrorCode& /*status*/) const {
     int32_t fieldStart = -1;
     Field currField = kUndefinedField;
-    UFieldCategory spanCategory = UFIELD_CATEGORY_UNDEFINED;
-    int32_t spanValue;
     for (int32_t i = fString.fZero + cfpos.getLimit(); i <= fString.fZero + fString.fLength; i++) {
         Field _field = (i < fString.fZero + fString.fLength) ? fString.getFieldPtr()[i] : kEndField;
         // Case 1: currently scanning a field.
         if (currField != kUndefinedField) {
             if (currField != _field) {
                 int32_t end = i - fString.fZero;
-                // Handle span fields; don't trim them
-                if (spanCategory != UFIELD_CATEGORY_UNDEFINED) {
-                    cfpos.setState(
-                        spanCategory,
-                        spanValue,
-                        fieldStart,
-                        end);
-                    return true;
-                }
                 // Grouping separators can be whitespace; don't throw them out!
                 if (isTrimmable(currField)) {
                     end = trimBack(i - fString.fZero);
@@ -182,13 +171,11 @@
             if (elementField == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)
                     && cfpos.matchesField(elementField.getCategory(), elementField.getField())
                     && (cfpos.getLimit() < i - fString.fZero || cfpos.getCategory() != elementField.getCategory())) {
-                // Re-wind to the beginning of the field and then emit it
-                int32_t j = i - 1;
-                for (; j >= fString.fZero && fString.getFieldPtr()[j] == fString.getFieldPtr()[i-1]; j--) {}
+                int64_t si = cfpos.getInt64IterationContext() - 1;
                 cfpos.setState(
                     elementField.getCategory(),
                     elementField.getField(),
-                    j - fString.fZero + 1,
+                    i - fString.fZero - spanIndices[si].length,
                     i - fString.fZero);
                 return true;
             }
@@ -203,22 +190,28 @@
         }
         // Case 3: check for field starting at this position
         // Case 3a: Need to add a SpanField
-        if (_field == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)
-                // don't return the same field twice in a row:
-                && (i == fString.fZero
-                    || fString.getFieldPtr()[i-1].getCategory() != UFIELD_CATEGORY_LIST
-                    || fString.getFieldPtr()[i-1].getField() != ULISTFMT_ELEMENT_FIELD)) {
+        if (_field == Field(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD)) {
             int64_t si = cfpos.getInt64IterationContext();
-            spanValue = spanIndices[si];
+            int32_t spanValue = spanIndices[si].spanValue;
+            int32_t length = spanIndices[si].length;
             cfpos.setInt64IterationContext(si + 1);
             if (cfpos.matchesField(UFIELD_CATEGORY_LIST_SPAN, spanValue)) {
-                spanCategory = UFIELD_CATEGORY_LIST_SPAN;
+                UFieldCategory spanCategory = UFIELD_CATEGORY_LIST_SPAN;
                 fieldStart = i - fString.fZero;
-                currField = _field;
+                int32_t end = fieldStart + length;
+                cfpos.setState(
+                    spanCategory,
+                    spanValue,
+                    fieldStart,
+                    end);
+                return true;
+            } else {
+                // Failed to match; jump ahead
+                i += length - 1;
                 continue;
             }
         }
-        // Case 3b: No SpanField or SpanField did not match
+        // Case 3b: No SpanField
         if (cfpos.matchesField(_field.getCategory(), _field.getField())) {
             fieldStart = i - fString.fZero;
             currField = _field;
@@ -226,24 +219,40 @@
     }
 
     U_ASSERT(currField == kUndefinedField);
+    // Always set the position to the end so that we don't revisit previous sections
+    cfpos.setState(
+        cfpos.getCategory(),
+        cfpos.getField(),
+        fString.fLength,
+        fString.fLength);
     return false;
 }
 
-void FormattedValueStringBuilderImpl::appendSpanIndex(int32_t position) {
-    if (spanIndices.getCapacity() <= position) {
-        spanIndices.resize(position * 2);
+void FormattedValueStringBuilderImpl::appendSpanInfo(int32_t spanValue, int32_t length, UErrorCode& status) {
+    if (U_FAILURE(status)) { return; }
+    U_ASSERT(spanIndices.getCapacity() >= spanValue);
+    if (spanIndices.getCapacity() == spanValue) {
+        if (!spanIndices.resize(spanValue * 2, spanValue)) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
     }
-    spanIndices[position] = position;
+    spanIndices[spanValue] = {spanValue, length};
 }
 
-void FormattedValueStringBuilderImpl::prependSpanIndex(int32_t position) {
-    if (spanIndices.getCapacity() <= position) {
-        spanIndices.resize(position * 2);
+void FormattedValueStringBuilderImpl::prependSpanInfo(int32_t spanValue, int32_t length, UErrorCode& status) {
+    if (U_FAILURE(status)) { return; }
+    U_ASSERT(spanIndices.getCapacity() >= spanValue);
+    if (spanIndices.getCapacity() == spanValue) {
+        if (!spanIndices.resize(spanValue * 2, spanValue)) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
     }
-    for (int32_t i = 0; i < position; i++) {
+    for (int32_t i = spanValue - 1; i >= 0; i--) {
         spanIndices[i+1] = spanIndices[i];
     }
-    spanIndices[0] = position;
+    spanIndices[0] = {spanValue, length};
 }
 
 bool FormattedValueStringBuilderImpl::isIntOrGroup(Field field) {
diff --git a/icu4c/source/i18n/listformatter.cpp b/icu4c/source/i18n/listformatter.cpp
index ab04ac9..be0d16b 100644
--- a/icu4c/source/i18n/listformatter.cpp
+++ b/icu4c/source/i18n/listformatter.cpp
@@ -16,6 +16,10 @@
 *   created by: Umesh P. Nair
 */
 
+#include "unicode/utypes.h"
+
+#if !UCONFIG_NO_FORMATTING
+
 #include "cmemory.h"
 #include "unicode/fpositer.h"  // FieldPositionIterator
 #include "unicode/listformatter.h"
@@ -171,21 +175,21 @@
     UErrorCode& status) {
     if (uprv_strcmp(lang, "es") == 0) {
         // Spanish
-        UnicodeString spanishYStr(TRUE, spanishY, -1);
+        UnicodeString spanishYStr(true, spanishY, -1);
         bool twoIsY = two == spanishYStr;
         bool endIsY = end == spanishYStr;
         if (twoIsY || endIsY) {
-            UnicodeString replacement(TRUE, spanishE, -1);
+            UnicodeString replacement(true, spanishE, -1);
             return new ContextualHandler(
                 shouldChangeToE,
                 twoIsY ? replacement : two, two,
                 endIsY ? replacement : end, end, status);
         }
-        UnicodeString spanishOStr(TRUE, spanishO, -1);
+        UnicodeString spanishOStr(true, spanishO, -1);
         bool twoIsO = two == spanishOStr;
         bool endIsO = end == spanishOStr;
         if (twoIsO || endIsO) {
-            UnicodeString replacement(TRUE, spanishU, -1);
+            UnicodeString replacement(true, spanishU, -1);
             return new ContextualHandler(
                 shouldChangeToU,
                 twoIsO ? replacement : two, two,
@@ -193,11 +197,11 @@
         }
     } else if (uprv_strcmp(lang, "he") == 0 || uprv_strcmp(lang, "iw") == 0) {
         // Hebrew
-        UnicodeString hebrewVavStr(TRUE, hebrewVav, -1);
+        UnicodeString hebrewVavStr(true, hebrewVav, -1);
         bool twoIsVav = two == hebrewVavStr;
         bool endIsVav = end == hebrewVavStr;
         if (twoIsVav || endIsVav) {
-            UnicodeString replacement(TRUE, hebrewVavDash, -1);
+            UnicodeString replacement(true, hebrewVavDash, -1);
             return new ContextualHandler(
                 shouldChangeToVavDash,
                 twoIsVav ? replacement : two, two,
@@ -238,7 +242,6 @@
 };
 
 
-#if !UCONFIG_NO_FORMATTING
 class FormattedListData : public FormattedValueStringBuilderImpl {
 public:
     FormattedListData(UErrorCode&) : FormattedValueStringBuilderImpl(kUndefinedField) {}
@@ -248,7 +251,6 @@
 FormattedListData::~FormattedListData() = default;
 
 UPRV_FORMATTED_VALUE_SUBCLASS_AUTO_IMPL(FormattedList)
-#endif
 
 
 static Hashtable* listPatternHash = nullptr;
@@ -257,7 +259,7 @@
 static UBool U_CALLCONV uprv_listformatter_cleanup() {
     delete listPatternHash;
     listPatternHash = nullptr;
-    return TRUE;
+    return true;
 }
 
 static void U_CALLCONV
@@ -350,7 +352,6 @@
     return result;
 }
 
-#if !UCONFIG_NO_FORMATTING
 static const char* typeWidthToStyleString(UListFormatterType type, UListFormatterWidth width) {
     switch (type) {
         case ULISTFMT_TYPE_AND:
@@ -394,7 +395,6 @@
 
     return nullptr;
 }
-#endif
 
 static const UChar solidus = 0x2F;
 static const UChar aliasPrefix[] = { 0x6C,0x69,0x73,0x74,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x2F }; // "listPattern/"
@@ -515,14 +515,9 @@
 }
 
 ListFormatter* ListFormatter::createInstance(const Locale& locale, UErrorCode& errorCode) {
-#if !UCONFIG_NO_FORMATTING
     return createInstance(locale, ULISTFMT_TYPE_AND, ULISTFMT_WIDTH_WIDE, errorCode);
-#else
-    return createInstance(locale, "standard", errorCode);
-#endif
 }
 
-#if !UCONFIG_NO_FORMATTING
 ListFormatter* ListFormatter::createInstance(
         const Locale& locale, UListFormatterType type, UListFormatterWidth width, UErrorCode& errorCode) {
     const char* style = typeWidthToStyleString(type, width);
@@ -532,7 +527,6 @@
     }
     return createInstance(locale, style, errorCode);
 }
-#endif
 
 ListFormatter* ListFormatter::createInstance(const Locale& locale, const char *style, UErrorCode& errorCode) {
     const ListFormatInternal* listFormatInternal = getListFormatInternal(locale, style, errorCode);
@@ -573,7 +567,7 @@
                 start,
                 {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD},
                 status);
-            data->appendSpanIndex(0);
+            data->appendSpanInfo(0, start.length(), status);
         }
     }
 
@@ -609,7 +603,7 @@
                 next,
                 {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD},
                 status);
-            data->appendSpanIndex(position);
+            data->appendSpanInfo(position, next.length(), status);
             data->getStringRef().append(
                 temp.tempSubString(offsets[1]),
                 {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD},
@@ -628,7 +622,7 @@
                 next,
                 {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD},
                 status);
-            data->prependSpanIndex(position);
+            data->prependSpanInfo(position, next.length(), status);
             data->getStringRef().insert(
                 0,
                 temp.tempSubStringBetween(0, offsets[1]),
@@ -660,7 +654,6 @@
         int32_t index,
         int32_t &offset,
         UErrorCode& errorCode) const {
-#if !UCONFIG_NO_FORMATTING
     int32_t initialOffset = appendTo.length();
     auto result = formatStringsToValue(items, nItems, errorCode);
     UnicodeStringAppendable appendable(appendTo);
@@ -671,11 +664,9 @@
         result.nextPosition(cfpos, errorCode);
         offset = initialOffset + cfpos.getStart();
     }
-#endif
     return appendTo;
 }
 
-#if !UCONFIG_NO_FORMATTING
 FormattedList ListFormatter::formatStringsToValue(
         const UnicodeString items[],
         int32_t nItems,
@@ -741,7 +732,8 @@
         return FormattedList(result.data.orphan());
     }
 }
-#endif
 
 
 U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/i18n/number_skeletons.cpp b/icu4c/source/i18n/number_skeletons.cpp
index 0b14322..958bf12 100644
--- a/icu4c/source/i18n/number_skeletons.cpp
+++ b/icu4c/source/i18n/number_skeletons.cpp
@@ -732,6 +732,7 @@
 
         case STEM_CURRENCY:
             CHECK_NULL(seen, unit, status);
+            CHECK_NULL(seen, perUnit, status);
             return STATE_CURRENCY_UNIT;
 
         case STEM_INTEGER_WIDTH:
@@ -1475,32 +1476,33 @@
 }
 
 bool GeneratorHelpers::unit(const MacroProps& macros, UnicodeString& sb, UErrorCode& status) {
-    if (utils::unitIsCurrency(macros.unit)) {
+    MeasureUnit unit = macros.unit;
+    if (!utils::unitIsBaseUnit(macros.perUnit)) {
+        if (utils::unitIsCurrency(macros.unit) || utils::unitIsCurrency(macros.perUnit)) {
+            status = U_UNSUPPORTED_ERROR;
+            return false;
+        }
+        unit = unit.product(macros.perUnit.reciprocal(status), status);
+    }
+
+    if (utils::unitIsCurrency(unit)) {
         sb.append(u"currency/", -1);
-        CurrencyUnit currency(macros.unit, status);
+        CurrencyUnit currency(unit, status);
         if (U_FAILURE(status)) {
             return false;
         }
         blueprint_helpers::generateCurrencyOption(currency, sb, status);
         return true;
-    } else if (utils::unitIsBaseUnit(macros.unit)) {
+    } else if (utils::unitIsBaseUnit(unit)) {
         // Default value is not shown in normalized form
         return false;
-    } else if (utils::unitIsPercent(macros.unit)) {
+    } else if (utils::unitIsPercent(unit)) {
         sb.append(u"percent", -1);
         return true;
-    } else if (utils::unitIsPermille(macros.unit)) {
+    } else if (utils::unitIsPermille(unit)) {
         sb.append(u"permille", -1);
         return true;
     } else {
-        MeasureUnit unit = macros.unit;
-        if (utils::unitIsCurrency(macros.perUnit)) {
-            status = U_UNSUPPORTED_ERROR;
-            return false;
-        }
-        if (!utils::unitIsBaseUnit(macros.perUnit)) {
-            unit = unit.product(macros.perUnit.reciprocal(status), status);
-        }
         sb.append(u"unit/", -1);
         sb.append(unit.getIdentifier());
         return true;
diff --git a/icu4c/source/i18n/unicode/dtitvfmt.h b/icu4c/source/i18n/unicode/dtitvfmt.h
index c997c31..f45e680 100644
--- a/icu4c/source/i18n/unicode/dtitvfmt.h
+++ b/icu4c/source/i18n/unicode/dtitvfmt.h
@@ -1038,6 +1038,17 @@
                             UnicodeString& adjustedIntervalPattern);
 
     /**
+     * Does the same thing as UnicodeString::findAndReplace(), except that it won't perform
+     * the substitution inside quoted literal text.
+     * @param targetString The string to perform the find-replace operation on.
+     * @param strToReplace The string to search for and replace in the target string.
+     * @param strToReplaceWith The string to substitute in wherever `stringToReplace` was found.
+     */
+    static void U_EXPORT2 findReplaceInPattern(UnicodeString& targetString,
+                                               const UnicodeString& strToReplace,
+                                               const UnicodeString& strToReplaceWith);
+
+    /**
      * Concat a single date pattern with a time interval pattern,
      * set it into the intervalPatterns, while field is time field.
      * This is used to handle time interval patterns on skeleton with
diff --git a/icu4c/source/i18n/unicode/listformatter.h b/icu4c/source/i18n/unicode/listformatter.h
index 211055d..76a7289 100644
--- a/icu4c/source/i18n/unicode/listformatter.h
+++ b/icu4c/source/i18n/unicode/listformatter.h
@@ -23,6 +23,8 @@
 
 #if U_SHOW_CPLUSPLUS_API
 
+#if !UCONFIG_NO_FORMATTING
+
 #include "unicode/unistr.h"
 #include "unicode/locid.h"
 #include "unicode/formattedvalue.h"
@@ -65,7 +67,6 @@
  */
 
 
-#if !UCONFIG_NO_FORMATTING
 /**
  * An immutable class containing the result of a list formatting operation.
  *
@@ -135,7 +136,6 @@
         : fData(nullptr), fErrorCode(errorCode) {}
     friend class ListFormatter;
 };
-#endif // !UCONFIG_NO_FORMATTING
 
 
 /**
@@ -185,8 +185,6 @@
      */
     static ListFormatter* createInstance(const Locale& locale, UErrorCode& errorCode);
 
-#ifndef U_HIDE_DRAFT_API
-#if !UCONFIG_NO_FORMATTING
     /**
      * Creates a ListFormatter for the given locale, list type, and style.
      *
@@ -195,12 +193,10 @@
      * @param width The width of formatting to use.
      * @param errorCode ICU error code, set if no data available for the given locale.
      * @return A ListFormatter object created from internal data derived from CLDR data.
-     * @draft ICU 67
+     * @stable ICU 67
      */
     static ListFormatter* createInstance(
       const Locale& locale, UListFormatterType type, UListFormatterWidth width, UErrorCode& errorCode);
-#endif  /* !UCONFIG_NO_FORMATTING */
-#endif  /* U_HIDE_DRAFT_API */
   
 #ifndef U_HIDE_INTERNAL_API
     /**
@@ -239,7 +235,6 @@
     UnicodeString& format(const UnicodeString items[], int32_t n_items,
         UnicodeString& appendTo, UErrorCode& errorCode) const;
 
-#if !UCONFIG_NO_FORMATTING
     /**
      * Formats a list of strings to a FormattedList, which exposes field
      * position information. The FormattedList contains more information than
@@ -255,7 +250,6 @@
         const UnicodeString items[],
         int32_t n_items,
         UErrorCode& errorCode) const;
-#endif // !UCONFIG_NO_FORMATTING
 
 #ifndef U_HIDE_INTERNAL_API
     /**
@@ -296,6 +290,8 @@
 
 U_NAMESPACE_END
 
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
 #endif /* U_SHOW_CPLUSPLUS_API */
 
 #endif // __LISTFORMATTER_H__
diff --git a/icu4c/source/i18n/unicode/ulistformatter.h b/icu4c/source/i18n/unicode/ulistformatter.h
index 0500c89..8334c78 100644
--- a/icu4c/source/i18n/unicode/ulistformatter.h
+++ b/icu4c/source/i18n/unicode/ulistformatter.h
@@ -62,17 +62,16 @@
     ULISTFMT_ELEMENT_FIELD
 } UListFormatterField;
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Type of meaning expressed by the list.
  *
- * @draft ICU 67
+ * @stable ICU 67
  */
 typedef enum UListFormatterType {
     /**
      * Conjunction formatting, e.g. "Alice, Bob, Charlie, and Delta".
      *
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_TYPE_AND,
 
@@ -80,14 +79,14 @@
      * Disjunction (or alternative, or simply one of) formatting, e.g.
      * "Alice, Bob, Charlie, or Delta".
      *
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_TYPE_OR,
 
     /**
      * Formatting of a list of values with units, e.g. "5 pounds, 12 ounces".
      *
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_TYPE_UNITS
 } UListFormatterType;
@@ -95,29 +94,28 @@
 /**
  * Verbosity level of the list patterns.
  *
- * @draft ICU 67
+ * @stable ICU 67
  */
 typedef enum UListFormatterWidth {
     /**
      * Use list formatting with full words (no abbreviations) when possible.
      *
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_WIDTH_WIDE,
 
     /**
      * Use list formatting of typical length.
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_WIDTH_SHORT,
 
     /**
      * Use list formatting of the shortest possible length.
-     * @draft ICU 67
+     * @stable ICU 67
      */
     ULISTFMT_WIDTH_NARROW,
 } UListFormatterWidth;
-#endif /* U_HIDE_DRAFT_API */
 
 /**
  * Open a new UListFormatter object using the rules for a given locale.
@@ -141,7 +139,6 @@
 ulistfmt_open(const char*  locale,
               UErrorCode*  status);
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Open a new UListFormatter object appropriate for the given locale, list type,
  * and style.
@@ -162,12 +159,11 @@
  * @return
  *            A pointer to a UListFormatter object for the specified locale,
  *            or NULL if an error occurred.
- * @draft ICU 67
+ * @stable ICU 67
  */
 U_CAPI UListFormatter* U_EXPORT2
 ulistfmt_openForType(const char*  locale, UListFormatterType type,
                      UListFormatterWidth width, UErrorCode*  status);
-#endif /* U_HIDE_DRAFT_API */
 
 /**
  * Close a UListFormatter object. Once closed it may no longer be used.
diff --git a/icu4c/source/test/cintltst/cloctst.c b/icu4c/source/test/cintltst/cloctst.c
index 373c2d5..61cfd4c 100644
--- a/icu4c/source/test/cintltst/cloctst.c
+++ b/icu4c/source/test/cintltst/cloctst.c
@@ -1243,6 +1243,7 @@
 
 static void TestIllegalArgumentWhenNoDataWithNoSubstitute()
 {
+#if !UCONFIG_NO_FORMATTING
     UErrorCode status = U_ZERO_ERROR;
     UChar getName[kDisplayNameBracketsMax];
     UDisplayContext contexts[] = {
@@ -1299,6 +1300,7 @@
     }
 
     uldn_close(ldn);
+#endif
 }
 
 /*------------------------------
@@ -2243,12 +2245,7 @@
         strcpy(buffer,kwSetTestCases[i].l);
         status = U_ZERO_ERROR;
         res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status);
-        if(res == blen) {
-            if(status != U_STRING_NOT_TERMINATED_WARNING) {
-                log_err("expected not terminated warning on buffer %d got %s, len %d (%s + [%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v);
-                return;
-            }
-        } else if(status != U_BUFFER_OVERFLOW_ERROR) {
+        if(status != U_BUFFER_OVERFLOW_ERROR) {
             log_err("expected buffer overflow on buffer %d got %s, len %d (%s + [%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v);
             return;
         }
diff --git a/icu4c/source/test/depstest/dependencies.txt b/icu4c/source/test/depstest/dependencies.txt
index a3d059a..9367f16 100644
--- a/icu4c/source/test/depstest/dependencies.txt
+++ b/icu4c/source/test/depstest/dependencies.txt
@@ -184,7 +184,7 @@
     uinit utypes errorcode
     icuplug
     platform
-    localebuilder localematcher
+    localematcher
 
 group: pluralmap
     # TODO: Move to i18n library, ticket #11926.
@@ -634,6 +634,7 @@
     # Do we need class LocaleBased? https://unicode-org.atlassian.net/browse/ICU-8608
     locbased.o
     loclikely.o
+    localebuilder.o
   deps
     udata ucol_swp
     sort stringenumeration uhash uvector
@@ -641,15 +642,10 @@
     bytesinkutil
     errorcode
 
-group: localebuilder
-    localebuilder.o
-  deps
-    resourcebundle
-
 group: localematcher
     localematcher.o
   deps
-    localebuilder localeprioritylist loclikelysubtags locdistance lsr
+    resourcebundle localeprioritylist loclikelysubtags locdistance lsr
 
 group: localeprioritylist
     localeprioritylist.o
diff --git a/icu4c/source/test/intltest/dtifmtts.cpp b/icu4c/source/test/intltest/dtifmtts.cpp
index a1b1152..22a1cb3 100644
--- a/icu4c/source/test/intltest/dtifmtts.cpp
+++ b/icu4c/source/test/intltest/dtifmtts.cpp
@@ -1160,6 +1160,15 @@
         "hi_IN", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hB", "\\u0930\\u093E\\u0924 12\\u20131",
         "hi_IN", "CE 2010 09 27 10:00:00", "CE 2010 09 27 13:00:00", "CC", "\\u0938\\u0941\\u092C\\u0939 10 \\u2013 \\u0926\\u094B\\u092A\\u0939\\u0930 1",
         "hi_IN", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "CC", "\\u0930\\u093E\\u0924 12\\u20131",
+
+         // regression test for ICU-21342
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 10:00:00", "kk", "24\\u201310",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 11:00:00", "kk", "24\\u201311",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 12:00:00", "kk", "24\\u201312",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 13:00:00", "kk", "24\\u201313",
+
+         // regression test for ICU-21343
+         "de", "CE 2010 09 27 01:00:00", "CE 2010 09 27 10:00:00", "KK", "1 \\u2013 10 Uhr AM",
     };
     expect(DATA, UPRV_LENGTHOF(DATA));
 }
diff --git a/icu4c/source/test/intltest/formattedvaluetest.cpp b/icu4c/source/test/intltest/formattedvaluetest.cpp
index 8de225d..0edf420 100644
--- a/icu4c/source/test/intltest/formattedvaluetest.cpp
+++ b/icu4c/source/test/intltest/formattedvaluetest.cpp
@@ -237,6 +237,8 @@
     }
     UBool afterLoopResult = fv.nextPosition(cfpos, status);
     assertFalse(baseMessage + u"A after loop: " + CFPosToUnicodeString(cfpos), afterLoopResult);
+    afterLoopResult = fv.nextPosition(cfpos, status);
+    assertFalse(baseMessage + u"A after loop again: " + CFPosToUnicodeString(cfpos), afterLoopResult);
 
     // Check nextPosition constrained over each category one at a time
     for (int32_t category=0; category<UFIELD_CATEGORY_COUNT+1; category++) {
@@ -266,6 +268,8 @@
         }
         UBool afterLoopResult = fv.nextPosition(cfpos, status);
         assertFalse(baseMessage + u"B after loop @ " + CFPosToUnicodeString(cfpos), afterLoopResult);
+        afterLoopResult = fv.nextPosition(cfpos, status);
+        assertFalse(baseMessage + u"B after loop again @ " + CFPosToUnicodeString(cfpos), afterLoopResult);
     }
 
     // Check nextPosition constrained over each field one at a time
@@ -300,6 +304,8 @@
         }
         UBool afterLoopResult = fv.nextPosition(cfpos, status);
         assertFalse(baseMessage + u"C after loop: " + CFPosToUnicodeString(cfpos), afterLoopResult);
+        afterLoopResult = fv.nextPosition(cfpos, status);
+        assertFalse(baseMessage + u"C after loop again: " + CFPosToUnicodeString(cfpos), afterLoopResult);
     }
 }
 
diff --git a/icu4c/source/test/intltest/listformattertest.cpp b/icu4c/source/test/intltest/listformattertest.cpp
index c57c8f5..513d63e 100644
--- a/icu4c/source/test/intltest/listformattertest.cpp
+++ b/icu4c/source/test/intltest/listformattertest.cpp
@@ -48,6 +48,7 @@
     TESTCASE_AUTO(TestBadStylesFail);
     TESTCASE_AUTO(TestCreateStyled);
     TESTCASE_AUTO(TestContextual);
+    TESTCASE_AUTO(TestNextPosition);
     TESTCASE_AUTO_END;
 }
 
@@ -494,10 +495,10 @@
 
 void ListFormatterTest::TestFormattedValue() {
     IcuTestErrorCode status(*this, "TestFormattedValue");
-    LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("en", status));
-    if (status.errIfFailureAndReset()) { return; }
 
     {
+        LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("en", status));
+        if (status.errIfFailureAndReset()) { return; }
         const char16_t* message = u"Field position test 1";
         const char16_t* expectedString = u"hello, wonderful, and world";
         const UnicodeString inputs[] = {
@@ -523,6 +524,87 @@
             expectedFieldPositions,
             UPRV_LENGTHOF(expectedFieldPositions));
     }
+
+    {
+        LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("zh", ULISTFMT_TYPE_UNITS, ULISTFMT_WIDTH_SHORT, status));
+        if (status.errIfFailureAndReset()) { return; }
+        const char16_t* message = u"Field position test 2 (ICU-21340)";
+        const char16_t* expectedString = u"aabbbbbbbccc";
+        const UnicodeString inputs[] = {
+            u"aa",
+            u"bbbbbbb",
+            u"ccc"
+        };
+        FormattedList result = fmt->formatStringsToValue(inputs, UPRV_LENGTHOF(inputs), status);
+        static const UFieldPositionWithCategory expectedFieldPositions[] = {
+            // field, begin index, end index
+            {UFIELD_CATEGORY_LIST_SPAN, 0, 0, 2},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 0, 2},
+            {UFIELD_CATEGORY_LIST_SPAN, 1, 2, 9},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 2, 9},
+            {UFIELD_CATEGORY_LIST_SPAN, 2, 9, 12},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 9, 12}};
+        checkMixedFormattedValue(
+            message,
+            result,
+            expectedString,
+            expectedFieldPositions,
+            UPRV_LENGTHOF(expectedFieldPositions));
+    }
+
+    {
+        LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("en", ULISTFMT_TYPE_UNITS, ULISTFMT_WIDTH_SHORT, status));
+        if (status.errIfFailureAndReset()) { return; }
+        const char16_t* message = u"ICU-21383 Long list";
+        const char16_t* expectedString = u"a, b, c, d, e, f, g, h, i";
+        const UnicodeString inputs[] = {
+            u"a",
+            u"b",
+            u"c",
+            u"d",
+            u"e",
+            u"f",
+            u"g",
+            u"h",
+            u"i",
+        };
+        FormattedList result = fmt->formatStringsToValue(inputs, UPRV_LENGTHOF(inputs), status);
+        static const UFieldPositionWithCategory expectedFieldPositions[] = {
+            // field, begin index, end index
+            {UFIELD_CATEGORY_LIST_SPAN, 0, 0, 1},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 0, 1},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 1, 3},
+            {UFIELD_CATEGORY_LIST_SPAN, 1, 3, 4},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 3, 4},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 4, 6},
+            {UFIELD_CATEGORY_LIST_SPAN, 2, 6, 7},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 6, 7},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 7, 9},
+            {UFIELD_CATEGORY_LIST_SPAN, 3, 9, 10},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 9, 10},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 10, 12},
+            {UFIELD_CATEGORY_LIST_SPAN, 4, 12, 13},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 12, 13},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 13, 15},
+            {UFIELD_CATEGORY_LIST_SPAN, 5, 15, 16},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 15, 16},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 16, 18},
+            {UFIELD_CATEGORY_LIST_SPAN, 6, 18, 19},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 18, 19},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 19, 21},
+            {UFIELD_CATEGORY_LIST_SPAN, 7, 21, 22},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 21, 22},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_LITERAL_FIELD, 22, 24},
+            {UFIELD_CATEGORY_LIST_SPAN, 8, 24, 25},
+            {UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, 24, 25},
+            };
+        checkMixedFormattedValue(
+            message,
+            result,
+            expectedString,
+            expectedFieldPositions,
+            UPRV_LENGTHOF(expectedFieldPositions));
+    }
 }
 
 void ListFormatterTest::DoTheRealListStyleTesting(Locale locale,
@@ -700,4 +782,50 @@
     }
 }
 
+void ListFormatterTest::TestNextPosition() {
+    IcuTestErrorCode status(*this, "TestNextPosition");
+    std::vector<std::string> locales = { "en", "es", "zh", "ja" };
+    UListFormatterWidth widths [] = {
+        ULISTFMT_WIDTH_WIDE, ULISTFMT_WIDTH_SHORT, ULISTFMT_WIDTH_NARROW
+    };
+    const char* widthStr [] = {"wide", "short", "narrow"};
+    UListFormatterType types [] = {
+        ULISTFMT_TYPE_AND, ULISTFMT_TYPE_OR, ULISTFMT_TYPE_UNITS
+    };
+    const char* typeStr [] = {"and", "or", "units"};
+    const UnicodeString inputs[] = { u"A1", u"B2", u"C3", u"D4" };
+    for (auto width : widths) {
+        for (auto type : types) {
+            for (auto locale : locales) {
+                LocalPointer<ListFormatter> fmt(
+                        ListFormatter::createInstance(locale.c_str(), type, width, status),
+                    status);
+                if (status.errIfFailureAndReset()) {
+                    continue;
+                }
+                for (int32_t n = 1; n <= UPRV_LENGTHOF(inputs); n++) {
+                    FormattedList result = fmt->formatStringsToValue(
+                        inputs, n, status);
+                    int32_t elements = 0;
+                    icu::ConstrainedFieldPosition cfpos;
+                    cfpos.constrainCategory(UFIELD_CATEGORY_LIST);
+                    while (result.nextPosition(cfpos, status) && U_SUCCESS(status)) {
+                        if (cfpos.getField() == ULISTFMT_ELEMENT_FIELD) {
+                            elements++;
+                        }
+                    }
+                    std::string msg = locale;
+                    // Test that if there are n elements (n=1..4) in the input, then the
+                    // nextPosition() should iterate through exactly n times
+                    // with field == ULISTFMT_ELEMENT_FIELD.
+                    assertEquals((msg
+                                  .append(" w=").append(widthStr[width])
+                                  .append(" t=").append(typeStr[type])).c_str(),
+                                 n, elements);
+                }
+            }
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/intltest/listformattertest.h b/icu4c/source/test/intltest/listformattertest.h
index 9c7a5dd..b3d4005 100644
--- a/icu4c/source/test/intltest/listformattertest.h
+++ b/icu4c/source/test/intltest/listformattertest.h
@@ -55,6 +55,7 @@
     void TestBadStylesFail();
     void TestCreateStyled();
     void TestContextual();
+    void TestNextPosition();
 
   private:
     void CheckFormatting(
diff --git a/icu4c/source/test/intltest/loctest.cpp b/icu4c/source/test/intltest/loctest.cpp
index b807119..7ce21c4 100644
--- a/icu4c/source/test/intltest/loctest.cpp
+++ b/icu4c/source/test/intltest/loctest.cpp
@@ -4154,7 +4154,7 @@
         { "calendar", "buddhist" }
     };
 
-    UErrorCode status = U_ZERO_ERROR;
+    IcuTestErrorCode status(*this, "TestSetKeywordValue()");
 
     int32_t i = 0;
     int32_t resultLen = 0;
@@ -4176,6 +4176,24 @@
                 testCases[i].value, testCases[i].keyword, buffer);
         }
     }
+
+    // Test long locale
+    {
+        status.errIfFailureAndReset();
+        const char* input =
+            "de__POSIX@colnormalization=no;colstrength=primary;currency=eur;"
+            "em=default;kv=space;lb=strict;lw=normal;measure=metric;"
+            "numbers=latn;rg=atzzzz;sd=atat1";
+        const char* expected =
+            "de__POSIX@colnormalization=no;colstrength=primary;currency=eur;"
+            "em=default;kv=space;lb=strict;lw=normal;measure=metric;"
+            "numbers=latn;rg=atzzzz;sd=atat1;ss=none";
+        // Bug ICU-21385
+        Locale l2(input);
+        l2.setKeywordValue("ss", "none", status);
+        assertEquals("", expected, l2.getName());
+        status.errIfFailureAndReset();
+    }
 }
 
 void
@@ -4894,6 +4912,9 @@
         { "ja-Latn-hepburn-heploc", "ja-Latn-alalc97"},
 
         { "aaa-Fooo-SU", "aaa-Fooo-RU"},
+
+        // ICU-21344
+        { "ku-Arab-NT", "ku-Arab-IQ"},
     };
     int32_t i;
     for (i=0; i < UPRV_LENGTHOF(testCases); i++) {
diff --git a/icu4c/source/test/intltest/numbertest.h b/icu4c/source/test/intltest/numbertest.h
index 39c1a12..bd4c0e2 100644
--- a/icu4c/source/test/intltest/numbertest.h
+++ b/icu4c/source/test/intltest/numbertest.h
@@ -274,6 +274,7 @@
     void flexibleSeparators();
     void wildcardCharacters();
     void perUnitInArabic();
+    void perUnitToSkeleton();
 
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0);
 
diff --git a/icu4c/source/test/intltest/numbertest_api.cpp b/icu4c/source/test/intltest/numbertest_api.cpp
index 2af743c..a57cf3d 100644
--- a/icu4c/source/test/intltest/numbertest_api.cpp
+++ b/icu4c/source/test/intltest/numbertest_api.cpp
@@ -798,6 +798,15 @@
             Locale("de-DE"),
             -1.24,
             u"-1 Std., 14 Min. und 24 Sek.");
+
+    assertFormatSingle(
+            u"Zero out the unit field",
+            u"",
+            u"",
+            NumberFormatter::with().unit(KELVIN).unit(MeasureUnit()),
+            Locale("en"),
+            100,
+            u"100");
 }
 
 void NumberFormatterApiTest::unitCompoundMeasure() {
@@ -973,6 +982,7 @@
             u"2.4 m/s\u00B2");
 }
 
+// TODO: merge these tests into numbertest_skeletons.cpp instead of here:
 void NumberFormatterApiTest::unitSkeletons() {
     const struct TestCase {
         const char *msg;
@@ -1015,6 +1025,22 @@
          u"unit/meter-per-hectosecond",                       //
          u"unit/meter-per-hectosecond"},
 
+        {"percent compound skeletons handled correctly", //
+         u"unit/percent-per-meter",                      //
+         u"unit/percent-per-meter"},
+
+        {"permille compound skeletons handled correctly",                 //
+         u"measure-unit/concentr-permille per-measure-unit/length-meter", //
+         u"unit/permille-per-meter"},
+
+        {"percent simple unit is not actually considered a unit", //
+         u"unit/percent",                                         //
+         u"percent"},
+
+        {"permille simple unit is not actually considered a unit", //
+         u"measure-unit/concentr-permille",                        //
+         u"permille"},
+
         // // TODO: binary prefixes not supported yet!
         // {"Round-trip example from icu-units#35", //
         //  u"unit/kibijoule-per-furlong",          //
@@ -1048,20 +1074,33 @@
          u"measure-unit/meter per-measure-unit/hectosecond", //
          U_NUMBER_SKELETON_SYNTAX_ERROR,                     //
          U_ZERO_ERROR},
+
+        {"\"currency/EUR measure-unit/length-meter\" fails, conflicting skeleton.",
+         u"currency/EUR measure-unit/length-meter", //
+         U_NUMBER_SKELETON_SYNTAX_ERROR,            //
+         U_ZERO_ERROR},
+
+        {"\"measure-unit/length-meter currency/EUR\" fails, conflicting skeleton.",
+         u"measure-unit/length-meter currency/EUR", //
+         U_NUMBER_SKELETON_SYNTAX_ERROR,            //
+         U_ZERO_ERROR},
+
+        {"\"currency/EUR per-measure-unit/meter\" fails, conflicting skeleton.",
+         u"currency/EUR per-measure-unit/length-meter", //
+         U_NUMBER_SKELETON_SYNTAX_ERROR,                //
+         U_ZERO_ERROR},
     };
     for (auto &cas : failCases) {
         IcuTestErrorCode status(*this, cas.msg);
         auto nf = NumberFormatter::forSkeleton(cas.inputSkeleton, status);
         if (status.expectErrorAndReset(cas.expectedForSkelStatus, cas.msg)) {
-                continue;
+            continue;
         }
         nf.toSkeleton(status);
         status.expectErrorAndReset(cas.expectedToSkelStatus, cas.msg);
     }
 
     IcuTestErrorCode status(*this, "unitSkeletons");
-    MeasureUnit METER_PER_SECOND = MeasureUnit::forIdentifier("meter-per-second", status);
-
     assertEquals(                                //
         ".unit(METER_PER_SECOND) normalization", //
         u"unit/meter-per-second",                //
@@ -1083,6 +1122,16 @@
             .unit(METER)
             .perUnit(MeasureUnit::forIdentifier("hectosecond", status))
             .toSkeleton(status));
+
+    status.assertSuccess();
+    assertEquals(                                                //
+        ".unit(CURRENCY) produces a currency/CURRENCY skeleton", //
+        u"currency/GBP",                                         //
+        NumberFormatter::with().unit(GBP).toSkeleton(status));
+    status.assertSuccess();
+    // .unit(CURRENCY).perUnit(ANYTHING) is not supported.
+    NumberFormatter::with().unit(GBP).perUnit(METER).toSkeleton(status);
+    status.expectErrorAndReset(U_UNSUPPORTED_ERROR);
 }
 
 void NumberFormatterApiTest::unitUsage() {
diff --git a/icu4c/source/test/intltest/numbertest_skeletons.cpp b/icu4c/source/test/intltest/numbertest_skeletons.cpp
index d5e4bcf..07a864a 100644
--- a/icu4c/source/test/intltest/numbertest_skeletons.cpp
+++ b/icu4c/source/test/intltest/numbertest_skeletons.cpp
@@ -31,6 +31,7 @@
         TESTCASE_AUTO(flexibleSeparators);
         TESTCASE_AUTO(wildcardCharacters);
         TESTCASE_AUTO(perUnitInArabic);
+        TESTCASE_AUTO(perUnitToSkeleton);
     TESTCASE_AUTO_END;
 }
 
@@ -436,4 +437,59 @@
     }
 }
 
+void NumberSkeletonTest::perUnitToSkeleton() {
+    IcuTestErrorCode status(*this, "perUnitToSkeleton");
+    struct TestCase {
+        const char16_t* type;
+        const char16_t* subtype;
+    } cases[] = {
+        {u"area", u"acre"},
+        {u"concentr", u"percent"},
+        {u"concentr", u"permille"},
+        {u"concentr", u"permillion"},
+        {u"concentr", u"permyriad"},
+        {u"digital", u"bit"},
+        {u"length", u"yard"},
+    };
+
+    for (const auto& cas1 : cases) {
+        for (const auto& cas2 : cases) {
+            UnicodeString skeleton(u"measure-unit/");
+            skeleton += cas1.type;
+            skeleton += u"-";
+            skeleton += cas1.subtype;
+            skeleton += u" ";
+            skeleton += u"per-measure-unit/";
+            skeleton += cas2.type;
+            skeleton += u"-";
+            skeleton += cas2.subtype;
+
+            status.setScope(skeleton);
+            if (cas1.type != cas2.type && cas1.subtype != cas2.subtype) {
+                UnicodeString toSkeleton = NumberFormatter::forSkeleton(
+                    skeleton, status).toSkeleton(status);
+                if (status.errIfFailureAndReset()) {
+                    continue;
+                }
+                // Ensure both subtype are in the toSkeleton.
+                UnicodeString msg;
+                msg.append(toSkeleton)
+                    .append(" should contain '")
+                    .append(UnicodeString(cas1.subtype))
+                    .append("' when constructed from ")
+                    .append(skeleton);
+                assertTrue(msg, toSkeleton.indexOf(cas1.subtype) >= 0);
+
+                msg.remove();
+                msg.append(toSkeleton)
+                    .append(" should contain '")
+                    .append(UnicodeString(cas2.subtype))
+                    .append("' when constructed from ")
+                    .append(skeleton);
+                assertTrue(msg, toSkeleton.indexOf(cas2.subtype) >= 0);
+            }
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */
diff --git a/icu4c/source/test/iotest/iotest.cpp b/icu4c/source/test/iotest/iotest.cpp
index 7ef3cca..1e7716a 100644
--- a/icu4c/source/test/iotest/iotest.cpp
+++ b/icu4c/source/test/iotest/iotest.cpp
@@ -362,6 +362,7 @@
 U_CDECL_BEGIN
 static void U_CALLCONV ScanfMultipleIntegers(void)
 {
+#if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO
     UnicodeString input = UNICODE_STRING("[1.2.3]", 7);
     UnicodeString fmt = UNICODE_STRING("[%d.%d.%d]", 10);
     DataDrivenLogger logger;
@@ -391,6 +392,7 @@
         log_err("error in scanfmultipleintegers test 'result'  Got: %d Exp: %d\n",
                 result, expectedResult);
     }
+#endif
 }
 U_CDECL_END
 
@@ -732,8 +734,8 @@
     addTest(root, &DataDrivenPrintf, "datadriv/DataDrivenPrintf");
     addTest(root, &DataDrivenPrintfPrecision, "datadriv/DataDrivenPrintfPrecision");
     addTest(root, &DataDrivenScanf, "datadriv/DataDrivenScanf");
-#endif
     addTest(root, &ScanfMultipleIntegers, "ScanfMultipleIntegers");
+#endif
     addStreamTests(root);
 }
 
diff --git a/icu4c/source/test/perf/collationperf/collperf.cpp b/icu4c/source/test/perf/collationperf/collperf.cpp
index 2617d20..a1d8556 100644
--- a/icu4c/source/test/perf/collationperf/collperf.cpp
+++ b/icu4c/source/test/perf/collationperf/collperf.cpp
@@ -110,31 +110,31 @@
 const char * opt_locale     = "en_US";
 int    opt_langid     = 0;         // Defaults to value corresponding to opt_locale.
 char * opt_rules      = 0;
-UBool  opt_help       = FALSE;
+UBool  opt_help       = false;
 int    opt_loopCount  = 1;
 int    opt_iLoopCount = 1;
-UBool  opt_terse      = FALSE;
-UBool  opt_qsort      = FALSE;
-UBool  opt_binsearch  = FALSE;
-UBool  opt_icu        = TRUE;
-UBool  opt_win        = FALSE;      // Run with Windows native functions.
-UBool  opt_unix       = FALSE;      // Run with UNIX strcoll, strxfrm functions.
-UBool  opt_uselen     = FALSE;
-UBool  opt_usekeys    = FALSE;
-UBool  opt_strcmp     = FALSE;
-UBool  opt_strcmpCPO  = FALSE;
-UBool  opt_norm       = FALSE;
-UBool  opt_keygen     = FALSE;
-UBool  opt_french     = FALSE;
-UBool  opt_frenchoff  = FALSE;
-UBool  opt_shifted    = FALSE;
-UBool  opt_lower      = FALSE;
-UBool  opt_upper      = FALSE;
-UBool  opt_case       = FALSE;
+UBool  opt_terse      = false;
+UBool  opt_qsort      = false;
+UBool  opt_binsearch  = false;
+UBool  opt_icu        = true;
+UBool  opt_win        = false;      // Run with Windows native functions.
+UBool  opt_unix       = false;      // Run with UNIX strcoll, strxfrm functions.
+UBool  opt_uselen     = false;
+UBool  opt_usekeys    = false;
+UBool  opt_strcmp     = false;
+UBool  opt_strcmpCPO  = false;
+UBool  opt_norm       = false;
+UBool  opt_keygen     = false;
+UBool  opt_french     = false;
+UBool  opt_frenchoff  = false;
+UBool  opt_shifted    = false;
+UBool  opt_lower      = false;
+UBool  opt_upper      = false;
+UBool  opt_case       = false;
 int    opt_level      = 0;
-UBool  opt_keyhist    = FALSE;
-UBool  opt_itertest   = FALSE;
-UBool  opt_dump       = FALSE;
+UBool  opt_keyhist    = false;
+UBool  opt_itertest   = false;
+UBool  opt_dump       = false;
 
 
 
@@ -233,13 +233,13 @@
             if (strcmp(pOpt->name, pArgName) == 0) {
                 switch (pOpt->type) {
                 case OptSpec::FLAG:
-                    *(UBool *)(pOpt->pVar) = TRUE;
+                    *(UBool *)(pOpt->pVar) = true;
                     break;
                 case OptSpec::STRING:
                     argNum ++;
                     if (argNum >= argc) {
                         fprintf(stderr, "value expected for \"%s\" option.\n", pOpt->name);
-                        return FALSE;
+                        return false;
                     }
                     *(const char **)(pOpt->pVar)  = argv[argNum];
                     break;
@@ -247,13 +247,13 @@
                     argNum ++;
                     if (argNum >= argc) {
                         fprintf(stderr, "value expected for \"%s\" option.\n", pOpt->name);
-                        return FALSE;
+                        return false;
                     }
                     char *endp;
                     i = strtol(argv[argNum], &endp, 0);
                     if (endp == argv[argNum]) {
                         fprintf(stderr, "integer value expected for \"%s\" option.\n", pOpt->name);
-                        return FALSE;
+                        return false;
                     }
                     *(int *)(pOpt->pVar) = i;
                 }
@@ -263,10 +263,10 @@
         if (pOpt->name == 0)
         {
             fprintf(stderr, "Unrecognized option \"%s\"\n", pArgName);
-            return FALSE;
+            return false;
         }
     }
-return TRUE;
+return true;
 }
 
 //---------------------------------------------------------------------------------------
@@ -425,7 +425,7 @@
     unsigned long elapsedTime = timeGetTime() - startTime;
     int ns = (int)(float(1000000) * (float)elapsedTime / (float)(adj_loopCount*gNumFileLines));
 
-    if (opt_terse == FALSE) {
+    if (opt_terse == false) {
         printf("Sort Key Generation:  total # of keys = %d\n", loops*gNumFileLines);
         printf("Sort Key Generation:  time per key = %d ns\n", ns);
     }
@@ -448,7 +448,7 @@
         }
 
     }
-    if (opt_terse == FALSE) {
+    if (opt_terse == false) {
         printf("Key Length / character = %f\n", (float)totalKeyLen / (float)totalChars);
     } else {
         printf("%f, ", (float)totalKeyLen / (float)totalChars);
@@ -610,7 +610,7 @@
                                 r = CompareStringW(gWinLCID, 0, (gSortedLines[line])->name, lineLen, (gSortedLines[guess])->name, guessLen);
                             }
                             if (r == 0) {
-                                if (opt_terse == FALSE) {
+                                if (opt_terse == false) {
                                     fprintf(stderr, "Error returned from Windows CompareStringW.\n");
                                 }
                                 exit(-1);
@@ -679,7 +679,7 @@
     }
 
     int ns = (int)(float(1000000) * (float)elapsedTime / (float)gCount);
-    if (opt_terse == FALSE) {
+    if (opt_terse == false) {
         printf("binary search:  total # of string compares = %d\n", gCount);
         printf("binary search:  compares per loop = %d\n", gCount / loops);
         printf("binary search:  time per compare = %d ns\n", ns);
@@ -763,7 +763,7 @@
 
     unsigned long elapsedTime = timeGetTime() - startTime;
     int ns = (int)(float(1000000) * (float)elapsedTime / (float)gCount);
-    if (opt_terse == FALSE) {
+    if (opt_terse == false) {
         printf("qsort:  total # of string compares = %d\n", gCount);
         printf("qsort:  time per compare = %d ns\n", ns);
     } else {
@@ -925,7 +925,7 @@
         int count5 = 5;
         strindex = 0;
         ucol_setOffset(iter, strindex, &error);
-        while (TRUE) {
+        while (true) {
             if (ucol_next(iter, &error) == UCOL_NULLORDER) {
                 break;
             }
@@ -954,7 +954,7 @@
         int count5 = 5;
         strindex = 0;
         ucol_setOffset(iter, strindex, &error);
-        while (TRUE) {
+        while (true) {
             tempgCount ++;
             count5 --;
             if (count5 == 0) {
@@ -1088,7 +1088,7 @@
         int count5 = 5;
         strindex = 5;
         ucol_setOffset(iter, strindex, &error);
-        while (TRUE) {
+        while (true) {
             if (ucol_previous(iter, &error) == UCOL_NULLORDER) {
                 break;
             }
@@ -1117,7 +1117,7 @@
         int count5 = 5;
         strindex = 5;
         ucol_setOffset(iter, strindex, &error);
-        while (TRUE) {
+        while (true) {
              tempgCount ++;
              count5 --;
              if (count5 == 0) {
@@ -1229,14 +1229,14 @@
 };
 
 UCharFile::UCharFile(const char * fileName) {
-    fEof                 = FALSE;
-    fError               = FALSE;
+    fEof                 = false;
+    fError               = false;
     fName                = fileName;
     fFile                = fopen(fName, "rb");
     fPending2ndSurrogate = 0;
     if (fFile == NULL) {
         fprintf(stderr, "Can not open file \"%s\"\n", opt_fName);
-        fError = TRUE;
+        fError = true;
         return;
     }
     //
@@ -1279,7 +1279,7 @@
             c  = cL  | (cH << 8);
             if (cH == EOF) {
                 c   = 0;
-                fEof = TRUE;
+                fEof = true;
             }
             break;
         }
@@ -1291,7 +1291,7 @@
             c  = cL  | (cH << 8);
             if (cL == EOF) {
                 c   = 0;
-                fEof = TRUE;
+                fEof = true;
             }
             break;
         }
@@ -1306,7 +1306,7 @@
             int ch = fgetc(fFile);   // Note:  c and ch are separate cause eof test doesn't work on UChar type.
             if (ch == EOF) {
                 c = 0;
-                fEof = TRUE;
+                fEof = true;
                 break;
             }
             
@@ -1324,7 +1324,7 @@
             else if (ch >= 0xC0) {nBytes=2;}
             else {
                 fprintf(stderr, "utf-8 encoded file contains corrupt data.\n");
-                fError = TRUE;
+                fError = true;
                 return 0;
             }
             
@@ -1335,7 +1335,7 @@
                 bytes[i] = fgetc(fFile);
                 if (bytes[i] < 0x80 || bytes[i] >= 0xc0) {
                     fprintf(stderr, "utf-8 encoded file contains corrupt data.\n");
-                    fError = TRUE;
+                    fError = true;
                     return 0;
                 }
             }
@@ -1426,14 +1426,14 @@
 //
 //----------------------------------------------------------------------------------------
 int main(int argc, const char** argv) {
-    if (ProcessOptions(argc, argv, opts) != TRUE || opt_help || opt_fName == 0) {
+    if (ProcessOptions(argc, argv, opts) != true || opt_help || opt_fName == 0) {
         printf(gUsageString);
         exit (1);
     }
 
     // Make sure that we've only got one API selected.
-    if (opt_unix || opt_win) opt_icu = FALSE;
-    if (opt_unix) opt_win = FALSE;
+    if (opt_unix || opt_win) opt_icu = false;
+    if (opt_unix) opt_win = false;
 
     //
     //  Set up an ICU collator
@@ -1451,10 +1451,10 @@
             return -1;
         }
     }
-    if (status==U_USING_DEFAULT_WARNING && opt_terse==FALSE) {
+    if (status==U_USING_DEFAULT_WARNING && opt_terse==false) {
         fprintf(stderr, "Warning, U_USING_DEFAULT_WARNING for %s\n", opt_locale);
     }
-    if (status==U_USING_FALLBACK_WARNING && opt_terse==FALSE) {
+    if (status==U_USING_FALLBACK_WARNING && opt_terse==false) {
         fprintf(stderr, "Warning, U_USING_FALLBACK_ERROR for %s\n", opt_locale);
     }
 
@@ -1589,16 +1589,16 @@
         buf[column++] = c;
         if (column >= 1023)
         {
-            static UBool warnFlag = TRUE;
+            static UBool warnFlag = true;
             if (warnFlag) {
                 fprintf(stderr, "Warning - file line longer than 1023 chars truncated.\n");
-                warnFlag = FALSE;
+                warnFlag = false;
             }
             column--;
         }
     }
 
-    if (opt_terse == FALSE) {
+    if (opt_terse == false) {
         printf("file \"%s\", %d lines.\n", opt_fName, gNumFileLines);
     }
 
diff --git a/icu4c/source/test/perf/howExpensiveIs/howExpensiveIs.cpp b/icu4c/source/test/perf/howExpensiveIs/howExpensiveIs.cpp
index c7771bb..7fe13cb 100644
--- a/icu4c/source/test/perf/howExpensiveIs/howExpensiveIs.cpp
+++ b/icu4c/source/test/perf/howExpensiveIs/howExpensiveIs.cpp
@@ -500,7 +500,7 @@
     case kApplyPattern:
       {
         UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &setupStatus);
-        unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus);
+        unum_applyPattern(fmt, false, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus);
         return fmt;
       }
     case kGroupOff:
@@ -512,7 +512,7 @@
     case kApplyGroupOff:
       {
         UNumberFormat *fmt = unum_open(UNUM_DECIMAL, NULL, -1, TEST_LOCALE, 0, &setupStatus);
-        unum_applyPattern(fmt, FALSE, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus);
+        unum_applyPattern(fmt, false, fPat.getTerminatedBuffer(), -1, NULL, &setupStatus);
         unum_setAttribute(fmt, UNUM_GROUPING_USED, UNUM_NO);
         return fmt;
       }
diff --git a/icu4c/source/test/perf/howExpensiveIs/sieve.cpp b/icu4c/source/test/perf/howExpensiveIs/sieve.cpp
index 8713842..0478b6d 100644
--- a/icu4c/source/test/perf/howExpensiveIs/sieve.cpp
+++ b/icu4c/source/test/perf/howExpensiveIs/sieve.cpp
@@ -190,12 +190,12 @@
   return meanTime;
 }
 
-UBool calcSieveTime = FALSE;
+UBool calcSieveTime = false;
 double meanSieveTime = 0.0;
 double meanSieveME = 0.0;
 
 U_CAPI double uprv_getSieveTime(double *marginOfError) {
-  if(calcSieveTime==FALSE) {
+  if(!calcSieveTime) {
 #define SAMPLES 50
     uint32_t samples = SAMPLES;
     double times[SAMPLES];
@@ -208,7 +208,7 @@
     }
     
     meanSieveTime = uprv_getMeanTime(times, &samples,&meanSieveME);
-    calcSieveTime=TRUE;
+    calcSieveTime=true;
   }
   if(marginOfError!=NULL) {
     *marginOfError = meanSieveME;
diff --git a/icu4c/source/test/perf/normperf/normperf.h b/icu4c/source/test/perf/normperf/normperf.h
index ac9e249..b29a7bc 100644
--- a/icu4c/source/test/perf/normperf/normperf.h
+++ b/icu4c/source/test/perf/normperf/normperf.h
@@ -47,7 +47,7 @@
 
 public:
     virtual void call(UErrorCode* status){
-        if(line_mode==TRUE){
+        if(line_mode){
             if(uselen){
                 for(int32_t i = 0; i< numLines; i++){
                     retVal =  (*fn)(lines[i].name,lines[i].len,mode, options, status);
@@ -68,7 +68,7 @@
 
     }
     virtual long getOperationsPerIteration(){
-        if(line_mode==TRUE){
+        if(line_mode){
             int32_t totalChars=0;
             for(int32_t i =0; i< numLines; i++){
                 totalChars+= lines[i].len;
@@ -86,7 +86,7 @@
         mode = _mode;
         src = NULL;
         srcLen = 0;
-        line_mode = TRUE;
+        line_mode = true;
     }
     QuickCheckPerfFunction(QuickCheckFn func, const UChar* source,int32_t sourceLen, UNormalizationMode _mode, int32_t opts, UBool _uselen) : options(opts) {
         fn = func;
@@ -96,7 +96,7 @@
         mode = _mode;
         src = source;
         srcLen = sourceLen;
-        line_mode = FALSE;
+        line_mode = false;
     }
 };
 
@@ -118,7 +118,7 @@
 
 public:
     virtual void call(UErrorCode* status){
-        if(line_mode==TRUE){
+        if(line_mode){
             if(uselen){
                 for(int32_t i = 0; i< numLines; i++){
                     retVal =  (*fn)(lines[i].name,lines[i].len,pDest,destLen, options, status);
@@ -137,7 +137,7 @@
         }
     }
     virtual long getOperationsPerIteration(){
-        if(line_mode ==TRUE){
+        if(line_mode){
             int32_t totalChars=0;
             for(int32_t i =0; i< numLines; i++){
                 totalChars+= lines[i].len;
@@ -156,7 +156,7 @@
         pDest = dest;
         src = NULL;
         srcLen = 0;
-        line_mode = TRUE;
+        line_mode = true;
     }
     NormPerfFunction(NormFn func, int32_t opts, const UChar* source,int32_t sourceLen,UBool _uselen) : options(opts) {
         fn = func;
@@ -167,7 +167,7 @@
         pDest = (UChar*) malloc(destLen * U_SIZEOF_UCHAR);
         src = source;
         srcLen = sourceLen;
-        line_mode = FALSE;
+        line_mode = false;
     }
     ~NormPerfFunction(){
         if(dest != pDest){
diff --git a/icu4c/source/test/perf/normperf/simplenormperf.cpp b/icu4c/source/test/perf/normperf/simplenormperf.cpp
index b6865ba..2f7341b7 100644
--- a/icu4c/source/test/perf/normperf/simplenormperf.cpp
+++ b/icu4c/source/test/perf/normperf/simplenormperf.cpp
@@ -255,7 +255,7 @@
     UErrorCode errorCode = U_ZERO_ERROR;
     utimer_getTime(&startTime);
     for (int32_t i = 0; i < iterations; ++i) {
-        piece.setTo(FALSE, s + start, pieceLength);
+        piece.setTo(false, s + start, pieceLength);
         norm2.normalize(piece, dest, errorCode);
         start = (start + pieceLength) % limit;
     }
diff --git a/icu4c/source/test/perf/usetperf/bitset.cpp b/icu4c/source/test/perf/usetperf/bitset.cpp
index a489a85..71da112 100644
--- a/icu4c/source/test/perf/usetperf/bitset.cpp
+++ b/icu4c/source/test/perf/usetperf/bitset.cpp
@@ -35,7 +35,7 @@
     uint32_t longIndex = bitIndex >> 5;
     int32_t bitInLong = bitIndex & 0x1F;
     return (longIndex < len) ? (((data[longIndex] >> bitInLong) & 1) != 0)
-        : FALSE;
+        : false;
 }
 
 void BitSet::set(int32_t bitIndex) {
diff --git a/icu4j/APIChangeReport.html b/icu4j/APIChangeReport.html
index 5f9042b..c47a1d8 100644
--- a/icu4j/APIChangeReport.html
+++ b/icu4j/APIChangeReport.html
@@ -214,6 +214,6 @@
 </ul>
 
 <hr/>
-<p><i><font size="-1">Contents generated by ReportAPI tool on Thu Oct 01 10:15:24 PDT 2020<br/>© 2020 and later: Unicode, Inc. and others. License & terms of use: <a href="http://www.unicode.org/copyright.html">http://www.unicode.org/copyright.html</a></font></i></p>
+<p><i><font size="-1">Contents generated by ReportAPI tool on Fri Oct 23 11:19:04 PDT 2020<br/>© 2020 and later: Unicode, Inc. and others. License & terms of use: <a href="http://www.unicode.org/copyright.html">http://www.unicode.org/copyright.html</a></font></i></p>
 </body>
 </html>
diff --git a/icu4j/build.properties b/icu4j/build.properties
index 6448f4b..def6147 100644
--- a/icu4j/build.properties
+++ b/icu4j/build.properties
@@ -6,7 +6,7 @@
 #*******************************************************************************
 api.report.version = 68
 api.report.prev.version = 67
-release.file.ver = 68rc
-api.doc.version = 68 Release Candidate
-maven.pom.ver = 68.1-SNAPSHOT
+release.file.ver = 68_1
+api.doc.version = 68.1
+maven.pom.ver = 68.1
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/FormattedValueStringBuilderImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/FormattedValueStringBuilderImpl.java
index e6c54a5..0c82d26 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/FormattedValueStringBuilderImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/FormattedValueStringBuilderImpl.java
@@ -226,6 +226,12 @@
         }
 
         assert currField == null;
+        // Always set the position to the end so that we don't revisit previous sections
+        cfpos.setState(
+            cfpos.getField(),
+            cfpos.getFieldValue(),
+            self.length,
+            self.length);
         return false;
     }
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
index e2a0d30..b3e536a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CompactData.java
@@ -98,7 +98,12 @@
                 .entrySet()) {
             byte magnitude = (byte) (magnitudeEntry.getKey().length() - 1);
             for (Map.Entry<String, String> pluralEntry : magnitudeEntry.getValue().entrySet()) {
-                StandardPlural plural = StandardPlural.fromString(pluralEntry.getKey().toString());
+                String pluralString = pluralEntry.getKey().toString();
+                if ("0".equals(pluralString) || "1".equals(pluralString)) {
+                    // TODO(ICU-21258): Handle this case. For now, skip.
+                    continue;
+                }
+                StandardPlural plural = StandardPlural.fromString(pluralString);
                 String patternString = pluralEntry.getValue().toString();
                 patterns[getIndex(magnitude, plural)] = patternString;
                 int numZeros = countZeros(patternString);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/MeasureUnitImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/MeasureUnitImpl.java
index 1745b16..cdaca18 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/MeasureUnitImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/MeasureUnitImpl.java
@@ -35,7 +35,7 @@
      * <p>
      * The "dimensionless" <code>MeasureUnitImpl</code> has an empty <code>singleUnits</code>.
      */
-    private ArrayList<SingleUnitImpl> singleUnits;
+    private final ArrayList<SingleUnitImpl> singleUnits;
 
     public MeasureUnitImpl() {
         singleUnits = new ArrayList<>();
@@ -147,8 +147,7 @@
 
         // Find a similar unit that already exists, to attempt to coalesce
         SingleUnitImpl oldUnit = null;
-        for (int i = 0, n = this.singleUnits.size(); i < n; i++) {
-            SingleUnitImpl candidate = this.singleUnits.get(i);
+        for (SingleUnitImpl candidate : this.singleUnits) {
             if (candidate.isCompatibleWith(singleUnit)) {
                 oldUnit = candidate;
                 break;
@@ -372,34 +371,32 @@
     public static class UnitsParser {
         // This used only to not build the trie each time we use the parser
         private volatile static CharsTrie savedTrie = null;
-        private final String[] simpleUnits;
+
         // This trie used in the parsing operation.
-        private CharsTrie trie;
+        private final CharsTrie trie;
+        private final String fSource;
         // Tracks parser progress: the offset into fSource.
         private int fIndex = 0;
         // Set to true when we've seen a "-per-" or a "per-", after which all units
         // are in the denominator. Until we find an "-and-", at which point the
         // identifier is invalid pending TODO(CLDR-13700).
         private boolean fAfterPer = false;
-        private String fSource;
         // If an "-and-" was parsed prior to finding the "single
         //     * unit", sawAnd is set to true. If not, it is left as is.
         private boolean fSawAnd = false;
 
         private UnitsParser(String identifier) {
-            this.simpleUnits = UnitsData.getSimpleUnits();
             this.fSource = identifier;
 
-            if (UnitsParser.savedTrie != null) {
-                try {
-                    this.trie = UnitsParser.savedTrie.clone();
-                } catch (CloneNotSupportedException e) {
-                    throw new ICUCloneNotSupportedException();
-                }
-                return;
+            try {
+                this.trie = UnitsParser.savedTrie.clone();
+            } catch (CloneNotSupportedException e) {
+                throw new ICUCloneNotSupportedException();
             }
+        }
 
-            // Building the trie.
+        static {
+            // Build Units trie.
             CharsTrieBuilder trieBuilder;
             trieBuilder = new CharsTrieBuilder();
 
@@ -432,6 +429,7 @@
             }
 
             // Add simple units
+            String[] simpleUnits = UnitsData.getSimpleUnits();
             for (int i = 0; i < simpleUnits.length; i++) {
                 trieBuilder.add(simpleUnits[i], i + UnitsData.Constants.kSimpleUnitOffset);
 
@@ -439,15 +437,8 @@
 
             // TODO: Use SLOW or FAST here?
             UnitsParser.savedTrie = trieBuilder.build(StringTrieBuilder.Option.FAST);
-
-            try {
-                this.trie = UnitsParser.savedTrie.clone();
-            } catch (CloneNotSupportedException e) {
-                throw new ICUCloneNotSupportedException();
-            }
         }
 
-
         /**
          * Construct a MeasureUnit from a CLDR Unit Identifier, defined in UTS 35.
          * Validates and canonicalizes the identifier.
@@ -607,7 +598,7 @@
                         break;
 
                     case TYPE_SIMPLE_UNIT:
-                        result.setSimpleUnit(token.getSimpleUnitIndex(), simpleUnits);
+                        result.setSimpleUnit(token.getSimpleUnitIndex(), UnitsData.getSimpleUnits());
                         return result;
 
                     default:
@@ -746,7 +737,7 @@
     }
 
     static class MeasureUnitImplComparator implements Comparator<MeasureUnitImpl> {
-        private ConversionRates conversionRates;
+        private final ConversionRates conversionRates;
 
         public MeasureUnitImplComparator(ConversionRates conversionRates) {
             this.conversionRates = conversionRates;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
index a5484cd..33af7e0 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberFormatterSettings.java
@@ -613,91 +613,67 @@
         // of a MacroProps object at each step.
         // TODO: Remove the reference to the parent after the macros are resolved?
         MacroProps macros = new MacroProps();
+        // Bitmap: 1 if seen; 0 if unseen
+        long seen = 0;
         NumberFormatterSettings<?> current = this;
         while (current != null) {
+            long keyBitmask = (1L << current.key);
+            if (0 != (seen & keyBitmask)) {
+                current = current.parent;
+                continue;
+            }
+            seen |= keyBitmask;
             switch (current.key) {
             case KEY_MACROS:
                 macros.fallback((MacroProps) current.value);
                 break;
             case KEY_LOCALE:
-                if (macros.loc == null) {
-                    macros.loc = (ULocale) current.value;
-                }
+                macros.loc = (ULocale) current.value;
                 break;
             case KEY_NOTATION:
-                if (macros.notation == null) {
-                    macros.notation = (Notation) current.value;
-                }
+                macros.notation = (Notation) current.value;
                 break;
             case KEY_UNIT:
-                if (macros.unit == null) {
-                    macros.unit = (MeasureUnit) current.value;
-                }
+                macros.unit = (MeasureUnit) current.value;
                 break;
             case KEY_PRECISION:
-                if (macros.precision == null) {
-                    macros.precision = (Precision) current.value;
-                }
+                macros.precision = (Precision) current.value;
                 break;
             case KEY_ROUNDING_MODE:
-                if (macros.roundingMode == null) {
-                    macros.roundingMode = (RoundingMode) current.value;
-                }
+                macros.roundingMode = (RoundingMode) current.value;
                 break;
             case KEY_GROUPING:
-                if (macros.grouping == null) {
-                    macros.grouping = /* (Object) */ current.value;
-                }
+                macros.grouping = /* (Object) */ current.value;
                 break;
             case KEY_PADDER:
-                if (macros.padder == null) {
-                    macros.padder = (Padder) current.value;
-                }
+                macros.padder = (Padder) current.value;
                 break;
             case KEY_INTEGER:
-                if (macros.integerWidth == null) {
-                    macros.integerWidth = (IntegerWidth) current.value;
-                }
+                macros.integerWidth = (IntegerWidth) current.value;
                 break;
             case KEY_SYMBOLS:
-                if (macros.symbols == null) {
-                    macros.symbols = /* (Object) */ current.value;
-                }
+                macros.symbols = /* (Object) */ current.value;
                 break;
             case KEY_UNIT_WIDTH:
-                if (macros.unitWidth == null) {
-                    macros.unitWidth = (UnitWidth) current.value;
-                }
+                macros.unitWidth = (UnitWidth) current.value;
                 break;
             case KEY_SIGN:
-                if (macros.sign == null) {
-                    macros.sign = (SignDisplay) current.value;
-                }
+                macros.sign = (SignDisplay) current.value;
                 break;
             case KEY_DECIMAL:
-                if (macros.decimal == null) {
-                    macros.decimal = (DecimalSeparatorDisplay) current.value;
-                }
+                macros.decimal = (DecimalSeparatorDisplay) current.value;
                 break;
             case KEY_SCALE:
-                if (macros.scale == null) {
-                    macros.scale = (Scale) current.value;
-                }
+                macros.scale = (Scale) current.value;
                 break;
             case KEY_THRESHOLD:
-                if (macros.threshold == null) {
-                    macros.threshold = (Long) current.value;
-                }
+                macros.threshold = (Long) current.value;
                 break;
             case KEY_PER_UNIT:
-                if (macros.perUnit == null) {
-                    macros.perUnit = (MeasureUnit) current.value;
-                }
+                macros.perUnit = (MeasureUnit) current.value;
                 break;
             case KEY_USAGE:
-                if(macros.usage == null) {
-                    macros.usage = (String) current.value;
-                }
+                macros.usage = (String) current.value;
                 break;
             default:
                 throw new AssertionError("Unknown key: " + current.key);
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberSkeletonImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberSkeletonImpl.java
index 85227b8..ab40477 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/number/NumberSkeletonImpl.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/number/NumberSkeletonImpl.java
@@ -618,6 +618,7 @@
                 case STATE_INCREMENT_PRECISION:
                 case STATE_MEASURE_UNIT:
                 case STATE_PER_MEASURE_UNIT:
+                case STATE_IDENTIFIER_UNIT:
                 case STATE_UNIT_USAGE:
                 case STATE_CURRENCY_UNIT:
                 case STATE_INTEGER_WIDTH:
@@ -659,7 +660,7 @@
             BlueprintHelpers.parseScientificStem(segment, macros);
             return ParseState.STATE_NULL;
         case '0':
-            checkNull(macros.notation, segment);
+            checkNull(macros.integerWidth, segment);
             BlueprintHelpers.parseIntegerStem(segment, macros);
             return ParseState.STATE_NULL;
         }
@@ -784,6 +785,11 @@
             return ParseState.STATE_MEASURE_UNIT;
 
         case STEM_PER_MEASURE_UNIT:
+            // In C++, STEM_CURRENCY's checks mark perUnit as "seen". Here we do
+            // the inverse: checking that macros.unit is not set to a currency.
+            if (macros.unit instanceof Currency) {
+                throw new SkeletonSyntaxException("Duplicated setting", segment);
+            }
             checkNull(macros.perUnit, segment);
             return ParseState.STATE_PER_MEASURE_UNIT;
 
@@ -798,6 +804,7 @@
 
         case STEM_CURRENCY:
             checkNull(macros.unit, segment);
+            checkNull(macros.perUnit, segment);
             return ParseState.STATE_CURRENCY_UNIT;
 
         case STEM_INTEGER_WIDTH:
@@ -1448,25 +1455,25 @@
         }
 
         private static boolean unit(MacroProps macros, StringBuilder sb) {
-            if (macros.unit instanceof Currency) {
+            MeasureUnit unit = macros.unit;
+            if (macros.perUnit != null) {
+                if (macros.unit instanceof Currency || macros.perUnit instanceof Currency) {
+                    throw new UnsupportedOperationException(
+                        "Cannot generate number skeleton with currency unit and per-unit");
+                }
+                unit = unit.product(macros.perUnit.reciprocal());
+            }
+            if (unit instanceof Currency) {
                 sb.append("currency/");
-                BlueprintHelpers.generateCurrencyOption((Currency) macros.unit, sb);
+                BlueprintHelpers.generateCurrencyOption((Currency)unit, sb);
                 return true;
-            } else if (macros.unit == MeasureUnit.PERCENT) {
+            } else if (unit.equals(MeasureUnit.PERCENT)) {
                 sb.append("percent");
                 return true;
-            } else if (macros.unit == MeasureUnit.PERMILLE) {
+            } else if (unit.equals(MeasureUnit.PERMILLE)) {
                 sb.append("permille");
                 return true;
             } else {
-                MeasureUnit unit = macros.unit;
-                if (macros.perUnit != null) {
-                    if (macros.perUnit instanceof Currency) {
-                        throw new UnsupportedOperationException(
-                            "Cannot generate number skeleton with per-unit that is not a standard measure unit");
-                    }
-                    unit = unit.product(macros.perUnit.reciprocal());
-                }
                 sb.append("unit/");
                 sb.append(unit.getIdentifier());
                 return true;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java
index fd69112..fac9453 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java
@@ -295,7 +295,9 @@
      */
     public void setState(Field field, Object value, int start, int limit) {
         // Check matchesField only as an assertion (debug build)
-        assert matchesField(field, value);
+        if (field != null) {
+            assert matchesField(field, value);
+        }
 
         fField = field;
         fValue = value;
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java
index 9befd1e..4a59b01 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalFormat.java
@@ -1982,6 +1982,14 @@
                  pattern = fInfo.getIntervalPattern(bestSkeleton,
                                                          Calendar.HOUR);
                  if ( pattern != null ) {
+                    boolean suppressDayPeriodField = fSkeleton.indexOf('J') != -1;
+                    String part1 = adjustFieldWidth(skeleton, bestSkeleton,
+                                       pattern.getFirstPart(), differenceInfo, suppressDayPeriodField);
+                    String part2 = adjustFieldWidth(skeleton, bestSkeleton,
+                                       pattern.getSecondPart(), differenceInfo, suppressDayPeriodField);
+                    pattern =  new PatternInfo(part1, part2,
+                                               pattern.firstDateInPtnIsLaterDate());
+                                               
                       // share
                       intervalPatterns.put(DateIntervalInfo.
                           CALENDAR_FIELD_TO_PATTERN_LETTER[field],
@@ -2097,24 +2105,24 @@
         DateIntervalInfo.parseSkeleton(bestMatchSkeleton, bestMatchSkeletonFieldWidth);
         if (suppressDayPeriodField) {
             if (bestMatchIntervalPattern.indexOf(" a") != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace(" a", "");
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, " a", "");
             } else if (bestMatchIntervalPattern.indexOf("a ") != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace("a ", "");
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "a ", "");
             }
-            bestMatchIntervalPattern = bestMatchIntervalPattern.replace("a", "");
+            bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "a", "");
         }
         if ( differenceInfo == 2 ) {
             if (inputSkeleton.indexOf('z') != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace('v', 'z');
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "v", "z");
             }
             if (inputSkeleton.indexOf('K') != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace('h', 'K');
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "h", "K");
             }
             if (inputSkeleton.indexOf('k') != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace('H', 'k');
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "H", "k");
             }
             if (inputSkeleton.indexOf('b') != -1) {
-                bestMatchIntervalPattern = bestMatchIntervalPattern.replace('a', 'b');
+                bestMatchIntervalPattern = findReplaceInPattern(bestMatchIntervalPattern, "a", "b");
             }
         }
         if (bestMatchIntervalPattern.indexOf('a') != -1 && bestMatchSkeletonFieldWidth['a' - PATTERN_CHAR_BASE] == 0) {
@@ -2189,6 +2197,43 @@
         }
         return adjustedPtn.toString();
     }
+    
+    /**
+     * Does the same thing as String.replace(), except that it won't perform the
+     * substitution inside quoted literal text.
+     * @param targetString The string to perform the find-replace operation on.
+     * @param strToReplace The string to search for and replace in the target string.
+     * @param strToReplaceWith The string to substitute in wherever `stringToReplace` was found.
+     */
+    private static String findReplaceInPattern(String targetString,
+                                               String strToReplace,
+                                               String strToReplaceWith) {
+        int firstQuoteIndex = targetString.indexOf("\'");
+        if (firstQuoteIndex < 0) {
+            return targetString.replace(strToReplace, strToReplaceWith);
+        } else {
+            StringBuilder result = new StringBuilder();
+            String source = targetString;
+    
+            while (firstQuoteIndex >= 0) {
+                int secondQuoteIndex = source.indexOf("\'", firstQuoteIndex + 1);
+                if (secondQuoteIndex < 0) {
+                    secondQuoteIndex = source.length() - 1;
+                }
+        
+                String unquotedText = source.substring(0, firstQuoteIndex);
+                String quotedText = source.substring(firstQuoteIndex, secondQuoteIndex + 1);
+        
+                result.append(unquotedText.replace(strToReplace, strToReplaceWith));
+                result.append(quotedText);
+        
+                source = source.substring(secondQuoteIndex + 1);
+                firstQuoteIndex = source.indexOf("\'");
+            }
+            result.append(source.replace(strToReplace, strToReplaceWith));
+            return result.toString();
+        }
+  }
 
 
     /*
diff --git a/icu4j/main/shared/data/icudata.jar b/icu4j/main/shared/data/icudata.jar
index ecbd0ea..56a5eda 100644
--- a/icu4j/main/shared/data/icudata.jar
+++ b/icu4j/main/shared/data/icudata.jar
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:d2f7f3bb8c5ba30b965dddbe2432c00b72087f9b72998b501a80108ad38d76e7
-size 13270764
+oid sha256:079654dc48a1f25b918e4408123703bf0182c3391002d0d618191f46f8b9ed78
+size 13270502
diff --git a/icu4j/main/shared/data/icutzdata.jar b/icu4j/main/shared/data/icutzdata.jar
index 46e4256..8c98da2 100644
--- a/icu4j/main/shared/data/icutzdata.jar
+++ b/icu4j/main/shared/data/icutzdata.jar
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:6ce58e5a64fd5059164b21402d00bc19d8842f429db7a518dd8933c9044ddb8e
-size 94643
+oid sha256:2307e62abb987090e8083a213b86733849261015c3ed3bc7308f8aef3ecaa1f3
+size 94647
diff --git a/icu4j/main/shared/data/testdata.jar b/icu4j/main/shared/data/testdata.jar
index 525abbe..6b3f882 100644
--- a/icu4j/main/shared/data/testdata.jar
+++ b/icu4j/main/shared/data/testdata.jar
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:b783eeb37f9f408a3698a2abd754175f0ed442bae781d01b662d61896691fd48
+oid sha256:ba1096e3fc2313d44b1aa66469702f462d4ee5624303eb0fdc3fd5ca422518bb
 size 723507
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateIntervalFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateIntervalFormatTest.java
index 2457756..8d3ad1f 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateIntervalFormatTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/DateIntervalFormatTest.java
@@ -805,6 +805,15 @@
         "hi_IN", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hB", "\\u0930\\u093E\\u0924 12\\u20131",
         "hi_IN", "CE 2010 09 27 10:00:00", "CE 2010 09 27 13:00:00", "CC", "\\u0938\\u0941\\u092C\\u0939 10 \\u2013 \\u0926\\u094B\\u092A\\u0939\\u0930 1",
         "hi_IN", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "CC", "\\u0930\\u093E\\u0924 12\\u20131",
+
+         // regression test for ICU-21342
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 10:00:00", "kk", "24\\u201310",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 11:00:00", "kk", "24\\u201311",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 12:00:00", "kk", "24\\u201312",
+         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 13:00:00", "kk", "24\\u201313",
+
+         // regression test for ICU-21343
+         "de", "CE 2010 09 27 01:00:00", "CE 2010 09 27 10:00:00", "KK", "1 \\u2013 10 Uhr AM",
         };
         expect(DATA, DATA.length);
     }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java
index 1c155cb..51a39f4 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java
@@ -215,6 +215,8 @@
         }
         boolean afterLoopResult = fv.nextPosition(cfpos);
         assertFalse(baseMessage + "after loop: " + cfpos, afterLoopResult);
+        afterLoopResult = fv.nextPosition(cfpos);
+        assertFalse(baseMessage + "after loop again: " + cfpos, afterLoopResult);
 
         // Check nextPosition constrained over each class one at a time
         for (Class<?> classConstraint : uniqueFieldClasses) {
@@ -238,6 +240,8 @@
             }
             afterLoopResult = fv.nextPosition(cfpos);
             assertFalse(baseMessage + "after loop: " + cfpos, afterLoopResult);
+            afterLoopResult = fv.nextPosition(cfpos);
+            assertFalse(baseMessage + "after loop again: " + cfpos, afterLoopResult);
         }
 
         // Check nextPosition constrained over an unrelated class
@@ -267,6 +271,8 @@
             }
             afterLoopResult = fv.nextPosition(cfpos);
             assertFalse(baseMessage + "after loop: " + cfpos, afterLoopResult);
+            afterLoopResult = fv.nextPosition(cfpos);
+            assertFalse(baseMessage + "after loop again: " + cfpos, afterLoopResult);
         }
     }
 
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
index b9c7b74..9297752 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
@@ -217,9 +217,8 @@
 
     @Test
     public void TestFormattedValue() {
-        ListFormatter fmt = ListFormatter.getInstance(ULocale.ENGLISH);
-
         {
+            ListFormatter fmt = ListFormatter.getInstance(ULocale.ENGLISH);
             String message = "Field position test 1";
             String expectedString = "hello, wonderful, and world";
             String[] inputs = {
@@ -244,6 +243,85 @@
                 expectedString,
                 expectedFieldPositions);
         }
+
+        {
+            ListFormatter fmt = ListFormatter.getInstance(ULocale.CHINESE, Type.UNITS, Width.SHORT);
+            String message = "Field position test 2 (ICU-21340)";
+            String expectedString = "aabbbbbbbccc";
+            String inputs[] = {
+                "aa",
+                "bbbbbbb",
+                "ccc"
+            };
+            FormattedList result = fmt.formatToValue(Arrays.asList(inputs));
+            Object[][] expectedFieldPositions = {
+                // field, begin index, end index
+                {ListFormatter.SpanField.LIST_SPAN, 0, 2, 0},
+                {ListFormatter.Field.ELEMENT, 0, 2},
+                {ListFormatter.SpanField.LIST_SPAN, 2, 9, 1},
+                {ListFormatter.Field.ELEMENT, 2, 9},
+                {ListFormatter.SpanField.LIST_SPAN, 9, 12, 2},
+                {ListFormatter.Field.ELEMENT, 9, 12}};
+            if (!logKnownIssue("21351", "Java still coalesces adjacent elements")) {
+                FormattedValueTest.checkFormattedValue(
+                    message,
+                    result,
+                    expectedString,
+                    expectedFieldPositions);
+            }
+        }
+    
+        {
+            ListFormatter fmt = ListFormatter.getInstance(ULocale.ENGLISH, Type.UNITS, Width.SHORT);
+            String message = "ICU-21383 Long list";
+            String expectedString = "a, b, c, d, e, f, g, h, i";
+            String inputs[] = {
+                "a",
+                "b",
+                "c",
+                "d",
+                "e",
+                "f",
+                "g",
+                "h",
+                "i",
+            };
+            FormattedList result = fmt.formatToValue(Arrays.asList(inputs));
+            Object[][] expectedFieldPositions = {
+                // field, begin index, end index
+                {ListFormatter.SpanField.LIST_SPAN, 0, 1, 0},
+                {ListFormatter.Field.ELEMENT, 0, 1},
+                {ListFormatter.Field.LITERAL, 1, 3},
+                {ListFormatter.SpanField.LIST_SPAN, 3, 4, 1},
+                {ListFormatter.Field.ELEMENT, 3, 4},
+                {ListFormatter.Field.LITERAL, 4, 6},
+                {ListFormatter.SpanField.LIST_SPAN, 6, 7, 2},
+                {ListFormatter.Field.ELEMENT, 6, 7},
+                {ListFormatter.Field.LITERAL, 7, 9},
+                {ListFormatter.SpanField.LIST_SPAN, 9, 10, 3},
+                {ListFormatter.Field.ELEMENT, 9, 10},
+                {ListFormatter.Field.LITERAL, 10, 12},
+                {ListFormatter.SpanField.LIST_SPAN, 12, 13, 4},
+                {ListFormatter.Field.ELEMENT, 12, 13},
+                {ListFormatter.Field.LITERAL, 13, 15},
+                {ListFormatter.SpanField.LIST_SPAN, 15, 16, 5},
+                {ListFormatter.Field.ELEMENT, 15, 16},
+                {ListFormatter.Field.LITERAL, 16, 18},
+                {ListFormatter.SpanField.LIST_SPAN, 18, 19, 6},
+                {ListFormatter.Field.ELEMENT, 18, 19},
+                {ListFormatter.Field.LITERAL, 19, 21},
+                {ListFormatter.SpanField.LIST_SPAN, 21, 22, 7},
+                {ListFormatter.Field.ELEMENT, 21, 22},
+                {ListFormatter.Field.LITERAL, 22, 24},
+                {ListFormatter.SpanField.LIST_SPAN, 24, 25, 8},
+                {ListFormatter.Field.ELEMENT, 24, 25},
+                };
+            FormattedValueTest.checkFormattedValue(
+                message,
+                result,
+                expectedString,
+                expectedFieldPositions);
+        }
     }
 
     @Test
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
index 1bf30a1..3e14dc0 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
@@ -756,6 +756,15 @@
                 new ULocale("de-DE"),
                 -1.24,
                 "-1 Std., 14 Min. und 24 Sek.");
+
+        assertFormatSingle(
+                "Zero out the unit field",
+                "",
+                "",
+                NumberFormatter.with().unit(MeasureUnit.KELVIN).unit(NoUnit.BASE),
+                new ULocale("en"),
+                100,
+                "100");
     }
 
     @Test
@@ -935,6 +944,7 @@
                 "2.4 m/s\u00B2");
     }
 
+    // TODO: merge these tests into NumberSkeletonTest.java instead of here:
     @Test
     public void unitSkeletons() {
         Object[][] cases = {
@@ -959,11 +969,11 @@
              "unit/meter-per-second"},
 
             {"short-form compound units stay as is", //
-             "unit/square-meter-per-square-meter",  //
+             "unit/square-meter-per-square-meter",   //
              "unit/square-meter-per-square-meter"},
 
             {"short-form compound units stay as is", //
-             "unit/joule-per-furlong",              //
+             "unit/joule-per-furlong",               //
              "unit/joule-per-furlong"},
 
             {"short-form that doesn't consist of built-in units", //
@@ -974,6 +984,22 @@
              "unit/meter-per-hectosecond",                        //
              "unit/meter-per-hectosecond"},
 
+            {"percent compound skeletons handled correctly", //
+             "unit/percent-per-meter",                       //
+             "unit/percent-per-meter"},
+
+            {"permille compound skeletons handled correctly",                //
+             "measure-unit/concentr-permille per-measure-unit/length-meter", //
+             "unit/permille-per-meter"},
+
+            {"percent simple unit is not actually considered a unit", //
+             "unit/percent",                                          //
+             "percent"},
+
+            {"permille simple unit is not actually considered a unit", //
+             "measure-unit/concentr-permille",                         //
+             "permille"},
+
             // // TODO: binary prefixes not supported yet!
             // {"Round-trip example from icu-units#35", //
             //  "unit/kibijoule-per-furlong",           //
@@ -997,6 +1023,21 @@
              "measure-unit/meter per-measure-unit/hectosecond", //
              true,                                              //
              false},
+
+            {"\"currency/EUR measure-unit/length-meter\" fails, conflicting skeleton.",
+             "currency/EUR measure-unit/length-meter", //
+             true,                                     //
+             false},
+
+            {"\"measure-unit/length-meter currency/EUR\" fails, conflicting skeleton.",
+             "measure-unit/length-meter currency/EUR", //
+             true,                                     //
+             false},
+
+            {"\"currency/EUR per-measure-unit/meter\" fails, conflicting skeleton.",
+             "currency/EUR per-measure-unit/length-meter", //
+             true,                                         //
+             false},
         };
         for (Object[] cas : failCases) {
             String msg = (String)cas[0];
@@ -1026,6 +1067,39 @@
                 }
             }
         }
+
+        assertEquals(                                //
+            ".unit(METER_PER_SECOND) normalization", //
+            "unit/meter-per-second",                 //
+            NumberFormatter.with().unit(MeasureUnit.METER_PER_SECOND).toSkeleton());
+        assertEquals(                                     //
+            ".unit(METER).perUnit(SECOND) normalization", //
+            "unit/meter-per-second",
+            NumberFormatter.with().unit(MeasureUnit.METER).perUnit(MeasureUnit.SECOND).toSkeleton());
+        assertEquals(                                                         //
+            ".unit(MeasureUnit.forIdentifier(\"hectometer\")) normalization", //
+            "unit/hectometer",
+            NumberFormatter.with().unit(MeasureUnit.forIdentifier("hectometer")).toSkeleton());
+        assertEquals(                                                         //
+            ".unit(MeasureUnit.forIdentifier(\"hectometer\")) normalization", //
+            "unit/meter-per-hectosecond",
+            NumberFormatter.with()
+                .unit(MeasureUnit.METER)
+                .perUnit(MeasureUnit.forIdentifier("hectosecond"))
+                .toSkeleton());
+
+        assertEquals(                                                //
+            ".unit(CURRENCY) produces a currency/CURRENCY skeleton", //
+            "currency/GBP",                                          //
+            NumberFormatter.with().unit(GBP).toSkeleton());
+
+        // .unit(CURRENCY).perUnit(ANYTHING) is not supported.
+        try {
+            NumberFormatter.with().unit(GBP).perUnit(MeasureUnit.METER).toSkeleton();
+            fail("should give an error, unit(currency) with perUnit() is invalid.");
+        } catch (UnsupportedOperationException e) {
+            // Pass
+        }
     }
 
     @Test
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberSkeletonTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberSkeletonTest.java
index d921c9a..bda900b 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberSkeletonTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberSkeletonTest.java
@@ -411,4 +411,37 @@
             }
         }
     }
+
+    @Test
+    public void perUnitToSkeleton() {
+        String[][] cases = {
+            {"area", "acre"},
+            {"concentr", "percent"},
+            {"concentr", "permille"},
+            {"concentr", "permillion"},
+            {"concentr", "permyriad"},
+            {"digital", "bit"},
+            {"length", "yard"},
+        };
+
+        for (String[] cas1 : cases) {
+            for (String[] cas2 : cases) {
+                String skeleton = "measure-unit/" + cas1[0] + "-" + cas1[1] + " per-measure-unit/" +
+                                  cas2[0] + "-" + cas2[1];
+
+                if (cas1[0] != cas2[0] && cas1[1] != cas2[1]) {
+                    String toSkeleton = NumberFormatter.forSkeleton(skeleton).toSkeleton();
+
+                    // Ensure both subtype are in the toSkeleton.
+                    String msg;
+                    msg = toSkeleton + " should contain '" + cas1[1] + "' when constructed from " +
+                          skeleton;
+                    assertTrue(msg, toSkeleton.indexOf(cas1[1]) >= 0);
+                    msg = toSkeleton + " should contain '" + cas2[1] + "' when constructed from " +
+                          skeleton;
+                    assertTrue(msg, toSkeleton.indexOf(cas2[1]) >= 0);
+                }
+            }
+        }
+    }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
index bfa04d6..40bcb0e 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
@@ -5212,6 +5212,9 @@
         Assert.assertEquals("ja-Latn-alalc97", canonicalTag("ja-Latn-hepburn-heploc"));
 
         Assert.assertEquals("aaa-Fooo-RU", canonicalTag("aaa-Fooo-SU"));
+
+        // ICU-21344
+        Assert.assertEquals("ku-Arab-IQ", canonicalTag("ku-Arab-NT"));
     }
 
     @Test
diff --git a/tools/cldr/cldr-to-icu/pom.xml b/tools/cldr/cldr-to-icu/pom.xml
index 90c2aa5..198095a 100644
--- a/tools/cldr/cldr-to-icu/pom.xml
+++ b/tools/cldr/cldr-to-icu/pom.xml
@@ -99,7 +99,7 @@
         <dependency>
             <groupId>org.apache.ant</groupId>
             <artifactId>ant</artifactId>
-            <version>1.10.8</version>
+            <version>1.10.9</version>
         </dependency>
 
         <!-- Testing only dependencies. -->