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 178148 f6328d2f6698
parent 178147 267197d42c90
child 178149 14bcda753898
push id26578
push userryanvm@gmail.com
push dateSun, 13 Apr 2014 23:27:40 +0000
treeherdermozilla-central@989bcc65f883 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersMattN
bugs973694, 989604
milestone31.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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