Bug 973694 - Fix glitchy-looking private browsing indicator on OS X when tabs in titlebar are disabled. r=MattN
authorMike Conley <mconley@mozilla.com>
Sat, 12 Apr 2014 11:10:17 -0400
changeset 178146 f6328d2f6698
parent 178145 267197d42c90
child 178147 14bcda753898
push id6278
push usermconley@mozilla.com
push dateSat, 12 Apr 2014 15:11:03 +0000
treeherderfx-team@f6328d2f6698 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersMattN
bugs973694, 989604
milestone31.0a1
Bug 973694 - Fix glitchy-looking private browsing indicator on OS X when tabs in titlebar are disabled. r=MattN This also has the benefit of fixing bug 989604.
browser/base/content/browser.css
browser/base/content/browser.js
browser/base/content/browser.xul
browser/themes/osx/browser.css
browser/themes/osx/jar.mn
browser/themes/osx/privatebrowsing-mask-short.png
browser/themes/osx/privatebrowsing-mask-short@2x.png
browser/themes/osx/privatebrowsing-mask.png
browser/themes/osx/privatebrowsing-mask@2x.png
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -221,36 +221,42 @@ toolbar[customizing] > .overflow-button 
   -moz-box-align: start;
 }
 
 #titlebar-buttonbox-container:-moz-locale-dir(rtl) {
   -moz-box-align: end;
 }
 
 /* Fullscreen and caption buttons don't move with RTL on OS X so override the automatic ordering. */
-#titlebar-fullscreen-button:-moz-locale-dir(ltr),
+#titlebar-secondary-buttonbox:-moz-locale-dir(ltr),
 #titlebar-buttonbox-container:-moz-locale-dir(rtl),
 .titlebar-placeholder[type="fullscreen-button"]:-moz-locale-dir(ltr),
 .titlebar-placeholder[type="caption-buttons"]:-moz-locale-dir(rtl) {
   -moz-box-ordinal-group: 1000;
 }
 
-#titlebar-fullscreen-button:-moz-locale-dir(rtl),
+#titlebar-secondary-buttonbox:-moz-locale-dir(rtl),
 #titlebar-buttonbox-container:-moz-locale-dir(ltr),
 .titlebar-placeholder[type="caption-buttons"]:-moz-locale-dir(ltr),
 .titlebar-placeholder[type="fullscreen-button"]:-moz-locale-dir(rtl) {
   -moz-box-ordinal-group: 0;
 }
 %else
 /* On non-OSX, these should be start-aligned */
 #titlebar-buttonbox-container {
   -moz-box-align: start;
 }
 %endif
 
+%if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
+#TabsToolbar > .private-browsing-indicator {
+  -moz-box-ordinal-group: 1000;
+}
+%endif
+
 %ifdef XP_WIN
 #main-window[sizemode="maximized"] #titlebar-buttonbox {
   -moz-appearance: -moz-window-button-box-maximized;
 }
 %endif
 
 %endif
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4476,17 +4476,17 @@ var TabsInTitlebar = {
 
       // Get the full height of the tabs toolbar:
       let tabsToolbar = $("TabsToolbar");
       let fullTabsHeight = rect(tabsToolbar).height;
       // Buttons first:
       let captionButtonsBoxWidth = rect($("titlebar-buttonbox-container")).width;
 
 #ifdef XP_MACOSX
-      let fullscreenButtonWidth = rect($("titlebar-fullscreen-button")).width;
+      let secondaryButtonsWidth = rect($("titlebar-secondary-buttonbox")).width;
       // No need to look up the menubar stuff on OS X:
       let menuHeight = 0;
       let fullMenuHeight = 0;
       // Instead, look up the titlebar padding:
       let titlebarPadding = parseInt(window.getComputedStyle(titlebar).paddingTop, 10);
 #else
       // Otherwise, get the height and margins separately for the menubar
       let menuHeight = rect(menubar).height;
@@ -4552,17 +4552,17 @@ var TabsInTitlebar = {
       }
 
       // Then we bring up the titlebar by the same amount, but we add any negative margin:
       titlebar.style.marginBottom = "-" + titlebarContentHeight + "px";
 
 
       // Finally, size the placeholders:
 #ifdef XP_MACOSX
-      this._sizePlaceholder("fullscreen-button", fullscreenButtonWidth);
+      this._sizePlaceholder("fullscreen-button", secondaryButtonsWidth);
 #endif
       this._sizePlaceholder("caption-buttons", captionButtonsBoxWidth);
 
       if (!this._draghandles) {
         this._draghandles = {};
         let tmp = {};
         Components.utils.import("resource://gre/modules/WindowDraggingUtils.jsm", tmp);
 
@@ -4619,17 +4619,18 @@ function updateTitlebarDisplay() {
     document.documentElement.removeAttribute("drawtitle");
   } else {
     // We set chromemargin-nonlwtheme to "" instead of removing it as a way of
     // making sure that LightweightThemeConsumer doesn't take it upon itself to
     // detect this value again if and when we do a lwtheme state change.
     document.documentElement.setAttribute("chromemargin-nonlwtheme", "");
     let isCustomizing = document.documentElement.hasAttribute("customizing");
     let hasLWTheme = document.documentElement.hasAttribute("lwtheme");
-    if (!hasLWTheme || isCustomizing) {
+    let isPrivate = PrivateBrowsingUtils.isWindowPrivate(window);
+    if ((!hasLWTheme || isCustomizing) && !isPrivate) {
       document.documentElement.removeAttribute("chromemargin");
     }
     document.documentElement.setAttribute("drawtitle", "true");
   }
 
 #else
 
   if (TabsInTitlebar.enabled)
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -493,17 +493,22 @@
 #endif
       <hbox id="titlebar-buttonbox">
         <toolbarbutton class="titlebar-button" id="titlebar-min" oncommand="window.minimize();"/>
         <toolbarbutton class="titlebar-button" id="titlebar-max" oncommand="onTitlebarMaxClick();"/>
         <toolbarbutton class="titlebar-button" id="titlebar-close" command="cmd_closeWindow"/>
       </hbox>
     </hbox>
 #ifdef XP_MACOSX
-    <hbox id="titlebar-fullscreen-button"/>
+    <!-- OS X does not natively support RTL for its titlebar items, so we prevent this secondary
+         buttonbox from reversing order in RTL by forcing an LTR direction. -->
+    <hbox id="titlebar-secondary-buttonbox" dir="ltr">
+      <hbox class="private-browsing-indicator"/>
+      <hbox id="titlebar-fullscreen-button"/>
+    </hbox>
 #endif
   </hbox>
 </vbox>
 #endif
 
 <deck flex="1" id="tab-view-deck">
 <vbox flex="1" id="browser-panel">
 
@@ -597,18 +602,18 @@
 
       <toolbarbutton id="tabs-closebutton"
                      class="close-button tabs-closebutton close-icon"
                      command="cmd_close"
                      label="&closeTab.label;"
                      cui-areatype="toolbar"
                      tooltiptext="&closeTab.label;"/>
 
-#ifdef XP_WIN
-      <hbox class="private-browsing-indicator" skipintoolbarset="true" ordinal="1000"/>
+#if !defined(MOZ_WIDGET_GTK) && !defined(MOZ_WIDGET_QT)
+      <hbox class="private-browsing-indicator" skipintoolbarset="true"/>
 #endif
 #ifdef CAN_DRAW_IN_TITLEBAR
       <hbox class="titlebar-placeholder" type="caption-buttons"
             id="titlebar-placeholder-on-TabsToolbar-for-captions-buttons" persist="width"
 #ifndef XP_MACOSX
             ordinal="1000"
 #endif
             skipintoolbarset="true"/>
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -4,17 +4,16 @@
 
 @import url("chrome://global/skin/");
 
 %include shared.inc
 %filter substitution
 %define forwardTransitionLength 150ms
 %define conditionalForwardWithUrlbar window:not([chromehidden~="toolbar"]) #urlbar-container
 %define conditionalForwardWithUrlbarWidth 30
-%define nativeTitlebarHeight 22px
 %define spaceAboveTabbar 9px
 %define toolbarButtonPressed :hover:active:not([disabled="true"]):not([cui-areatype="menu-panel"])
 %define windowButtonMarginTop 11px
 
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 @namespace html url("http://www.w3.org/1999/xhtml");
 @namespace svg url("http://www.w3.org/2000/svg");
 
@@ -54,54 +53,47 @@
  * doesn't reverse the order of the items in the titlebar in RTL mode. */
 .titlebar-placeholder[type="caption-buttons"],
 #titlebar-buttonbox {
   margin-left: 7px;
 }
 
 @media (-moz-mac-lion-theme) {
   .titlebar-placeholder[type="fullscreen-button"],
-  #titlebar-fullscreen-button {
+  #titlebar-secondary-buttonbox {
     margin-right: 7px;
-  }
-}
-
-#main-window:not(:-moz-lwtheme):not([privatebrowsingmode=temporary]) > #titlebar {
+    margin-left: 7px;
+  }
+}
+
+#main-window:not(:-moz-lwtheme) > #titlebar {
   -moz-appearance: -moz-window-titlebar;
 }
 
 #main-window:not([tabsintitlebar]) > #titlebar {
-  min-height: @nativeTitlebarHeight@;
-}
-
-/**
- * When we hide #titlebar-content, we display the native window buttons in
- * their default locations.
- */
-#main-window:not([tabsintitlebar]) > #titlebar > #titlebar-content {
-  display: none;
+  height: 22px; /* The native titlebar on OS X is 22px tall. */
 }
 
 /**
  * For tabs in titlebar on OS X, we stretch the titlebar down so that the
  * tabstrip can overlap it.
  */
 #main-window[tabsintitlebar] > #titlebar {
   min-height: calc(@tabMinHeight@ + @spaceAboveTabbar@ - @tabToolbarNavbarOverlap@);
 }
 
 /**
  * We also vertically center the window buttons.
  */
 #main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-buttonbox-container,
-#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-fullscreen-button {
+#main-window[tabsintitlebar] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
   margin-top: @windowButtonMarginTop@;
 }
 
-#main-window[tabsintitlebar][customize-entered] > #titlebar {
+#main-window[customizing] > #titlebar {
   -moz-appearance: none;
 }
 
 /** End titlebar **/
 
 #main-window[chromehidden~="toolbar"][chromehidden~="location"][chromehidden~="directories"] {
   border-top: 1px solid rgba(0,0,0,0.65);
 }
@@ -2798,18 +2790,18 @@ toolbarbutton.chevron > .toolbarbutton-m
   content: '';
   display: block;
   -moz-appearance: toolbar;
   height: @tabMinHeight@;
   margin-bottom: -@tabMinHeight@;
   visibility: hidden;
 }
 
-#main-window:not(:-moz-any([privatebrowsingmode=temporary],[customizing])) #navigator-toolbox[inFullscreen]:not(:-moz-lwtheme)::before,
-#main-window:not(:-moz-any([privatebrowsingmode=temporary],[customizing],[tabsintitlebar])) #navigator-toolbox:not(:-moz-lwtheme)::before {
+#main-window:not([customizing]) #navigator-toolbox[inFullscreen]:not(:-moz-lwtheme)::before,
+#main-window:not(:-moz-any([customizing],[tabsintitlebar])) #navigator-toolbox:not(:-moz-lwtheme)::before {
   visibility: visible;
 }
 
 #TabsToolbar {
   position: relative;
   -moz-appearance: none;
   background-repeat: repeat-x;
 }
@@ -2836,17 +2828,17 @@ toolbarbutton.chevron > .toolbarbutton-m
   bottom: @tabToolbarNavbarOverlap@;
   left: 0;
   right: 0;
   z-index: 0;
   border-bottom: 1px solid hsla(0,0%,0%,.3);
   visibility: hidden;
 }
 
-#main-window:-moz-any([privatebrowsingmode=temporary],[sizemode="fullscreen"],[customize-entered]) #TabsToolbar::after,
+#main-window:-moz-any([sizemode="fullscreen"],[customize-entered]) #TabsToolbar::after,
 #main-window:not([tabsintitlebar]) #TabsToolbar::after,
 #TabsToolbar:-moz-lwtheme::after {
   visibility: visible;
 }
 
 #tabbrowser-tabs {
   -moz-box-align: stretch;
 }
@@ -3964,21 +3956,16 @@ toolbarbutton.chevron > .toolbarbutton-m
 @media (-moz-mac-lion-theme) {
   #navigator-toolbox[inFullscreen]::before {
     /* Adjust by the full element height of #titlebar, since that element is
      * not displayed in native full-screen.
      * Also add the height of the tabs, since we're calculating the
      * total height of this pseudo-element, not just the top-padding. */
     height: calc(@tabMinHeight@ + @spaceAboveTabbar@) !important;
   }
-  #main-window[inFullscreen][privatebrowsingmode=temporary] {
-    /* Adjust by the full element height of #titlebar, since that element is
-     * not displayed in native full-screen. */
-    padding-top: @spaceAboveTabbar@;
-  }
 }
 
 #full-screen-warning-message {
   background-image: url("chrome://browser/skin/fullscreen-darknoise.png");
   color: white;
   border-radius: 4px;
   margin-top: 30px;
   padding: 30px 50px;
@@ -4298,16 +4285,17 @@ window > chatbox {
 
 %include ../shared/customizableui/customizeMode.inc.css
 
 #main-window[customizing] {
   background-color: rgb(178,178,178);
 }
 
 #main-window[tabsintitlebar][customize-entered] > #titlebar,
+#main-window[privatebrowsingmode=temporary]:not([tabsintitlebar])[customize-entered] > #titlebar,
 #main-window[customize-entered] > #tab-view-deck {
   background-image: url("chrome://browser/skin/customizableui/customizeMode-gridTexture.png"),
                     url("chrome://browser/skin/customizableui/background-noise-toolbar.png"),
                     linear-gradient(to bottom, rgb(233,233,233), rgb(178,178,178) 40px);
   background-attachment: fixed;
 }
 
 #main-window[customize-entered] #browser-bottombox,
@@ -4367,69 +4355,78 @@ window > chatbox {
   #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"],
   #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="right"] {
     list-style-image: url("chrome://browser/skin/customizableui/panelarrow-customizeTip@2x.png");
   }
 }
 
 /* End customization mode */
 
-#main-window[privatebrowsingmode=temporary] {
+.private-browsing-indicator {
   background-image: url("chrome://browser/skin/privatebrowsing-mask.png");
-  background-position: top right;
   background-repeat: no-repeat;
-  background-color: -moz-mac-chrome-active;
+  background-size: 100% auto;
+  width: 38px;
+  height: 28px;
+  /**
+   * The private browsing mask graphic has a 3px flare at the top. The distance
+   * we want between the mask and items on either side is 7px, so we use 4px,
+   * since the other 3px is accounted for by the empty space on either side.
+   */
+  margin-left: 4px;
+  margin-right: 4px;
+}
+
+#titlebar-secondary-buttonbox > .private-browsing-indicator {
+  position: relative;
+}
+
+#main-window[privatebrowsingmode=temporary]:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > .private-browsing-indicator {
+  background-image: url("chrome://browser/skin/privatebrowsing-mask-short.png");
+  height: 20px;
+}
+
+#main-window:not([privatebrowsingmode=temporary]) .private-browsing-indicator,
+#main-window[privatebrowsingmode=temporary][inFullscreen] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > .private-browsing-indicator,
+#main-window[privatebrowsingmode=temporary]:not([inFullscreen]) > #tab-view-deck > #browser-panel > #navigator-toolbox > #TabsToolbar > .private-browsing-indicator {
+  display: none;
 }
 
 @media (min-resolution: 2dppx) {
-  #main-window[privatebrowsingmode=temporary] {
+  .private-browsing-indicator {
     background-image: url("chrome://browser/skin/privatebrowsing-mask@2x.png");
-    background-size: 38px;
-  }
-}
-
-#main-window[privatebrowsingmode=temporary] {
-  background-position: top right 20px;
-}
-
-/* Note that the caption and fullscreen buttons stay in the same position for LTR and RTL but we
-   move the private browsing indicator to the left in RTL. */
-#main-window[privatebrowsingmode=temporary]:-moz-locale-dir(rtl) {
-  background-position: top left 70px;
-}
-
-#main-window[privatebrowsingmode=temporary][inFullscreen]:-moz-locale-dir(rtl) {
-  background-position: top left 10px;
-}
-
-#main-window[privatebrowsingmode=temporary][inFullscreen] .titlebar-placeholder[type="fullscreen-button"]:-moz-locale-dir(ltr) {
-  /* Override display:none for .titlebar-placeholder in fullscreen so we can have consistent
-     position and padding for the private browsing indicator. */
-  display: -moz-box;
-}
-
-#main-window[privatebrowsingmode=temporary]:-moz-window-inactive {
-  background-color: -moz-mac-chrome-inactive;
-}
-
-#main-window[privatebrowsingmode=temporary] #TabsToolbar {
-  -moz-padding-end: 46px;
+  }
+  #main-window[privatebrowsingmode=temporary]:not([tabsintitlebar]) > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > .private-browsing-indicator {
+    background-image: url("chrome://browser/skin/privatebrowsing-mask-short@2x.png");
+  }
 }
 
 @media (-moz-mac-lion-theme) {
-  #main-window[privatebrowsingmode=temporary] #TabsToolbar:-moz-locale-dir(ltr) {
-    -moz-padding-end: 36px;
-  }
-}
-
-@media not all and (-moz-mac-lion-theme) {
-  /* There is no OS fullscreen button prior to Lion so the PB indicator can move closer. */
-  #main-window[privatebrowsingmode=temporary] {
-    background-position: top right 10px;
-  }
+  #TabsToolbar > .private-browsing-indicator {
+    transform: translateY(-@spaceAboveTabbar@);
+    /* We offset by 38px for mask graphic, plus 4px to account for the
+     * margin-left, which sums to 42px.
+     */
+    margin-right: -42px;
+  }
+
+  #main-window[privatebrowsingmode=temporary] .titlebar-placeholder[type="fullscreen-button"],
+  #main-window[privatebrowsingmode=temporary] > #titlebar > #titlebar-content > #titlebar-secondary-buttonbox > #titlebar-fullscreen-button {
+    margin-left: 0px;
+  }
+
+  #main-window[privatebrowsingmode=temporary][inFullscreen] .titlebar-placeholder[type="fullscreen-button"] {
+    /* Override display:none for .titlebar-placeholder in fullscreen so we can have consistent
+       position and padding for the private browsing indicator. */
+    display: -moz-box;
+  }
+}
+
+#TabsToolbar > .private-browsing-indicator:-moz-locale-dir(rtl) {
+  -moz-box-ordinal-group: 0;
 }
 
 %include ../shared/UITour.inc.css
 
 #UITourTooltipDescription {
   font-size: 1.18rem;
   line-height: 2rem;
 }
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -81,16 +81,18 @@ browser.jar:
   skin/classic/browser/pointerLock-16.png
   skin/classic/browser/pointerLock-16@2x.png
   skin/classic/browser/pointerLock-64.png
   skin/classic/browser/pointerLock-64@2x.png
   skin/classic/browser/Privacy-16.png
   skin/classic/browser/Privacy-48.png
   skin/classic/browser/privatebrowsing-mask.png
   skin/classic/browser/privatebrowsing-mask@2x.png
+  skin/classic/browser/privatebrowsing-mask-short.png
+  skin/classic/browser/privatebrowsing-mask-short@2x.png
   skin/classic/browser/reload-stop-go.png
   skin/classic/browser/reload-stop-go@2x.png
   skin/classic/browser/searchbar-dropmarker.png
   skin/classic/browser/searchbar-dropmarker@2x.png
   skin/classic/browser/searchbar.css
   skin/classic/browser/Search.png
   skin/classic/browser/Search@2x.png
   skin/classic/browser/Secure-Glyph.png
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..92f60e29f9fd71ed62101b7f7f22ea37423387a0
GIT binary patch
literal 1074
zc$@(;1kL-2P)<h;3K|Lk000e1NJLTq001Tc000yS1^@s6;g3%U000B|Nkl<Zc-qB}
z-%pcw7{xVNvLAoIl4%444X~-(j2g@wIAl{|7I(FnESb1nnPFTI#snP{iYY%Tr4)+3
zv;u9BQY}zdX$!=}mSPLCAVtJ>RX~^&5MjMEIr~0u;<9Y-7q12vAKq`z^E~GqHq3?R
zv&}MRd(&~pOIy}39Nz`j1zXlV=#O{5q%MDiBH0@Nyv<0_pYAjZ2VJln9$FWKG$)#K
zY)0xrov0Y`Mrdd{Q+=QV<}du~0%eB=r;bn;>h!AEMn;TszXjJa?n+`h<b@&K&G3j{
z-N8OIq;^C5=`A#-^@_UjP(SIU(Tv`I-?Xr=iOqTbluaF|%fE|ls@T^C<7fSn2&p}=
z7y3|>ZbidaHr!Hp5pvI9{^2s*x)Ic-b&CIWk7^KeV@u-9&UUoNx}eUm!cja(9$bIQ
zrVf(D6nk3Hoa&ZDonphda|#QOqF8wNC*}exc=p>1%-&nV+~_jAEdktN1tWoF%nmQn
zjCRD`g^4J}U6bU&^`~rZv5UJ6(0_7UlBzux^f!%S+PjG9fkiyMyND;A2z^Cu#{Zn4
zx2R3B*^KWw?TT7|^C)?6{VAJUtn|ZX2r0diRPHvTx7LsF?Fe+)o%ngL8o9~UD9gNp
z`yFBY-t$c4erFhpV|tu@zZ&QEso8Fac+*!mL>^p!%H|d;-l>CjuS1f`kIcA!p$`-G
z8MstFl%zJ|mmLD~l53#(_8P`*Perufw<9;HTAaxa2<TQ0&<(roB@eDYWpj&NNEV>^
z*e*%suIs2gYCzz|B*qv)=PUwUPcUo_V#E^0Nb6&am>y%)%Cz>NI19OEF=m|-Z>o;A
zkO$YFvbn_y617n6>XJmc(~82x%jhb(gCTtozAF>(H$K9kj={cuLLiu~6MxeVn+I`I
z?x9=q;QCWGw^;r*4U`{PIov>5k`ehk)Nm+#@M<2wqYA)N6Tm?I1GMIJqb<(`Z=I;a
z&7d7;xu0(6mOQxrl+7)cyR{Y-Nfs{UNo^?Fu18Ly5_KoqVJq_BrpyER5do)T%aI+c
zK=s!~*h{_QtUk-ab}!Kl-LC3Q+5BR$Dk!$Mt;)r1CKSi(@l#wa&csyU$CxUd+gcA<
z!d0eUMSh%ybdkI`HSN;PYkeu3TkOo1O2`uoC`&M{2HP>BB)$c*_$HB3_AX-@@k%dd
z(3^H&?`HsIOBEwFor;x5&&LRm#kHU$&afs>7G<7_kw>Wmb@@-R!puvKAKp_Se{&rQ
zwlpv<|IajtS(I7yWzDa=VsE{eU-`V?aFy%i=ECU7ch6%jpe)K<imYS+cvGqv@eU)M
s@eSj|8bMj<l>N^x^oPgBwSbrZ7l%*`5<vo2aR2}S07*qoM6N<$f`P3K_W%F@
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ec1cf7452ef6e0251dad9113e8119793bfed4b6f
GIT binary patch
literal 2639
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
index 92f60e29f9fd71ed62101b7f7f22ea37423387a0..586d3d9f0a4bda4175ea75f7c3725fa607875e7c
GIT binary patch
literal 918
zc$@*218Mw;P)<h;3K|Lk000e1NJLTq001Tc000~a1^@s64cyIT000ABNkl<Zc-qC0
zSx8i27={yqmisOmOszC6TSP2dtVGL<=r)X~teYYdLdr^W&D^rdG|^GZIcYAVGc{Az
zsA#K}Xci_ep;H>Bspz;nD!iTVgo5dRtc&IhJTUY9|NlJ?%p&^ahZn1qKKd!0Z!Pqv
z>m@<w`vLcTo=;JW5Cvcv&-VL%kMq;rOHgp2MiSEZ7K8KGWm5|^O~);6t@(a1X}4Cg
zFmkt4w|i3yHBE<E@K`16QbXlcEeYhN25R{;OeWu1fV}-xl0a^1m^bX!b`^3x-%A3y
znPE3w^YGB4QWD6`42#{Gi!ArIl0a@|Sd2>!xIM2Wf!xfnXy<HXy1iubCaMV!z28E8
zv<fw;2J|!zVyxeUMokB@Jb8ipD|}LZ!${9Ko$+^Cq4udl&Y=oa#(xprO>Smbq|*ar
z>?mW>S=Wcj(W!Z9(RZRr*TFicx1zhr%?yj!tVEh?DU+u1c1-XR!ZbXIk-l;IJ};yF
zrdhw6`L|-b$;}K4+jtKtE_x<)x>ii^K}As&h~C8^*f9;MM>ObdHPT$5*I-1(aV>&3
zrXkvmL(z>2VP0Qk5Zz5~W?0CEbR;_$F{#M-4Aamg8lJU*J5(mjZaZn9zWjpb0@{$*
zkUOb`v&@5~sMmg_IlUF#O>Smbkb?q=PEVL9kLxi$I5C5<eHh(M0~q)*GBX?cIf|a<
z0Xmy?mph>s-A!(0Sm3%8By7?$iFM3J-Ln>q4NUwK^(6*+E4rK9%&;rA$&fof5+!Qe
z1GIhU#F)`Ei|WD#eAG72nYVxJ!i{a*f_ur$3=3G3g!uJ^qQp6<5VBc;=kb*=yzdZD
zp5gxrTLn)lG{NO)tL+lz#qxIu*`lB~3+^R1Gwh;GBI4{-3leLehv2p82w0sc5MigB
zISaMDhfBZbbcgQ#)lPD=!>kh!W0xlh<YtEXTgwq;n<EM2W`<o@bqkSevL%7s%rHM$
z9KvllMA&4R6>^@J#m)_*4-L;+T^|m#R3Ow!i7+e9ERc(w<faB{nG+V|E!Ur08I1th
zU0k(H;Yt0^qzEo@h9182lohtr*fY5Qs#ko8uPkWz)QW2`2jn7WfA`=%086N4zPRN)
s9z4f*PMQgFd60Wf5F^sU9I*Vq074^n>aAz0_y7O^07*qoM6N<$g0gqB7ytkO
index ec1cf7452ef6e0251dad9113e8119793bfed4b6f..efb6d9b8070f646a39b04a40ee556386fb5291f6
GIT binary patch
literal 2199
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
Z{{a}F|3zXu!;b&}002ovPDHLkV1oNq7h3=T