| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004 Zack Rusin <zack@kde.org> | 2 * Copyright (C) 2004 Zack Rusin <zack@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. |
| 4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | 5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
| 6 * Copyright (C) 2011 Sencha, Inc. All rights reserved. | 6 * Copyright (C) 2011 Sencha, Inc. All rights reserved. |
| 7 * Copyright (C) 2015 Google Inc. All rights reserved. | 7 * Copyright (C) 2015 Google Inc. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Lesser General Public | 10 * modify it under the terms of the GNU Lesser General Public |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | 140 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; |
| 141 list->append(cssValuePool().createValue(xRepeat)); | 141 list->append(cssValuePool().createValue(xRepeat)); |
| 142 list->append(cssValuePool().createValue(yRepeat)); | 142 list->append(cssValuePool().createValue(yRepeat)); |
| 143 return list.release(); | 143 return list.release(); |
| 144 } | 144 } |
| 145 | 145 |
| 146 static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSourceType(EMaskSourceType t
ype) | 146 static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSourceType(EMaskSourceType t
ype) |
| 147 { | 147 { |
| 148 switch (type) { | 148 switch (type) { |
| 149 case MaskAlpha: | 149 case MaskAlpha: |
| 150 return cssValuePool().createValue(CSSValueAlpha); | 150 return cssValuePool().createIdentifierValue(CSSValueAlpha); |
| 151 case MaskLuminance: | 151 case MaskLuminance: |
| 152 return cssValuePool().createValue(CSSValueLuminance); | 152 return cssValuePool().createIdentifierValue(CSSValueLuminance); |
| 153 } | 153 } |
| 154 | 154 |
| 155 ASSERT_NOT_REACHED(); | 155 ASSERT_NOT_REACHED(); |
| 156 | 156 |
| 157 return nullptr; | 157 return nullptr; |
| 158 } | 158 } |
| 159 | 159 |
| 160 static PassRefPtrWillBeRawPtr<CSSValue> valueForPositionOffset(const ComputedSty
le& style, CSSPropertyID propertyID, const LayoutObject* layoutObject) | 160 static PassRefPtrWillBeRawPtr<CSSValue> valueForPositionOffset(const ComputedSty
le& style, CSSPropertyID propertyID, const LayoutObject* layoutObject) |
| 161 { | 161 { |
| 162 Length offset; | 162 Length offset; |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 if (position != ItemPositionAuto) | 387 if (position != ItemPositionAuto) |
| 388 return position; | 388 return position; |
| 389 | 389 |
| 390 return isFlexOrGrid(element) ? ItemPositionStretch : ItemPositionStart; | 390 return isFlexOrGrid(element) ? ItemPositionStretch : ItemPositionStart; |
| 391 } | 391 } |
| 392 | 392 |
| 393 static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlig
nment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositi
onType positionType) | 393 static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlig
nment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositi
onType positionType) |
| 394 { | 394 { |
| 395 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated
(); | 395 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated
(); |
| 396 if (positionType == LegacyPosition) | 396 if (positionType == LegacyPosition) |
| 397 result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy)); | 397 result->append(CSSPrimitiveValue::create(CSSValueLegacy)); |
| 398 result->append(CSSPrimitiveValue::create(itemPosition)); | 398 result->append(CSSPrimitiveValue::create(itemPosition)); |
| 399 if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlign
mentDefault) | 399 if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlign
mentDefault) |
| 400 result->append(CSSPrimitiveValue::create(overflowAlignment)); | 400 result->append(CSSPrimitiveValue::create(overflowAlignment)); |
| 401 ASSERT(result->length() <= 2); | 401 ASSERT(result->length() <= 2); |
| 402 return result.release(); | 402 return result.release(); |
| 403 } | 403 } |
| 404 | 404 |
| 405 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForGridShorthand(const StylePr
opertyShorthand& shorthand, const ComputedStyle& style, const LayoutObject* layo
utObject, Node* styledNode, bool allowVisitedStyle) | 405 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForGridShorthand(const StylePr
opertyShorthand& shorthand, const ComputedStyle& style, const LayoutObject* layo
utObject, Node* styledNode, bool allowVisitedStyle) |
| 406 { | 406 { |
| 407 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated()
; | 407 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated()
; |
| (...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1169 case GO_270DEG: | 1169 case GO_270DEG: |
| 1170 return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG); | 1170 return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG); |
| 1171 default: | 1171 default: |
| 1172 return nullptr; | 1172 return nullptr; |
| 1173 } | 1173 } |
| 1174 } | 1174 } |
| 1175 | 1175 |
| 1176 static PassRefPtrWillBeRawPtr<CSSValue> strokeDashArrayToCSSValueList(const SVGD
ashArray& dashes, const ComputedStyle& style) | 1176 static PassRefPtrWillBeRawPtr<CSSValue> strokeDashArrayToCSSValueList(const SVGD
ashArray& dashes, const ComputedStyle& style) |
| 1177 { | 1177 { |
| 1178 if (dashes.isEmpty()) | 1178 if (dashes.isEmpty()) |
| 1179 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 1179 return CSSPrimitiveValue::create(CSSValueNone); |
| 1180 | 1180 |
| 1181 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | 1181 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; |
| 1182 for (const Length& dashLength : dashes.vector()) | 1182 for (const Length& dashLength : dashes.vector()) |
| 1183 list->append(zoomAdjustedPixelValueForLength(dashLength, style)); | 1183 list->append(zoomAdjustedPixelValueForLength(dashLength, style)); |
| 1184 | 1184 |
| 1185 return list.release(); | 1185 return list.release(); |
| 1186 } | 1186 } |
| 1187 | 1187 |
| 1188 static PassRefPtrWillBeRawPtr<CSSValue> paintOrderToCSSValueList(EPaintOrder pai
ntorder) | 1188 static PassRefPtrWillBeRawPtr<CSSValue> paintOrderToCSSValueList(EPaintOrder pai
ntorder) |
| 1189 { | 1189 { |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 return cssValuePool().createIdentifierValue(CSSValueNone); | 1747 return cssValuePool().createIdentifierValue(CSSValueNone); |
| 1748 return cssValuePool().createValue(style.highlight(), CSSPrimitiveValue::
CSS_STRING); | 1748 return cssValuePool().createValue(style.highlight(), CSSPrimitiveValue::
CSS_STRING); |
| 1749 case CSSPropertyWebkitHyphenateCharacter: | 1749 case CSSPropertyWebkitHyphenateCharacter: |
| 1750 if (style.hyphenationString().isNull()) | 1750 if (style.hyphenationString().isNull()) |
| 1751 return cssValuePool().createIdentifierValue(CSSValueAuto); | 1751 return cssValuePool().createIdentifierValue(CSSValueAuto); |
| 1752 return cssValuePool().createValue(style.hyphenationString(), CSSPrimitiv
eValue::CSS_STRING); | 1752 return cssValuePool().createValue(style.hyphenationString(), CSSPrimitiv
eValue::CSS_STRING); |
| 1753 case CSSPropertyImageRendering: | 1753 case CSSPropertyImageRendering: |
| 1754 return CSSPrimitiveValue::create(style.imageRendering()); | 1754 return CSSPrimitiveValue::create(style.imageRendering()); |
| 1755 case CSSPropertyImageOrientation: | 1755 case CSSPropertyImageOrientation: |
| 1756 if (style.respectImageOrientation() == RespectImageOrientation) | 1756 if (style.respectImageOrientation() == RespectImageOrientation) |
| 1757 return cssValuePool().createValue(CSSValueFromImage); | 1757 return cssValuePool().createIdentifierValue(CSSValueFromImage); |
| 1758 return cssValuePool().createValue(0, CSSPrimitiveValue::CSS_DEG); | 1758 return cssValuePool().createValue(0, CSSPrimitiveValue::CSS_DEG); |
| 1759 case CSSPropertyIsolation: | 1759 case CSSPropertyIsolation: |
| 1760 return cssValuePool().createValue(style.isolation()); | 1760 return cssValuePool().createValue(style.isolation()); |
| 1761 case CSSPropertyJustifyItems: | 1761 case CSSPropertyJustifyItems: |
| 1762 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifyItemsPosition(), styledNode), style.justifyItemsOverflowAlignment(),
style.justifyItemsPositionType()); | 1762 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifyItemsPosition(), styledNode), style.justifyItemsOverflowAlignment(),
style.justifyItemsPositionType()); |
| 1763 case CSSPropertyJustifySelf: | 1763 case CSSPropertyJustifySelf: |
| 1764 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifySelfPosition(), styledNode->parentNode()), style.justifySelfOverflowA
lignment(), NonLegacyPosition); | 1764 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifySelfPosition(), styledNode->parentNode()), style.justifySelfOverflowA
lignment(), NonLegacyPosition); |
| 1765 case CSSPropertyLeft: | 1765 case CSSPropertyLeft: |
| 1766 return valueForPositionOffset(style, CSSPropertyLeft, layoutObject); | 1766 return valueForPositionOffset(style, CSSPropertyLeft, layoutObject); |
| 1767 case CSSPropertyLetterSpacing: | 1767 case CSSPropertyLetterSpacing: |
| (...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2555 return CSSPrimitiveValue::create(svgStyle.alignmentBaseline()); | 2555 return CSSPrimitiveValue::create(svgStyle.alignmentBaseline()); |
| 2556 case CSSPropertyDominantBaseline: | 2556 case CSSPropertyDominantBaseline: |
| 2557 return CSSPrimitiveValue::create(svgStyle.dominantBaseline()); | 2557 return CSSPrimitiveValue::create(svgStyle.dominantBaseline()); |
| 2558 case CSSPropertyTextAnchor: | 2558 case CSSPropertyTextAnchor: |
| 2559 return CSSPrimitiveValue::create(svgStyle.textAnchor()); | 2559 return CSSPrimitiveValue::create(svgStyle.textAnchor()); |
| 2560 case CSSPropertyWritingMode: | 2560 case CSSPropertyWritingMode: |
| 2561 return CSSPrimitiveValue::create(svgStyle.writingMode()); | 2561 return CSSPrimitiveValue::create(svgStyle.writingMode()); |
| 2562 case CSSPropertyClipPath: | 2562 case CSSPropertyClipPath: |
| 2563 if (!svgStyle.clipperResource().isEmpty()) | 2563 if (!svgStyle.clipperResource().isEmpty()) |
| 2564 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.clipperResource()), CSSPrimitiveValue::CSS_URI); | 2564 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.clipperResource()), CSSPrimitiveValue::CSS_URI); |
| 2565 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2565 return CSSPrimitiveValue::create(CSSValueNone); |
| 2566 case CSSPropertyMask: | 2566 case CSSPropertyMask: |
| 2567 if (!svgStyle.maskerResource().isEmpty()) | 2567 if (!svgStyle.maskerResource().isEmpty()) |
| 2568 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.maskerResource()), CSSPrimitiveValue::CSS_URI); | 2568 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.maskerResource()), CSSPrimitiveValue::CSS_URI); |
| 2569 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2569 return CSSPrimitiveValue::create(CSSValueNone); |
| 2570 case CSSPropertyFilter: | 2570 case CSSPropertyFilter: |
| 2571 if (!svgStyle.filterResource().isEmpty()) | 2571 if (!svgStyle.filterResource().isEmpty()) |
| 2572 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.filterResource()), CSSPrimitiveValue::CSS_URI); | 2572 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.filterResource()), CSSPrimitiveValue::CSS_URI); |
| 2573 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2573 return CSSPrimitiveValue::create(CSSValueNone); |
| 2574 case CSSPropertyFloodColor: | 2574 case CSSPropertyFloodColor: |
| 2575 return currentColorOrValidColor(style, svgStyle.floodColor()); | 2575 return currentColorOrValidColor(style, svgStyle.floodColor()); |
| 2576 case CSSPropertyLightingColor: | 2576 case CSSPropertyLightingColor: |
| 2577 return currentColorOrValidColor(style, svgStyle.lightingColor()); | 2577 return currentColorOrValidColor(style, svgStyle.lightingColor()); |
| 2578 case CSSPropertyStopColor: | 2578 case CSSPropertyStopColor: |
| 2579 return currentColorOrValidColor(style, svgStyle.stopColor()); | 2579 return currentColorOrValidColor(style, svgStyle.stopColor()); |
| 2580 case CSSPropertyFill: | 2580 case CSSPropertyFill: |
| 2581 return adjustSVGPaintForCurrentColor(svgStyle.fillPaintType(), svgStyle.
fillPaintUri(), svgStyle.fillPaintColor(), style.color()); | 2581 return adjustSVGPaintForCurrentColor(svgStyle.fillPaintType(), svgStyle.
fillPaintUri(), svgStyle.fillPaintColor(), style.color()); |
| 2582 case CSSPropertyMarkerEnd: | 2582 case CSSPropertyMarkerEnd: |
| 2583 if (!svgStyle.markerEndResource().isEmpty()) | 2583 if (!svgStyle.markerEndResource().isEmpty()) |
| 2584 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerEndResource()), CSSPrimitiveValue::CSS_URI); | 2584 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerEndResource()), CSSPrimitiveValue::CSS_URI); |
| 2585 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2585 return CSSPrimitiveValue::create(CSSValueNone); |
| 2586 case CSSPropertyMarkerMid: | 2586 case CSSPropertyMarkerMid: |
| 2587 if (!svgStyle.markerMidResource().isEmpty()) | 2587 if (!svgStyle.markerMidResource().isEmpty()) |
| 2588 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerMidResource()), CSSPrimitiveValue::CSS_URI); | 2588 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerMidResource()), CSSPrimitiveValue::CSS_URI); |
| 2589 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2589 return CSSPrimitiveValue::create(CSSValueNone); |
| 2590 case CSSPropertyMarkerStart: | 2590 case CSSPropertyMarkerStart: |
| 2591 if (!svgStyle.markerStartResource().isEmpty()) | 2591 if (!svgStyle.markerStartResource().isEmpty()) |
| 2592 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerStartResource()), CSSPrimitiveValue::CSS_URI); | 2592 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerStartResource()), CSSPrimitiveValue::CSS_URI); |
| 2593 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | 2593 return CSSPrimitiveValue::create(CSSValueNone); |
| 2594 case CSSPropertyStroke: | 2594 case CSSPropertyStroke: |
| 2595 return adjustSVGPaintForCurrentColor(svgStyle.strokePaintType(), svgStyl
e.strokePaintUri(), svgStyle.strokePaintColor(), style.color()); | 2595 return adjustSVGPaintForCurrentColor(svgStyle.strokePaintType(), svgStyl
e.strokePaintUri(), svgStyle.strokePaintColor(), style.color()); |
| 2596 case CSSPropertyStrokeDasharray: | 2596 case CSSPropertyStrokeDasharray: |
| 2597 return strokeDashArrayToCSSValueList(*svgStyle.strokeDashArray(), style)
; | 2597 return strokeDashArrayToCSSValueList(*svgStyle.strokeDashArray(), style)
; |
| 2598 case CSSPropertyStrokeDashoffset: | 2598 case CSSPropertyStrokeDashoffset: |
| 2599 return zoomAdjustedPixelValueForLength(svgStyle.strokeDashOffset(), styl
e); | 2599 return zoomAdjustedPixelValueForLength(svgStyle.strokeDashOffset(), styl
e); |
| 2600 case CSSPropertyStrokeWidth: | 2600 case CSSPropertyStrokeWidth: |
| 2601 return pixelValueForUnzoomedLength(svgStyle.strokeWidth(), style); | 2601 return pixelValueForUnzoomedLength(svgStyle.strokeWidth(), style); |
| 2602 case CSSPropertyBaselineShift: { | 2602 case CSSPropertyBaselineShift: { |
| 2603 switch (svgStyle.baselineShift()) { | 2603 switch (svgStyle.baselineShift()) { |
| 2604 case BS_SUPER: | 2604 case BS_SUPER: |
| 2605 return CSSPrimitiveValue::createIdentifier(CSSValueSuper); | 2605 return CSSPrimitiveValue::create(CSSValueSuper); |
| 2606 case BS_SUB: | 2606 case BS_SUB: |
| 2607 return CSSPrimitiveValue::createIdentifier(CSSValueSub); | 2607 return CSSPrimitiveValue::create(CSSValueSub); |
| 2608 case BS_LENGTH: | 2608 case BS_LENGTH: |
| 2609 return zoomAdjustedPixelValueForLength(svgStyle.baselineShiftValue()
, style); | 2609 return zoomAdjustedPixelValueForLength(svgStyle.baselineShiftValue()
, style); |
| 2610 } | 2610 } |
| 2611 ASSERT_NOT_REACHED(); | 2611 ASSERT_NOT_REACHED(); |
| 2612 return nullptr; | 2612 return nullptr; |
| 2613 } | 2613 } |
| 2614 case CSSPropertyBufferedRendering: | 2614 case CSSPropertyBufferedRendering: |
| 2615 return CSSPrimitiveValue::create(svgStyle.bufferedRendering()); | 2615 return CSSPrimitiveValue::create(svgStyle.bufferedRendering()); |
| 2616 case CSSPropertyGlyphOrientationHorizontal: | 2616 case CSSPropertyGlyphOrientationHorizontal: |
| 2617 return glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationHori
zontal()); | 2617 return glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationHori
zontal()); |
| 2618 case CSSPropertyGlyphOrientationVertical: { | 2618 case CSSPropertyGlyphOrientationVertical: { |
| 2619 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> value = glyphOrientationToCSSP
rimitiveValue(svgStyle.glyphOrientationVertical())) | 2619 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> value = glyphOrientationToCSSP
rimitiveValue(svgStyle.glyphOrientationVertical())) |
| 2620 return value.release(); | 2620 return value.release(); |
| 2621 if (svgStyle.glyphOrientationVertical() == GO_AUTO) | 2621 if (svgStyle.glyphOrientationVertical() == GO_AUTO) |
| 2622 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); | 2622 return CSSPrimitiveValue::create(CSSValueAuto); |
| 2623 return nullptr; | 2623 return nullptr; |
| 2624 } | 2624 } |
| 2625 case CSSPropertyPaintOrder: | 2625 case CSSPropertyPaintOrder: |
| 2626 return paintOrderToCSSValueList(svgStyle.paintOrder()); | 2626 return paintOrderToCSSValueList(svgStyle.paintOrder()); |
| 2627 case CSSPropertyVectorEffect: | 2627 case CSSPropertyVectorEffect: |
| 2628 return CSSPrimitiveValue::create(svgStyle.vectorEffect()); | 2628 return CSSPrimitiveValue::create(svgStyle.vectorEffect()); |
| 2629 case CSSPropertyMaskType: | 2629 case CSSPropertyMaskType: |
| 2630 return CSSPrimitiveValue::create(svgStyle.maskType()); | 2630 return CSSPrimitiveValue::create(svgStyle.maskType()); |
| 2631 case CSSPropertyMarker: | 2631 case CSSPropertyMarker: |
| 2632 case CSSPropertyEnableBackground: | 2632 case CSSPropertyEnableBackground: |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2709 case CSSPropertyAll: | 2709 case CSSPropertyAll: |
| 2710 return nullptr; | 2710 return nullptr; |
| 2711 default: | 2711 default: |
| 2712 break; | 2712 break; |
| 2713 } | 2713 } |
| 2714 ASSERT_NOT_REACHED(); | 2714 ASSERT_NOT_REACHED(); |
| 2715 return nullptr; | 2715 return nullptr; |
| 2716 } | 2716 } |
| 2717 | 2717 |
| 2718 } | 2718 } |
| OLD | NEW |