From 0322aceb4a00217315726b49716f33845dc76497 Mon Sep 17 00:00:00 2001 From: Igor Drozdov Date: Tue, 10 Mar 2020 20:33:21 +0300 Subject: [PATCH 01/12] Display master(HEAD) in compare versions dropdown --- .../javascripts/diffs/components/app.vue | 8 ++++ .../diffs/components/compare_versions.vue | 10 +++++ .../components/compare_versions_dropdown.vue | 44 +++++++++++++++++-- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 3ea2a2fbaee8b1..b62fde70f546fe 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -130,6 +130,13 @@ export default { path: '', }; }, + targetHeadBranch() { + return { + branchName: this.targetBranchName, + versionIndex: -2, + path: '', + }; + }, canCurrentUserFork() { return this.currentUser.can_fork === true && this.currentUser.can_create_merge_request; }, @@ -371,6 +378,7 @@ export default { :merge-request-diffs="mergeRequestDiffs" :merge-request-diff="mergeRequestDiff" :target-branch="targetBranch" + :target-head-branch="targetHeadBranch" :is-limited-container="isLimitedContainer" :diff-files-length="diffFilesLength" /> diff --git a/app/assets/javascripts/diffs/components/compare_versions.vue b/app/assets/javascripts/diffs/components/compare_versions.vue index 3a2146147cc97c..ab618558bafd53 100644 --- a/app/assets/javascripts/diffs/components/compare_versions.vue +++ b/app/assets/javascripts/diffs/components/compare_versions.vue @@ -37,6 +37,11 @@ export default { required: false, default: null, }, + targetHeadBranch: { + type: Object, + required: false, + default: null, + }, isLimitedContainer: { type: Boolean, required: false, @@ -69,6 +74,9 @@ export default { baseVersionPath() { return this.mergeRequestDiff.base_version_path; }, + headVersionPath() { + return this.mergeRequestDiff.head_version_path; + }, }, created() { this.CENTERED_LIMITED_CONTAINER_CLASSES = CENTERED_LIMITED_CONTAINER_CLASSES; @@ -124,8 +132,10 @@ export default { diff --git a/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue b/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue index cc4b2dacab32ec..5c5bf99c5ed588 100644 --- a/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue +++ b/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue @@ -30,6 +30,11 @@ export default { required: false, default: null, }, + targetHeadBranch: { + type: Object, + required: false, + default: null, + }, showCommitCount: { type: Boolean, required: false, @@ -40,13 +45,25 @@ export default { required: false, default: null, }, + headVersionPath: { + type: String, + required: false, + default: null, + } }, computed: { targetVersions() { if (this.mergeRequestVersion) { return this.otherVersions; } - return [...this.otherVersions, this.targetBranch]; + + const versions = [...this.otherVersions, this.targetBranch]; + + if (this.headVersionPath) { + return [...versions, this.targetHeadBranch]; + } else { + return versions; + } }, selectedVersionName() { const selectedVersion = this.startVersion || this.targetBranch || this.mergeRequestVersion; @@ -58,6 +75,9 @@ export default { return n__(`%d commit,`, `%d commits,`, version.commits_count); }, href(version) { + if (this.isHead(version)) { + return this.headVersionPath; + } if (this.isBase(version)) { return this.baseVersionPath; } @@ -73,6 +93,9 @@ export default { if (this.targetBranch && (this.isBase(version) || !version)) { return this.targetBranch.branchName; } + if (this.targetHeadBranch && (this.isHead(version) || !version)) { + return this.targetHeadBranch.branchName; + } return sprintf(__(`version %{versionIndex}`), { versionIndex: version.version_index }); }, isActive(version) { @@ -80,6 +103,16 @@ export default { return false; } + const diffHead = parseBoolean(getParameterByName('diff_head')) + + if (this.targetHeadBranch) { + return ( + (this.isBase(version) && !this.startVersion && !diffHead) || + (this.startVersion && this.startVersion.version_index === version.version_index) || + (this.isHead(version) && diffHead) + ); + } + if (this.targetBranch) { return ( (this.isBase(version) && !this.startVersion) || @@ -95,8 +128,11 @@ export default { } return version.versionIndex === -1; }, - isHead() { - return parseBoolean(getParameterByName('diff_head')); + isHead(version) { + if (!version || !this.targetHeadBranch) { + return false; + } + return version.versionIndex === -2; }, isLatest(version) { return ( @@ -125,7 +161,7 @@ export default {
{{ versionName(version) }} - + -- GitLab From 923e1e5e798c992bc09832e13ccc71e2874af63f Mon Sep 17 00:00:00 2001 From: jboyson1 Date: Wed, 11 Mar 2020 13:20:41 -0500 Subject: [PATCH 02/12] Prettier files and fix tests Update karma Update jest Append head to versions array --- .../javascripts/diffs/components/app.vue | 6 +++-- .../components/compare_versions_dropdown.vue | 16 +++++++------ app/assets/javascripts/diffs/constants.js | 3 +++ .../id-display-master-head-in-dropdown.yml | 5 +++++ .../img/versions_compare_head.png | Bin 0 -> 30717 bytes doc/user/project/merge_requests/versions.md | 21 ++++++++++++++++++ spec/frontend/diffs/components/app_spec.js | 14 ++++++++++-- .../compare_versions_dropdown_spec.js | 15 ++++++++----- 8 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 changelogs/unreleased/id-display-master-head-in-dropdown.yml create mode 100644 doc/user/project/merge_requests/img/versions_compare_head.png diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index b62fde70f546fe..b19b6655e994c9 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -22,6 +22,8 @@ import { TREE_HIDE_STATS_WIDTH, MR_TREE_SHOW_KEY, CENTERED_LIMITED_CONTAINER_CLASSES, + DIFF_HEAD_INDEX, + DIFF_BASE_INDEX, } from '../constants'; export default { @@ -126,14 +128,14 @@ export default { targetBranch() { return { branchName: this.targetBranchName, - versionIndex: -1, + versionIndex: DIFF_HEAD_INDEX, path: '', }; }, targetHeadBranch() { return { branchName: this.targetBranchName, - versionIndex: -2, + versionIndex: DIFF_BASE_INDEX, path: '', }; }, diff --git a/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue b/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue index 5c5bf99c5ed588..deac2e46c5f9c2 100644 --- a/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue +++ b/app/assets/javascripts/diffs/components/compare_versions_dropdown.vue @@ -3,6 +3,7 @@ import Icon from '~/vue_shared/components/icon.vue'; import { n__, __, sprintf } from '~/locale'; import { getParameterByName, parseBoolean } from '~/lib/utils/common_utils'; import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue'; +import { DIFF_BASE_INDEX, DIFF_HEAD_INDEX } from '../constants'; export default { components: { @@ -49,7 +50,7 @@ export default { type: String, required: false, default: null, - } + }, }, computed: { targetVersions() { @@ -61,9 +62,8 @@ export default { if (this.headVersionPath) { return [...versions, this.targetHeadBranch]; - } else { - return versions; } + return versions; }, selectedVersionName() { const selectedVersion = this.startVersion || this.targetBranch || this.mergeRequestVersion; @@ -103,7 +103,7 @@ export default { return false; } - const diffHead = parseBoolean(getParameterByName('diff_head')) + const diffHead = parseBoolean(getParameterByName('diff_head')); if (this.targetHeadBranch) { return ( @@ -126,13 +126,13 @@ export default { if (!version || !this.targetBranch) { return false; } - return version.versionIndex === -1; + return version.versionIndex === DIFF_BASE_INDEX; }, isHead(version) { if (!version || !this.targetHeadBranch) { return false; } - return version.versionIndex === -2; + return version.versionIndex === DIFF_HEAD_INDEX; }, isLatest(version) { return ( @@ -161,7 +161,9 @@ export default {
{{ versionName(version) }} - + diff --git a/app/assets/javascripts/diffs/constants.js b/app/assets/javascripts/diffs/constants.js index 7521f3c950aa7a..9e34f4a99c3485 100644 --- a/app/assets/javascripts/diffs/constants.js +++ b/app/assets/javascripts/diffs/constants.js @@ -58,3 +58,6 @@ export const START_RENDERING_INDEX = 200; export const INLINE_DIFF_LINES_KEY = 'highlighted_diff_lines'; export const PARALLEL_DIFF_LINES_KEY = 'parallel_diff_lines'; export const DIFFS_PER_PAGE = 20; + +export const DIFF_BASE_INDEX = -1; +export const DIFF_HEAD_INDEX = -2; diff --git a/changelogs/unreleased/id-display-master-head-in-dropdown.yml b/changelogs/unreleased/id-display-master-head-in-dropdown.yml new file mode 100644 index 00000000000000..e8842c300c804e --- /dev/null +++ b/changelogs/unreleased/id-display-master-head-in-dropdown.yml @@ -0,0 +1,5 @@ +--- +title: Display master(HEAD) in compare versions dropdown +merge_request: 26918 +author: +type: fixed diff --git a/doc/user/project/merge_requests/img/versions_compare_head.png b/doc/user/project/merge_requests/img/versions_compare_head.png new file mode 100644 index 0000000000000000000000000000000000000000..353cf458243d7ca4bde51be8cb78c99aecc4aa32 GIT binary patch literal 30717 zcmeAS@N?(olHy`uVBq!ia0y~yV4BLnz;J_uje&t-7l(um0|TRbrn7T^r?ay{Kv8~L zW=<*tgT}<95c^<#S#muz;m4 zXjM~s+@^VbO%od@GBPu3oKak5&)#@=Qecj}lTJM+bMsMiHnwM-92=Kt^6=cgEg_+j zr+6gfnW4dl?FI%p)*%xjrf`%qJT{;9$Rt^rWA^cRjg4R5{r^ATR6^p0x{<-3xj+8@ ze}DA<|NpT(CjZTt4>x)-FwctT_-{U^l7WFCEH%P2&DWPfi-CcGgMqO^qNJL45ua8x7ey(0(N`6wRUPW#JNDG5ag;hmvL2hbEqC!P(PF}H9g{=}; zg;id$6-ZcLNdc^+B->Ug!Z$#{Ilm}X!Bo#g&p^qJOF==wrYI%ND#*nRs=X*B%~mO+ zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fU}C?!p|xH7LKu|hYmSQ%mn%p8~0;^d;t zf|AVqJOz-siAnjTCALaRAd3`W0OHQnicEw}dBsp~CFkergJkp#^$hgkW`m3eiCP6@ zR;1=cxMb$0<`rk==h>N=8QOr=W5^(Ev;pf3Elw?R&d<$F%`34(gfCPxvLw1ju$7Sr zD~$}zpt{gypgL{zK|V(c2}m%5MT1=2?6_?7!4U$A96K)A1+NY=FgP%Hx;TbZFus|~ zUL$h#+i`yn4uPuou2xKo6u6k0IwCfF*9&{|Hvhfd{Mh-Tr#F{BjSO^T5for??D}%A zdOc^$gg@`Ux9#>Z+dcd42G6p|#Xoecjklkf`#vYFuK3*Ea-nZ;ZcbMHo%{CI)=Mh_ zmA9|D@8!U$!Kk``WlDokhbEJC*_#RffA9Z4`LzE2m|f-X=dI3_um7{rXO@X)T=iSi z$PEdNHvj*8{`BRtzxU5iPoG|k&YzmSes7po=qeTceLog$$++lrYN~enYY%Vl%|G*Z zzcq{8QLwN_#xf|b@~LS2--EAS-PyUBN7BfpjZaoffB&CNcM1;k2CWX$T^YQ*Z~dDu zFE20kpKn+6Y-akYv*!18w%;l0&bhtKx9;at@t2pDcAuGH==^T?d%NgwUE1p=tc%_K z>(r(Vm7kx93X4|Q8jaLb zQznXPhq2@w`}Fj5E#IbRXJ^QL|X6L3UTA^Nj7LPb)8mIT^M(?dE_4M@oc=hsz zMCaN4yidMHZP>M^(#Xi@O;#(H=n}VHseMcC?XBj1I(hQs+}qF2&DEAR%bCC@Yjq;A zT~@7`oqyZ$$unna=HA}+b?WK!Oi7Y~v!_f^kvYF5^K#0mDVmI~sdcZuPjj3zT`%@l zxn4*})yo%~;Eome%reU?S8K6*|FnIzzqt-wxVa{BGfQCQDb3|Kd^tHeuf6_$J-$A2 z|5k@m)>Fo1Zz81aj?ez}^?LkiW`3K5+a7T?leNRwiMZ%IEI*R9yXrl{oeZj|Gq`MNE3+D{+oTF z6p}H(=|M!0(Wa{WUgh$dUoV$`b2k34$29wz&$`|3tX|J8_FWyne_zPjsL-I`;HAE^ z&GI(isr&u*)2r3%PrY8hKX3a^yXh^51*;l$B4Y3TNuN{L_Ez6A4yc+b#4B9IGpfl+nf60@sBr~&!5_mc=%1)ubf90 zznZ`5X}h{6^75u9F)A+{=4L2dwVDD;xQ&Yx5=wgB&i6QRvvZ5bt&QdHWp&>+m%hHX!Rf)3v->#Lhp!BBJvB{tc6NDzlJ2c#i;Ql$Y_&u3xyww3 zN0ryt#RjevW%T`jK4bQ`l|5#GYyIH`M*vfxS_22qlhU3N^DBV@O_R!2tmyfYlTn9c zhzKL&uWGrT4NKOPb1lt~Z{oYsiDm|?3q#9Qwr4c<5T{LPft((HGjDaDX6A22yu8SOka_6Wkui#rdcZx-T+k{e>gLK z+@9aDP8-C5r9u}U2iMdiC$_*6B}C4iQFQ7*ml9+zdnqI_X=y3DEn|gg1&8M!&J`=Z zs4sdA4@Hncg2DlTl7>dQ;PL|!j*O}g{2g4E+6%@ag?NKd2PkqoCT2pcg?Xi(NlWW* z=L;0CIUHdL332Q3;Rag^bHfkefWVjjF4vJFd;yCRD9Vyjq7YSP0F&2&`3+rO^-8B!NIk+FI~D+b9xtwCl;_AQk@`@cg*9{(&fufKRY`+ z_53{BNmHkadR|=d)Yrpff>G)zkF8l(RV*znv%ZR5@3M&BUG`RM)928bonqe#Kkn9# z-?!)QUGZ=G4&S}Mr}A^k*;%HW^6&2}=$`VTrn9p%XnS64=G9f9ozE7quV?NoNJ7{E6L`anZ?Zx}I$I+3u6y-rU_CE~XQauztCgPVy&_ z%*9h0gl_mNyy9YN6yk20^w{~zC9zve#O5%_d5KOr`143G7eDJ9?{k?tQv7qYG?cB4 zJMw27^z#Mf2!Ycqi}bWOE5*0AU*ev#?Sk6Y2P_|gR<#>h%&+i%7$X+Cee#}&hf72F zQ{$!-EkEqDoBPSLMbV&Uj4o54_|%OR#@$EFj$S+O5WN@?GmXv40;PeK1!pf_LP=O3 zJsez9ZRVNgZiXcl)deg`Jq=x_B&-#0$siXH%8a5@KUQ4Zau&&e4nrnZqo0*3$19G@ zmY=Zy|3`SkiHGg-djEf(uV-5J(hW(!M&k{|fG6`#B{T`STwdneEgN)82t|4UOV^#? zmr-U#Pdv6~?63a*ZfagmOv$fLe&-nM}r%}?8jvYC> z&7#0@qs@|ZELc)|-pP-TkDmrLtxiqR+*e$3R5biV?)JNCsi&uX&Ar_Ef#Xj3{n}5T zPV0OB{q^;*wt$NGp)Uv7<)_HmR*BrKd=Pu9{_of6Q}pBQJhZ*PJ&UjZ8(Oiw{QNxI z$9zZT*Z5U5uvsyoyD-AJ*6Z z_4c!TDzbad#EFTnYOjyWmd~;I`DC(_ti<|-)xY0v&y90B({KB2#+tajQ3Bf6o=#J-Sj(ZTh7eeDixwPkMAgata8QfW8I}^*W>H&Zkx}}Wpm|v zOmT0?yE~D;zQ5PMU-P+l{XOmVdoDfijox3k*XGLw=WTZ~m(NXOpZfOh?(5H%#?=|m zul+VNSGu%t&BC~??d3J^?(E!G`%`~{+q_9Bf6D&-zW@IesA+TlIIDO}!uj*n@Aszf z{A~Sjj^$(X1Ml13{`ohr{$Hhh@r{oOPEyai+hxyP=hoko@H%2w$x7YNU$4jCer3@< zJ+5ly-S>0L?`e8Z)7f}iTrVc$^WQI*{kP3Kt+)HkTf6Jq=UtBRC}|c7U^+U(VPdxz z3+JMqf^h$GTmlbVVJ+~ zXIk~{cWQZi&grhoPQypBjz46oUMw^-*^_tIYW@Yw z?{|uy9_F_%2^Br@z4*MX`uzHTJ7em8KHc`V#X+$4>gsUuJyRr_KF_OuxAF9OyWeX> zqdGQ6=kE<|)`N>$fuHoSS1gt#)_W+b645uiNxg^KfD1+S1q8 z!cP4A_xt_6v-N*IwkrtDa8$TrxAUcPRQ>O_=GA`HUtgv6FZG#eWVi6-$20S6Z(lq6 z^Ty8N<*Bugd(ETzzy1Gv|Nl+1+K)%Yzx|m!v8tU{I<3FoY<}glncsH&|MxpTUiz;% z$NqV>-)=JQ7E>tj=uYb}yTQ!(mdjnF{>w%8Z+AZJu6@+0u3~F@_x}XGs=4=#AMw98 z*suPN?`QPG^5Xx0zn|WCT<&$Z&W8^Lhk4B-@-?5o`Sbbwbbh-Z2a1*}mc%yLKbqGr z!eU=Xf5hqMv>|?!W!H z>Tc}l$=wv_LQEsiJF9P6H1`edSe+DvJmYv=9%&q;Nes+-O- zQ8&G%E!Nz8k&d$2<}+tcJ+ps4r+8COy7K8e9J#-qoSeKl?cAKq=_}7yyx0WFf@^~P zZLdzdxv#c*+Q&sHb89}GjFj2`^7!ex_2*ey-uI^!GiIkw`?x0U?X9ia-G4tU z%sqBG>vR3jr_&YtPjW1s@bX{hvFs_O-|v>+KI_JizBYFEwdqIita$rz7w?vf9ooCS zen*%qol{Nkl`=h*XPl(?`lxvPmgDCNlmF-~_n)6PJ^jp##Lu}mHXK~{`+s`N;-^ox z-7mT98|ii;N^RjcPVYKFompS2R_9~U4C(e6vp4Xz1~zQ4jpNf%R6JP4_wj{c(vKgH`=`I(|36Mb;=;b# z>e#7F zntg4{?Tp!iQ?Kn#Hh1}HUtuUUC-7p+oR6ENK1vkmbBpP0xZTbpsg!)IXXELLzXqoY z@3>iT-#c{K-~O)Le!)UB+x7n~_$yLB<~&S1cKh$M+4){^zn9!=e}PAKlnt=M6(-T%_+u(hwe-(Oi7e8SQD&F{zk z_S>Fc`&*}R#wgavL)m{z&jr1E=C?W@Hh%8s+w<*K_BV-NUtg!!$3Iha=(GEk@%m{q zcVcGGebeXb70z^6#&2D>c3r<-ee)l-kCW8Y)NbuJ+;i?(;*o!`k1X?VZd$6_zg&F1 zvRuKf(}t{4NBzZFPX*4e59j`umwk0r>T6}I3DZTtS)N^OI}6-e)bL<3)YRhs)X;qO ztqZe~&J@L40{r(Jt&htT_q;8CeyIN8J(jz58t>OQHnV+G>ol-@*dpw7Pes!?uYBf`*yrk-nZkR zGDna2nJzz5hMlLgO~u&?pQ9BWxzPfV zHFkf$1Z%&E+2>&6JzXz%^4<3fVs;kk?f&cMb?Wzd-3c6;9FCsN7V!(^IGQ?>4xRZU zd*SK9NH4Fhx2ty)K6cx#nRWl)bM=U$XLt@AX8o&DY4G5?%l)`?@%WmJAFK`IYNWrp z83=PNuWq}p(f`qURrvaO`Y)$N=bilc{TOqyMc9nzCUd@J$bp(Q4vvB+e(Qw?RPzPu z$EmIVxxaL|0^5g>l|e`Ex%gO|*`0mgC~0NL%Al}0mLDGo-Q6YKBKXet!u~zc%WV#+ zte>s&Gjp=>C*@^(%$=sa6rVM7=F3g4Z>85OG)=PW{__6Fz54%uW4`X5ZSpt7@Yl+R zj7JjOY%9WE>L2HoIIk=JOXE^_zoXE(nAp6#wZ+ZL?<@UP&c3oDak`~`<=e|s%kLMM zKg`yC@o~>X&!;zhGHyQ?RMY=!@iIL9&}}>Y<-(WWT&~oP-8-?S+Lhz!qPGi6a!>A>-?%>E{|Mv1Ro zmP#8OV@}?jc6N>UEW26fR?Ob7|Ldw-R%@xBa_;nJ;I5C$WCx!vum8+n_)q>^?w&pO zg7Mt%k{k`w58dpy|Cf>PRI=;%<%3_8J51DHaBO|}_2Yid-JdFJh0m2IhS)6Sh|Wt} zm^Z2MmCFl(Dzm>2Y98LYawSB2(w=!&9a2AUK5MvWZpCE@3Fi|xvvbm?y&C@Q&x6V@+b8>3d48}< ztPnG_S+MY1rg7yz8g$ zi$TP)1v+=wn;d?ZE2h_duP8B;;}a;j$3Dv;mAh#6ZS#2^hi?B_Cb8itGf(~c4)=4? zNkWXB7CCozY|Is^-*516Vao?QxuRWb6!bdT9ymU?I@0WCA@|(jc;toWCKv2VXM@`N z3k*1A3W`Oa#VOwrpXc>Ud{_VVV$sA<#m&Y}GX-=PmwudP)OzCozwh?i8l1}uFCVIQ zwUA^y5@P0K?riVyEBonniP*jb*MPgF*JHyx1e3nsQxTl?rhRsb!Q%6BPW=2Le~(El z?Q^L6a?!n6)N;k!ie)qUTFoA+raY;xHx{~^-E%AL$lA|rg^S&0To#{_+Y&g_ZG}@S zS6P;P-%M$%zgm)_=R0a_ws$!HVldk4v*EGhjLYYHH|Q?jH@EfH@_G*8iH$E>O_N$I zy*`Fio!3v*3SXCVySIEs8Lx!F0Xgx7#b@^4OSql$OzFq@-wqD;jz^~aXLekXHn;GY z%g=`HQP3e7=9q>QVoFd4AP7#w`l_RZo48PD*3^S0*^8^k;& zNniTQgdS<{y1hvq#|qBcyU4AQF|V@`d?;~Uh}iaTH-{0@r~6LjU1B7 zTkiPYkDl>ZA?1{b?Kuu(BK@*s%X;>Etix&s!-*yYz*hU_EtwTLFv5hE2O{%{W`C{pMzHeRG&_{o=>lE*-2@ z3>+b0t$_+!4|9Xd9u{7T@p9l4k!_suDp+#O`z8Bt=yWt%{afBJJ0;HiRKh%g|GN%F z9+wvL2nZ4@lvpX=Q?O~4(1~saxt+})4?TUpeP;M<6X-b3qsb0Fou?8wnmf-X{Cu2h zomdq2S=_f!O8@w}w;`b903KTD5^vlgF!d<+&&I_I<)w?Cuhc{g&M4gDJaY8K`-=88 zZ^305Si=;DLiGiUHtm?7Xp1}?DZ<1kI<=J{vK)Cd?UA3tt3^ipFTWO1c@dEl>?pVX z+FGP;{~b}lK;d+P~~ z13K$He<-gGEQYk7{1sj;nk0C3kFBa$i)!uy-FH(9EU6SS2%Z9%HDf+cJ|xs9~F0F z11083*-YW^`d)QpQHJ}THR<}b?iMp{(EbheeKAR=JYl5 z{cp9m3prM9Sbw3nJ^8Ac7Ne@beHJd4kYnaTxqCqc8Ejz6VF}A3xqp3I7-z+Uy6do! zCWU{TFQiK!{g-(qsL{AXX+f;cqgN%F$x|IVRRmTy%O?L#S+Sz$tMQVz!AwV68iXgm zn|=6`p7`X$R}O=QHvKqRgeEm^JNojWsMqGu5HYT_yPZNBH(BOXJelp7xV!xQwVP~S z-~65W<2a9~GzKm8^4wYUbV=6LRb^Rb>ms#u4%>%nX&p{qYB{w*=ma~Xy2jlS_cg|| zBA>^eVfWEp#4^R9Q7A#nX<6#yhvJEyCqfb>?TTbq2-|6&UCA=V!H%;a&@E)y(xo@K zw{o4TX}XdGO1&D4>wH63g>1a8wJ!4A!W|CfQ9WAWfss9a%jCL*I!u{jCd^$>BK~5D z3h#s?w<<4v(_mCBXkfUm@&EO-uG7plPP!{s@VL5P28|j?G49oH=Up1Mgk_3@qQHgh zuqP8jL)^~!cxy1K3Mew_ovUi>6PT42&g8YggY!kHcF`YCO-;>xK|K{g;3Cgua>H(e z)hl|`Lf3k8YBV;fJ=k0JlH5MaDM>o{vC-vHcBQr#@I@>Veuu4NyZG1z5OJ#FFm4KAqiH_V(7&%N;EZ z>pi^|><~`)qB42j=aVN+Y{*}w@$UGVIrxEhUc|$i}kbw zr)Y<-n=;EZ+w1MEt#3O|?3SG6%&F1%$m2k#*S+Q4EAH$lOfIzXu~k!Dz|y72Xu`8- zQn>l56+G`*++#x?Ep!P8TNh)wM=S%?VLQ|XzS>P~*`pn{M&f(I7Y5iMD>#=QQWq!< z^xVO1zHt`RBcS{;#o?slf>-OG%*nP5Lh_`D1f%Fw*0wP1Fhp=ToKzI}+GwT9K38rf z$OHvD4ufC+{(iqd-M0GM3DNKv!Oef~+5h{Id~;vz?m6}Ueg>@$Tl=G7_1X|7uLJH5 zwo~myAY-u_R!pFIq4W0tW2Wgu3Vn5}`Fb_{(?Ca(n*!l3D$H8W<}R+okFPubZ#*JJm$ zTiLmHc~%^`vptsc!+i6->F4J?`U`6DhBNuUcyO?}_O<>0Kb!Msvi`5SwLM?oIPJ`a zd%=4q6+b((@#lGq$2^+x`}Qb!E%%!{YcXGJAd{EEH_jt-R@~W^JNrW*IKhgjHd?>m z6AT(1`}y^H{L@p~>$k-1n4P!lq~C*opusV#@^?DR=M;7Q`SG}aUz*=cBUicFFM*ct zc068E{rz1LXsGko*VnmLhhEPuzqhgU(Z$_wHl1cs?7Um^`K(d#GoRfy1rHn&?Inbd z?f-TwyXf7{=ePdet$MxIsPa?F>}|=%`J%;h|GeFP|BX@Uui2k9%yMo7+}e`)c)rZF zs?BLuUCzqw!kKi77)jImkH4TFWX|DL@%SZtMeh$V4u<_o!s2aL0~ z`ph%}%^BZHeH9SQ&snjIyukM2ojh*NfH4%*@;-$MUNDey#eH%)7g`etq!p zXma#itJ0j`Cn`?sZol!T!=!$;Md6~mA}^x4K1A;>Tf3g);d_T;8<#Fy_RPb})AQq6 zep#z4dh?6VS$+#G0}WO6NSS*1S-&-jm;2x9HC5|ma=&fbQPVjeR}|f~f3xB6nj3P) zX+5Ap)_+GqlPZl8Y68OZPQARm{C0Q8=YUUJPO-LiFRzzSjhQyZeZ{YMj>Ee0y)_ja z6{)E^j`g-IFV{O(66T&#eEE@tTc3=kb@@Aei(B>`(p~*?io+U#1@Gk-ov-Bo8LQ0k|IcUtc;V;g=4StIldF26c<^$E`nlNM z9O?OYcU=`fxA(=O?wokHU;dZ2Ppqt6`ToV?{%v1v|Nr@1R{QnU)i4_&zGqP%PO8uU zaqGije)}Ka&N7uM$qCN>_snK#uaxO0|4I4#|Atk4fA{uxfWLzC3%SZC6D{px_zl*{ zzKZ}&fE<^v-*eY*_UBF0bfbT5(uvt|LC-wn!hyQY{-&x6SRQpdOsv)ttb5mVWOB)T zyIP%tKR-Xe&8^ua{QCO(`G3#7w%5BCvu3V?s{Q(&CrOc8v###xayPBLv!ig*ym@-> zlxBuMz0+f4Y~0#yf82lmVrM=}msR2G^+2Q61&r$g7COaUb(sPxYHmx*nTxsTKD5je zTk1W1o1*=<-r8R;mtT84X~Kkr!@(84C%(U0z5dya_@bgsUsni-9T9en=t)+RS+R`e z(ZmBAkIQB6&F`@L=f)ZP*)L&D@N&Ovw@)07>=x5qvz+(+6aD>vlH_^rew^fI%M-DX z&t^J@!Mf~5n~o{YE0X@qwe)|o%y;%1v+~$2+RyBNd9m#_+hNogH@BNz#DAqRi_*Ls z4$uCZpZPsulEnnYDTX$i{_+2h z(U#~CKC_4ET4m5)r^~0!BV>2Qa)KvpmMjv=U&MXZf`6$vuehWghh9r+zntx!lZ?|j zrHdaf4Yq1?Sp3;)QHNm19SH&Nm@_+0JnB5W`dJ>sn|1*c{~HyrIer>E60H7sRQ&0O z!~EaB)-O`Fk7KcVrTm8@d1L&M4Z9_*-pl)c$a#Hr_4Kuu!*=|)Z;^`g zkMDNy=#iF+i_fb%_nO<>MfqOvdPA-&m3b?=?NYv|AO7$}Ag;aKpucCkUThfCN3RFn z`ujHcs{5R4&*qc!PIr;3Fi1PVUBBID?&o*A-*f#H+`H(~-@TRccQ{sGzCYo$s`Apk z%IjnQ9^7}greE4Tk7t_d{o6bJb{LrRf7&AW*viXdp5Vhq7uCBNCqRSSxBtZ4o*Pj< zFZ9TkeV?vBy7+&J!yN&Qpg_<2o@Zh^m;#G4A695;#;=dFU8sM~{C-WctA=<;%VO@w zN)nvcw`5&C^-Oh5&xFTn2ae7Ouwm*fFnFl`%U98-GDuzIaI4V6k|TodH#WR;m#N{ml>EQvSBd;5i^aTe zgdaQg{BYeMsN^(5Sz~AAoPtA~VJ6B#H=lQ^&wH`zL#^^PS#dKZ2Y>s&CAay$Ip3I7 zH>ZM6;0Z^Wi)oINq&ZJ{O-JN8#lK5KLfRHB%lznffYbKhzeGW3az4+NmN-q_wnOmFl*7W^C!SQFon^XjRgA4nv+=ref18gj(Oc#G!)|TMeSLcw zx0eIw5%xwU(WxE0<{IsGE%*FxKXA@atTABmw{Wvy_m}?q(J`mc@YwAW!TO6P?K)@o zJ11IJd>v@6D(-|polWTDPG$W^{eGV-?%rvgxrJMQ&xL7Em3kjIIqaHXD(-Pzyvt|J zZuQbn223K2trJSz?-#x6M0geb&G8*6sgS6)zvShjmM<^wnv)(QjsJ zSfus*3u@WIEEyN#vg7)LgY5nqN}ncq>utQ}X)|qleBDm->~*QP4&Eucld}MsY#U z>4G-p`Fp=klVv=6Sn;;uzi&Txe`(w7ytTK$jA=rdAxFPmx8DBW+eF!aoS*$pv?=AO z)f2bc`6ZV;ExnYdaGv~J-oN9U-JV@lCk{71t9(9p`s25jdRd2?H_j5$ILA_ON5nk8 zW@49DoeqcMp5_{Xnd{~oEr~5 zf7>blW>x6woCqm?+0U0I99Ag_wDC*;{Gc>vs7PLo9@tNs#cuk)^W;ans$Ric9GW&?{=9ps^w{*! z-I(wWgAWETo%TI>7}y}{ws0)`z5V#q&vnITAI)-^ z!rJJ*-+!6bqsRGMPDZQW&5F4$^?%Qr-IbbuFI(t6?<~z+_^PmShoABe!6kVjJH0RG zs|uWE*`dBz`N!Q~)+aK|H(MHHGxL{b2+ElA+yB`xm$Aw7zq2HN%b&kS<~bI38Jw?9 zoo}+e{@Ko@-0>RPMS-2^ecYV>4{h!$YYAHAJbu)DvA^S~1Cz#$gICu^hyN&O;>_2N z-gZVkXT@>tph&k56WjMxnD0DrdHM0L?+br_wA)#Ic#q!Q|F^3zf0*|5y!bn-Lldk1 z-1e``bF;Zytn-KADz7|d0 z);8JS&T>(9X5IIh^NT<$8g-BTnZl7}sw$w*@*?_7?eywIg}~1CdF(F#`UI!u-C=wz z^2umU@|3+l9(8xSgzWnJSf{HpkkiM>LE?~*;Y*(N(&|n8N&E{Iwy56o{3OWqeO`#u z0S-48@g~8IFYetsuuq`x>8Yuk=LNQ0`wyCzR8!c&;mK~?qVE57O8G>lNp@>`|_86KLu1I`mpbUrF%%Qt6y0cP(}H$hp*6wCwr#MQG9C zXrGL(#|MQyXY{RO^_l6!aZXY$@Yf7B<6FzjI}%Dtb_;1#F#YK@QZTqC|KY{-&IMoO z@5X&-DdG28P{3JWpSq^G+-v=zT*rfN)`lDmk*-|JaauZm&&9r~v?s==a~8iBXwIFp zfhW{h&ZtF1FYWsF{(Wse2i_i0c^B;>R6B)3^>Nd`_x1m?rwh)mkmua5W7=GMr(s6I z?eOlUb>&Oo4K#!+zZy!FTamWJ}Bbp!+xYr()HD$G#PHENp-zDZpX^6a(L^= zA^fbI&3exQ1BEU8{7yH0&K@yyu}-voUtJS>GvI#5spgNHT2@7aI{X~{4E5(@y!T$5 z{J~2sPVb0HF3*#-x_iQ2%$wry?f0vT>=GA);+h^DbKk(rulzbgbp6HDp6OBs3q&8j z_{CBEdBYjo*&I!?O_|z7K3_EYE0Ej9Zw~mH1 zy2u;8JDBtMa6-~{pW6{>^LYeP#H4SXX^8pNQGL99$FI-7^geyqzP+)fgtNVx_q@uX zNf#i)XdeYaCbi{O?uX)j(y~WeM2FwdQ6jR~<^7qSM z@r68j_uStXKH2)l>G8YUPrt`6w`a3wVmoK>f<1Zup9ebyjH{&0Z6?o1t}x#FSNiR- zzyB}VH(NgYq3mGu$@x(2|A+1Jw+c+{O?tX*?g~jn`c>bFsrkK{^Ji=OjL*;N1zqxA6A;m)>> zW$(@0rcB$pcdlGf?upmd%Un`798-G3boRQ0hCNe9`B$c{4JNX;IdiLd1KTbf>^>eH zKS%MvjHr$Rqemy>19n+njj7uw$--Q5>H*^ct`V{d%o|xk%vKn|_;f-3=?g zZ99GS_1|Ti?S5Vfez|nfY0zXkqpAQui$F`|-RFCbH*S|*E+*CVTdhx&P3g1S+5|T_ z^>;J8cw(E1JM=2@tW#e;YGdxsf8`d@Cuw}lYHG|~i+L~PjxVrzx4*+{&vc2vg!2Ds za~qv{tR25U2ymLSh*Mx8GaJta!6bE~lk$B>eSTQaIp#KrU9s8Vv-p&Ce11E^19rWw z2|gAdP<5GEH&|^-19!-?gzXPwdA9kp6m2ls9&h#E_%6rd$8%@TF}WUo`DyX}H|Kvh zm)vfy{hYjHb>sH`SsV6%TDOqFmNfzn$_aZkwS^u(Rp+qIpJK57poK-(oX4#n`S+Af z4KPV8*wSMh_qOYC&x<9}tnboV3M+q<1=n0W%U^uI!*_k4yw!oTif45M*X-8hJo)-6 z+r3Q(r**Gg!Bci%m#sQuozL~y^4J6B@1C5I{3*3)uDZgJy|BTa#tP*FHEZIMYZ#yH z+ncFVJ=d~AWaFL|$#YW6lo!vIQ_Nz!{wXTNraMne=2hX>jWTBv-DbVs<@Vo`?b{>H zrEzTb)n~u1FJro8*?VWZdH#;mT3UxyLwi1dyi#mnzbGMt-po)ibSliZ3%6&0C`I?(@Ig?ryuO|9Y>XED#o9G&h*BbN)a4_r>T z%=;*{q&f1VKvIb@cd8HTi(|b4ztZln(^uVm=7}knw7F3)mk7qT#)SvKl+Xcff3BUJWRJ{5-E<1dCoi?Lt zz$cCmM|>qZ{<-_icAW7%VZEVh|021KLIF&zz766V6)p(me6cNAn0)9AheiJVlMcCu zvrjy@R?sp-`~25Qk=X*PO1!&|?AT}I+$}sc!!Rzc>2ASc-ZGPNm9J0D^RFDf&+tU; zk)K1I^s=W&!-E3aEEml4rj*6ye(Jk*PJ6xg^1AiumvZ@^OMiULqB?o~?wy-I20crE z_om>Rq=x?$S5<|X{|$qt%C0Ef<%=@lTEldv`s@}b-!s~?XHLJ}dGBHS1PK(h(~87w=@3VV}Gw(ibbd4Na0zOiNh;rn}^fkqTn1Pa8{ z)7n9+nASvYcKaPYy+wHa@f9qOdKj*2u}NI+Js-RM(HnuTEjzWex<&TCi{YFi!xXb% zri(nwql5WV=uR zlb}F>cRniqtff_Ke8hX@yi<2#O1gzKc$oY`HtCn|O}ZJo zIU`MI}`(thAdD~Sh zdd`1dwl<8Z&|TreQOgV4c35xFFp~&;DS9_>P1NcjCNBjhrmEa7hH2`nyS(^$VnMw zefyQ)alT;GXgtA@@x$6EZdNo(QfFZN8p77FXf`ArJ8)_+PV}0jYI^oJm(bbmQGWz) zsB>;QIA_<}XS)s7c(^>>l6m>barycwqS|3kERNaL{yOpV`TY6G(T;0!Zf>yy39+iv}R8lYkB-IDfo zd;WYrZ@(}0--pBepYE35|9MS0(qV($uNR9q6+S*T;pnBym!CeHoj>jF?(+6CA34PWt{7f7)8W%Tq;u#%qmDu=3{B0qos z2~PEI{j_kC>y&LDC$w!^mm2(g;n|B@B>z^O{`JgvQDo|gU0jz>$EeIZ7VmaEUQ>RqQV29}k$GW3W66sPiuPBZuI4$kZPv~N z_un^^GSBGm|DyyNp9f7cY?DZe2j$U8z6^$u+Y6OfMr~fkx-siy(9I>vm%QKfC&hL< zrxafAo3tr)cFE5t(Wev3mvS{3Wc~l_v2tfdq)U##qUhIG`&RhG%{2B_jkq{l^eD&s zIl@&QZbg}zd(~qv`OX&p{%-2F{XNs9yo=l-K4(QQ_@c}E%4=!qLRtUDQ%4VPQ~DUv z#?AJz)BWSF*Xt(#e!oBd+1c6Rd4Z98DmLCJJT7}_XK^}cr6+5?3KQ4+C!11FKiTv7 z+~lvXub*BzJr2Ba>HYry_uAIX{cdDz9L&Ziqrq|E-QC@wenjH;-u8)A%lziP%0B(+ z>FM0aL&wie(~HfzefHl+k8^V@FRR{sU-ru= z?6*1h%!v~drpMRaTz7dHyL?T+oiEDV;(A-2*8O^^KD+K_>hzzlO1Q81-friY&zq^B zWm)#^xvkuE`F!24JCc9=e!oBWlI{09%K!hqua7m`?X#WryIlG?;nGKI|AMA3_N{pQ z?RLI+c>DSddZ2nCm?cOnYy#I*?bBSvzJc9#jX|EClMYzlJ6rxUE427+!glJMez|Gt`jFkrrWoGa?cgT6^wY<>pI25*Wi=Ezv&rZ8iOG4l z#7+n-I(X?s|BXALYr6vcRkod%@qf9+w&=|7<|S|XVi~*Nt(-6^c6*|9=hgX!{=4>n zZvA2~-)Q%x6wm3(MI!fOH|}|}CNMO^S)thHlGf9AY0uBj&pgL2pB}kv?#g4vJm(#3 zZp=>>HP~A+>CKwFTdDiFZ*$f6|Fm&pdDgCG^6$%K|L2j+f2HzwJY@6q^P9#lSK(lm ze@|!oy{gr3Zf!l?He2}Y$;I~1<32xe+&4Y0>SUFx{+T%ESk~V*6jIo zN_*eqygNHKp3d6;QoJi;@1IYnpDyawn>4@v-%Y(@o-N($xH@Wk_HcN%)ND>WoAT+& z$!V@xS*z|8oz^wGA6tGmwO>Bb^MIc^IVJrS?GO7lou$1N8RV!BW-}pQK#-7TF zTNm$m_u~g+_{qHDz5XkMZptOy`X>A7d3v+T;XC%LuB}&}d*1Ty_f>v!SJMBRMTMQ4 zrF^!}?oyr1^u4>kd%WC~n)3LQsL{{e^WQvklfC8ndfwgIr{?QpR44C~eADGIwW{>V zi_hmKo$0AHs(HY8yg}c&qxF?{_=!b%?x!Zk|DBYhp5}~m>-T0(! zoP>InSr|>e&Y7HA{Z?vQ%+9s9i>I8|n5=Wz|Mla~anp=)U;j88@c88I3Ci&cL|b0S zUypm@eQ0u*`&G$9ujU*3eP}%@+_U+`jqUc^$U@2#|0*Gc=yyA2(T4aeY=@{`qkCd zYYl9Fy;!{VgDU^LGoaauzXEN?H+OySH?XYHl0MJaB*a*CEiygOrO)P*$8EE|?QXqq z>~B1uSADL^!E<@PO51l)#)_|3!+-BtWLx!R!g>4uHrESpGdkfp)B~MqQ%hWXo>!dD=R0TnQMLh`Nb`r zzvc@CFd4ckoW6793fDA;$YT3hKlZ<0`{Q-ZJISEMp30Hd^$SxZo*!5vxH#qPo}bsW zE03&HKfUny_brPqrHGw7JA>bDs@z}wsj|{$r&ir8Ui!E5`0Znlw&q-3-M%JzM?{*W zV$|Nm+Lr}h@hk7GXv~S)cj=j7{QDr9N^^mne+5+~pcBIB(O;NpFTJ*{doU!YVqQ#uz<23i94p;-08h+ZtW!Pto_fwzf!W!3Y+Zr|950i z&x1L4x3}w9eAC!HPdT|k^hn(MaQg{cPKl=e5qmIh70!ClY%{Z}~~`iqAw>b8PeANo-$m@#-AsX{nu=tc)>i*{)nEOcaOm)-WD>}UoJ5F zYpi)Z_vq~t8lSD-@0sjdDfQd+NtN@9irT~zW$M!+k8$7GnCx!(^U37a33m75_N=X# zlBxaI?f190*{uf04<0W(yIFCTBdB>Ou$V>SK*;jIg!U6+%0J3-?n-TWI=iR5@bs%U zzd7ZO&-(59w6AxzO73yKm6tcQevG=dH8JbZy$Y3$d)-RjnH|zmuI;i>j#&*i#P`M0!qN*qJ-a&DdATKnqsrqG3rtHd1YyEU@-r2D)Byww5jP#+k*`dF~HmwT{zM1`F zy4mxUy@J{2IC}F}2M2GPrN>yIZ+Jv^QBiI8va-ETS8&>`&uD&mlesy!>1Y1eg}OQR z7sT3@3Qt+`@T9NV!f(F5QW1>)5i;vl|5_WLtyG(Guj+`!>17)~_EkB5%8oJ@w%NP# z827$6Cl0R>pS($WmZ{Lp>2IGD{?=ddUP*N7!!DOSr8ge7%gc$i2eBJp|aeBZJxo1Vo4bIZb@uCYo#aV1-#@GMdx>osmUnyuy4`|^@ zfj?(e{K;C$bA=%ll5+*W`Q53HU4L=M#1gB`^WWT@n&qne-AKn!^Y^a#Q)j--J(S#8 z@uYdGQR4HW-@o5pjKB1C=A8{CGyN+j@iXquxy2*)IkhE1eg5_HU#_oyq&+{*Za05w zt8aA8?TCAMhjvKJ^KF@C%(C40*B`~I5C2l9oU}WZ^0?NeAyq9+e)s9w^WQuFo0auj z^wG;?dmb&NDLx*SGOM#%G!$Qcn!WuQ$72U{WnvW^V#V(_ zL*y>aS>bH6vr;E^#`WlFnq7A?iVhvwoOX88!mM9*m*g*6TRdN}xNp+)`Stgzz6xZ- zczk%rD`j$`ib*iTZ$}XS!pfe^h8OvgUUR1F$H#rBxwL#D|L5W=+a34JcBi^1ml~-G z%6as3KcAu*TywldK+d{sjp)9XLmxLin)>I$mugiJzxn=0RGYp(>ek;j|L5oDw*{=` zMdgPxZ;$^AUj1~0yK(QcTicQzE~+s#k5Jfjb>nf4S{=^9jw0;-J6wOp*>}}zMB6*ouhPEGc6wTNwdCb(+YY*1Lc2!mkN;7Q|(4v((PES-(4a>h^oChi*2m zIe8@0EXMBPrp>7z4d*Vo`S0J1?lVP4d1o*AEZ&^Eap~ON63f5IP&0F+A>Fzt5{{LL*`i@e9UOYRMc%mGq815CApU`$9ImNhE z@Z+~Y^FzJ+8hMUXzTJAgNp$NyV;A*BC#@OO0~l?lwaj>VzvFxFU&DrD_vckUlT6&e zKe^vHf}_#3L+ZWUqwYqNb01Wc{z>e7d+1BYw)}lRkF`yE$?rAatL27rzfF>RPB4FS z$BNU^Lgl5u>Wv$gFPo{$+<)~NMywzJoPnv4RoSx(JrEO~mylvDZ4=}n*Oj;3{YyRQ!F z-Jz9RVO%tOLdD;|if;@0@}^3jY2NzwviGU*wUcCp^2=AeUH|gb=Dn5I7cWWO{^rAu z+j1w(A04+&S5;moI8D1RBYXSh?-K$~U;XaC*ZICfi%Md_5rKy(>#xq+9&yb)JL&n} zBeOj?DkGPFyQj0v{;{Ij+zojuZt~8zx(al+=en!7IzKxaoN+tLZOi3*t;^moyPkDE zJ}Lb9*LP`q+d1}6mF4U36MEV0Y0GorVa0Zn70IVJ^uA-sd!@R=%6Y*fR<{---OGFC zS)Na}y{tcZQ;Gh8*AT6>RrwKKuUe{Vw?N={H|ij?hDwI`q}Ie2h!F_juX4cDbq(eLvKA{a;wW z-=iG5I_&G$?_aKY%cXaOwU{37a!6?qIWD5}Uo<=>F>>FpSF6JW%rY;zNU*s4_w2d& z;)YhIxN##9di~oUERGtycxVUd_zSZnmUte*}Pfh!9 z!t8Uw3b9(Icl$OL98!5%^X=uO*R!cbt6xp7nynBCNZcl4t@CT2imLvRSCiSOV4jj_DFz@3n#iTud|HRnctD2nfj&%vU z(Xa4J>JtPX9dtU@cxq#A@#0@$SH9J}4z|8+uSwsSU8&Hdme7>nfBKBvOw$a zS^EPN)2@FvirD=k{$#@pkDh?vewXWudnG-6>;2sNeoHs$PkHhAy!=V4V5z66KF(9* zxy>e8*Xqplm}g-5u-0YQ>(j5kO}^`2x;t9*Tw-G6#Ew%P%Q~L4)X~wN^r1XacFsF@aJ$u?#pI7{bo%NQhwg85 zb&Ouja!5VE!tvXO+lxU9$zg{;EMR#w0d$;)P3El>$eD%Vyo2JG&yq*2d^fetvFB;N)h14%y2SHl0bi&MBR=t25Db-3}S| z2=>)8ryMva91vLffoCfl$Y=)_7JItY!#4-JtVs8DhIcQWJyX`v5twdopD&7PhnHY9HDZzI@L6 zU%ay-g=<(Qc~77ADs;7Hwo4(cfJ*%8=ib%=rdw$Ege)o%7M@-vTB(w0=!bL_RvcAEfNh+64hFT5h$W|`V zPc^Hr|E&Ghy2|OY4U3oh)M;V9v%RM)_f6TR8|ArG>*o45UsEm~byAoRx~?fDEMKC; zpYyi4=cPM^lQ!JmGi{UC+yy^3oeG__hHK*7!)K&;RkWWTus+oswvIDUdBGy1ERC&7 z;CM)2s?c=iJ+(6G>w&YEcE5>_=2h;w68+L&^+T2F=VzO=rfQwO$6UXJS=!xD?D)1 zsU=VD=w~iHeZyq7`qH9vUy}BO?Wyh&dn~-XeHqIXhd%-dw-zKE%Z|1#d-KBEEu>G{ zTyF)(+bg?b|MaqbmyLa>n{#tp=)YNJH{We2-TaJo*W;|vRT6>`&Stqc=RB{=+gsA` z=Em0GRbi`=KIh%v8GG;lJ7drLv-NmiUzyJBZ+HB~#vI3EBEg4`{Z+gC{QRV3KKrO$ zvV~jL|GQgVHhV%{WaO@_ojg+C=H9)x(U;wFpSOSf&!^d8r=~ma|2TDJ{O)-%m)_f) zyfIzz|IdsC`PFgUzoq2WB-`b*IbUYFIiz-9UGh>{rSPaubcz4{*D9I!Dm-I;^~d_Z zuUk0f)~2XQX?>^G-RijU#qPR{hV|!i&lodXYu*0;-%YdhCEr%xj#+A^Gxd^iy+y#G zf?L&Re%_Qjx5h^~r8i>!kGWHBZMZXCeRG`l$&A~l*Qw{+S2$Tei!uNAr+2q^Ja5Tf zdZq8|q{yxB8aF-mz1g#OQs}-_OTO>A!|_nJY$ngru(MMyU2gk%DW$$zs4Qp7nl4in z#oTt4{$D4qh0gi^xq6Srx%O4Z!IQ=sQcP!@CC`+-xuLi@{ror8%`&G}-(2IE93L0U z;iq7HxuZv7tCy(Ospt0p{r5?H+A6sx&~uh)PEz!)+h;<5oxUOX=~4Uo)7ta*scK(a zH%WMR>UU$8j3S@>nxFIDoW7&}+AM#vq-Abw6r5 zOjg}?kh*@_PdzyA{z6@;d-ZM`rbcadnbf{NnKk6tLfb>y?s})B@>NoW!_OHqnf}?- zc{<%=rs8_9m8RT2u9m9aX?MlK0@VJ0n|Jc_ES3KsBlY^zmkE}ftgq2KnY`cR-kDjG zBG=a4czZ5%+pB+@e!K3MD4b{WsaAQOyI0!ZYsZW;o!$Jb(a?P{~K+PBAeHzfuayf?Xbbn5G{+j}Zx_*dR{d8RW@UwYe&&JX2pCzzd$ z@@l^IHFt)TVW+#$?YaBh%a*;HV*B#trn<{)k@=sJ-~8S%E%$BFv3<3dHWz>Yds_0+ z&bxw}a!R*7@2m8$pKWlf$~Cu*cyD{Ui~qD z7HU@b(&TlcPmI~&sv_fT(}_W|!_wYoA6Gl9cDs1)2KB2|7J@UBZvQC{UUMxpL~Qlt zmF$aIra0^oDyY@`EHw3FRn5`0cPn^OS~$dg&Bhb=j!x+vlA+xmihMx?0QG z1tLcl%C1S)(%)J-_pWObCv&>0yu_MGp$ET+-`%8j{2eE+`jTAx3+#ob8QtTQV zZ*zQ+2+!6emgq}w48Ki|Ts!ZL?Ju31s`f9YDGI5MaiTd+F9Lm-SBqu%mk->GrvaN*izdr zlXoR8um0-3uyt!Bb5huLtGuy!@N}`@mz^qe=0$GqT)BMD+xAT9^dmXnP85IcWu6jv zv!*BYT1Lj6=C5bIwdA}{Nt^Q`RO|KCh4@AUAj&uPi|W;i`+zsfJ`&dpNA^M6`c zGvuxVwOACcab8&w=zMK`y!?il6$ZSpV$FPGjb4i=~T&EgoI? zwojm_+3IV{`8TYeQ<5bXZz;YmR>S>QeS6;N`uLq^{>p9K7_2tq;{Ei~z2b4n<=cwx zYTe#$^kW|XlAL?nj`DqaS?!a*^Vyu!xlD_XxBn?jkeb&#Ddw2=374n8rPBN_%>Qz} zu_|}IlkvrhUmwGx{g?5UR+qco%;HU%?|EFp@?Cz9Sh~xPd*_x%I%cxpol#I$H9xyo z{L2C7Yx5@On`Id}pW>0tV855L<>kZGS_doqCO`B4u$DdM!#3@NHUa6sr=<*M*TvLF zH%$C+P5AT_Z`B(@KI}#E%eH1;_gd`M>t(=a3qBjp;h+GAsjonF$z?7@gJwx)-MpG_ z6BABu+-$pgnIIecFWzH*hm~?X1!dVU^BTSt2>$=%IJAEuQnUBg%1!G%*-vI%4L!wE zeY)yd&V8?6JXL2oboR_x_kM}_NnPXn%9H2Z{@0fG_+Z`a36)`y!qb-TPnQU0m3{M0 z!~ci<-sh>4{`_uFn=d(uf%{i>TjJ{LvM)n!a8ZxE{k^qfr?zjO+q%gaw1Lx! z$#=FH@6K|YX$ybF231_>nD2aTVdv3ihQtqlxV$(XY<*I^p=r`CBjaMeU7jAMa*_3p zo^Fptc~vz|Cb3^&(eh5J;|+9|*f)V?X}$5xJ+?89FVA1vzwXfnx$O_%fB9dlmYTOW zdeRx~9ZiupZ@-(^v$Fp5yzu$cjke#F)rr27JKwH$*Pq|_|4+N@Z*QA$d+*DR^Za%{ z9L`xh=J7QA+ud}N-~Nw6_1TW2>tc7aofi7~_FkFW-lDYuoGl6ywkB*y>8lP(`D?FO zG;_(R-lZY$pQ|o(eXxJ)h1TL_m%=Cg)N0=Q-}=e}nXF%_e=>|;{*1TOzG|u(aDZjo zdmUZT?fDargns6#@GlJcd(Zaf=d`pX?RPU+RCT&{A6>iR$q|)V-*-+knxEhnl{6u+ z;NU5d?QcN`K;Ef%+^fi%T4`tuHT>i>;pPoi4k?9QiE2yfY_WPDAtgw%pTee)#k>tyuCXY;Dxd z?Q_>eY*cz)_bI|TV4wYu`pPGlQd9+MnO0_cPO>`gbNaA*leOBS{m&!TUHl>yV|U6# zK!2Ul$9XGv@YYxJD@mQcU;BM7XsZ3w&Gh*vJJsiD%(X6`rar&sk~#m4%;j^{4!7}w zx4kX<`u=`=-T%Mk_t$wIzg-R*Xes%0(eVF4cKI!@m;C>BJKya8p;qpoNRjm~G78cCp|L@1Jh9yinr9AK z5pb|;t7Y-CAD7DaBjE#dL`Jb_rJh8ne%tc@9TojkJ zaO3~C>8#S5>+A0wp0mGj<({9{!#|z7*-hm$wf^}aEhw|CX^*oWTzTUnhR-rZHY`O&7ZwNYUSyT02htNfp3dA8%E|JwyJ zyp_jq-MkFym<#kc+-cn}Su=TO!M-V3_l#0r+?F*^Ecmo6uCnp${7<)b>uEkPpJ#e6 zr%@qgi(1m#7mLsCi8@yG?TsdA7fh@hkJ5_|1=}(w|IJ$Wdj0-;&wc0E*YE3*wGNwC z_bby{KkDzVuWP5DQ*alN3YZt9&G2Cv-DRK5Pbo|!-K za2qe{dd>WX7Z(;bi*DD8e|u}|+7~Hu<~Ds5Ngvlesx2)$#Hk(;`1g8zeWaX>I@8QQ zFP~jal(^?}t98YZ>`n*QA4$>M^F(cCXQ?(H2r~9P@s8ndU*6A;k~_b21TW2fnd#lERCkN%#%#K>I^2JjN#>*38QUG3+01$m8k`e|KIftSzloK*Cb)aYmW2Bp zf$0@YhT=};xA)%fxK@6@HoWTVt5o)%4?=A}onU63D=;%JDPdo~#UqZ7^{Fviv#ze0 zA!AvzvD0?O{;_Ylt}e|xDrHo1FJk8Ax{W-$UbIdSFfv;={fnq~P35GlYZFsGOYIJr zwl8O6&i|+Eng4=Qj3q06M;JAzN7ZULZ#9jW<@Z{wrzbC*$xGoH=aJYS)=$5FS9!Yi zdrLu?MPk9H3Fc3m9i481cBJo=Ia%>}PuqkqQZHL-=I;EyW!Kj|`@G-R-(P*Youl}k z-S)G!?6af}aXNh3k-9#kH1%%z?y|RQo_}1_ttWKo7igOj=uBR{$Upt(uf9CJp`OuS zePPkBj7zZx>P2>OKmIxW^4Cd@39nvR7CrjS{6_t7$Ej#G``qdGXM9+?q3-$x@uv?T zubX@-&CfbLa?(?=+WRXntDQXcJMTm7Hvaz?r;FtzURKZdoNBB$;nLREtfz&JeY=y( zxp+caAZS!&N(ED)x|U_~J;D1O$L6Yk-Jm|{r^ekmQ>^`8&2ui9X7oPIHe$9-<)-yq zzpOXi+m_pLkYV4QM)767)*s%5E|Xe#Uv2J>xjVk{Wkl|&C|u|D?A+Yfx1ZT8J3EV& zUtOq5ZHwQH+6xOD!vg9)pEYM>|M5eMZ$razvHZv1@7L>}X|BBFsm^+0>1;2p#&^C} zr*^Ts-{fa5bc^}h7hCtJWp?V*ZKazop3(e%;luT%-zM)}@-BFW`#*^} za;e?lB~LeK?(^@}&ObNt-TqDGU%77nIvgJKchl>?lRw4im+tvE>zb9%k|1Txt8W+D ze9i`sur&ys@Kso@tyf-kCg0N_>EhSPI<@~)_kDYGRz+7^zPYMq>JQxu^^-2>Eljg1 zHBLXbrMdjirq;cu6eL~ZzP`Hpwqe?*r>Af4ntObLqu!VFlrLYF&#%*JnYXv>e(m?0 z|GIOMKX4~zxGW9NsrqdH`HXQ{%FomK`*Xf~+I^FJwfD%nKgH*5)7iN$s-1eUc8T3C zj*8zcJOBJz%fcj>5wLUHAHxUE@j~-XKfbp!%FgP&=gWIfIPQP@qm%RNjqJ)R&qF-( z?wCA!bjCSyisJhY={1m3Z4EsX*1102*ZNsyp_A+U=a*jh9+}-KKH27B#DWQH|8HBp zeqYqSKcBoS|NVTv_CT^jSNW!b{JLp>uV=E~zO&*TBQqO^^0AM<6xn7TYAO2Ey>~{G4HL9_m{{0_P0E*#tLrN|NeIW+|vIh)7|%Xt2c7< zS$nQpE+esYZirT3)U}L9))Bv=lFpu~Zq!zJUcb-$SA3r2mx(f;UJAtDg`A%dz|`uk zkaz#D?~K{oU#ZC5)69tXbnALQ+bnX@`Q1+z++T5cPm#~m!wKTgno}J7>sW=Dqt02s zw@IA99p|;|@5-R1Uh9ng=O4|zy{+|*c;%%_m)?lD@6_Vh)cCUDMYZHRjp9{~9G?rF zgxBjXniXzs6gz2_P=`9x?|WG6{bq?2zvxf@{5Z5t;AoP=9c8MOXl2>)Ay__^Xw{I zKd!i>{&`mRxx;+K1|bbi7Lz}*LFcx}Ef><5$MUGiYvH3xtuHHJgX*Bwh5JFrPQTxI zc^de18i%;1H*;4(u4vZ>>bP(YyM{^x$t;KSy?H|&rg%4EZIIu=*#Ad&Y?_>oG+#-Xh`{jy(Qw$v?otAaYy!by_Hd0S6x{d z>@FlEw508)xpLy_9=~WkYvaqRr;C3qQCCxoQtX`JlCo^+(v!PNU$5D)CSv0v-|r$9 zT~!ybcu6pdPE~!=0$GE-iBmykd+u$u?o&%V`+uD+I=Ew37W?kEYkP%LlaH;7d6~zo zBwTos-CzCDrlO~(!V-4b{94O0#o?sV0_IY$Yd^0o4rTIMz#@EOSLte>JDYs+ZrMhu zrRQ;YF(p>k_AXxH7W8vLUhD-v|m2YQaMgbXUohDHZ_Up84ky*{_Qwf5+u+CLwU ze>y52|73M0sLklDzc)loFJ?x1<*!xuN-q0;n*aZg`uRPx7Czv-5Ssk-)YMJ2zrQuz zkF@*l@Y}6VX6E@z8-slg-``lQw?!4SNuiNRvEjt;wC_xnRnJ>GUhUuXDpB#XvReJ! zjS;7&Yw7OQHkl~<`_j{?S2Q=7D#o5O+_kCd>np|6@;Q%|cus!OrM+&$RURo5k6T-_ z#W$V09#?&~FKYjbMcq!%xTpO1e!u?o6wTn2e}8^n+Ee-2A+qMSfIjFV0nr8J_bQj? zS1)Mol{Swubet<|UB)v-bxm&ZvojMVjnh1?uZvxpc(^TbYNyKOH#aw@o|$2|spe3QGJVY8)O(+8vt$CVl*xqK`TJwFLRWL)z#H+e=cI!uYK$0?(+8=P94uu`x}KjG&~Y=1`|Y%%x8+Rye!t%S(yB%C>R(-1`EAFdxI)43 z74uFh*)i^_24!srN5O=EbC0h0ZrT|$EoM^93?Hvp)z9B^j1*tnvTyZP*SLS%<|x;x z$EVCEUbLQm^37f8+OKwLdlvBuYn=*A%ky3)+qKPb>qUS2zbUp69Gm6qemH*MGIEkV zeE91nZ~c=W9v)sB{%YOscc(74RKMSQz3SV$ozLYeKOPlNeS2$bSPiI`_vwUk|B3ke zzp1wEpl*~&_BEe<|9)lve6hHHO+j+sInZiyy`4{l4mx+-u=#XC`6*~o%v;Bf*t(xj zFKtTouKf9Q`r7pOJD<;+yfOLsElY=f>vtB?Ug}Ry?lWZ3aC-dn`TXgP%{P81^@{Ogrq|Ea?M zHW%l4*Tq-(TOR-W>+5IV(?<>K|Ns47_Fv|G10(aB1dD&u?pMFJb<|LP#&7?p;NatT z5>@;i?Q1!O)o#=t77jd{FZejW_5SfiuHA1ASiO2s&Kq9$+{M&suJ-#nCf(J`jRZvR zf(!hPVkQnQx612l1HJQB)h)S`_RIZV^y=L)fo}_5P6>+FQc-*Unqy{G#{_e^Q~^_r#^o5d=)sLP~-*$+Xv0=hN4|kQsiW36q9kY$kSsd20|M8$XY>MKs4P2sH5rRz~1-XZ< zxvW`KoESfDOF1c2eFk((OZvRZV_j*db`|IaTko{`*s$;Cv)S9uy35yY>5(uz)aBJ; z(9~vjNv}n{X|>l>t!=vR?0>ZdEvx_kZ<^+D?>HCzB3Ct=0^0x%9yaOb1?-8FU8fzc2{1~t%AB!i;k&H6({5GD{=Km?eqVjv+f~;O zey`p6{rCHt^WSUipZ}?QUVCr;dCT(8&(5aSU$Q@uE&J-gw2lSoCJXnxnyR%c_4Kqw zr<5L7e|zKk`r2CU^Viws2m`dWwMXE2iZco3IoIlU+{MkRsXP>a16^|_`+@KX4iW!-?aMoYwz{C`#sM@w&##WX zE)BjjX3d+Y$1>&9X|rt}>XQyH^;31}d(&+`^?l5T4~O~1Sq0QzFjZGy^EJOa1>_bX zd+)t0^EJH;70%T@oyPWX8oM=zY(jOeqjc=ntWZe>g))butPfce)mJIG2G?$~ouu0) zy2bYY&sCjUv#(D(*#5^c?$(YyJT3z1%uQ3Z!>7I8!!adt!HREJrye{l@XU3kN!6Do zUkO23n~DvUzxMRA?#nviwsv2HT*ZUNgFATGY)f7QNcztC-h5ozox4X&Lf4>Q%%Q2| z%(P#PtTXM4BIWI>jkJ5zH?5kX9-XpC@`tzD6!tjViFH4U%J%LpG*ayM{qy?n|0VHr zYt7zPf8~E!qBhlB|98xA!?RL&wo-zo2)w_;Q}h z{tk2daORfZi9H7y6>hVM8EORdZR3o*bC*rR!`js{%zA-~-TbMUxr!W1YZmXlEx$@T zv&}%?D|LRLX1C(^S(YBJj-GhVwb88nZt3+0?Kd(SqMK}V^Ae9_G+ty{%&KR?tsu2^ z)#jRms+q4hefPM0-gxDo>@Xc>j;H617XJBqGk9jjxs)Qy$@fk&f6QMS5ia8U^4#9v zWmdnAt^9J?N5lW=mq$jyVOHhwb+x}fEe&@In;V@Ps5bXYdt*TN1oy%$(;Yg>>xwQe z`medJaGhUvy!*Y@ecA6;e&#Q_IZgbMv*RL;z<|F+-u$|X!NR(ey?5yC+%_@z$wGb) zmMc%Y{_c2IH6ib}Z$RkEVve5YL1Kbp+gvP|Pbh|31l;B|T+_d_b5{XxV*WAKV;j?X z8)rvK?wq>Y;q205d3Sf2ax%YQ4lNY&33^x2e`0-RyT$#jyw*GQ-d*BiymR}+#%-Hx ze}CgY#H_@xSJ=VlmL<-rj ztjh?SEqJ<5*7{UOU{3eTUyPr2mL7I+Ha%s`WfCP)uB3b2l|^&%@%Q`x|JzY}rw^3U zqaHMEY`C#9VELj8(_?Eqf4Qkmv$iX)jVeA_U0CDmr1_Tnf1U2z`mg;j#n=Dcxns-D zt^FxZKPQLR#d9n*$xprddHdz_PfOG<&A->bx?~^ssUo}0<-0#Uu4KA@G3mgcV=R2v zmD2p?3uq-Di7tEkGjQ(rnmFUG36fW)IX>Ft-Zo(_L(&y?6_GEg_rx8uoHeE^9xIs7 zX4(Dxs#bEeT%lfwv6gC(j(qK=lg`&(FIgmOTeaoO+}MwOubNJ8jT5=gBDa7m=ra#r zg$VN-*UELRb5|Vq5RNunb*lL5)$rphBcq>Qxxcw``q{L*1`iJ|dHU}3y4Q1Oec#ag z?a;LHdzI-`FBZ0Y)n;(}TDWtXZS;(A-RmP78g*xhrzhh>sm6u7x=LzqR|abR=DJeK zd+>>rxby`!UiOJg42;w&;{ys0u$wh4t9`jbz-{~xNEad%oRHU-! zHYoYJao1eZU2u7U$5u@}ZKI7mM?am}xp}k5sb71~&8fCsJ;`4rXs6EVIreo=%Ug4< zW!^h;yX%S`)X3;UhZ9YU8vj-LpQoM5K4 zV1{8~om%RfTU%GJS+23JU|$1=0;}4sfd4!E9OZ?NbgmG*w{u%jRs7#sl5bDMO*rEr ztrC>8@`hzz+$x#qm*>}LN(xV(^(ybl#XCjktEYK7v4|J;Z|s>|cg=2+Pm7@ZEw+@9 zxwBdG&#^RR3RZbZu}0S{?6gi>-M#Qh)6yfHu?+zZt=1OTmtDBlRT#@=xbTguVtC)J zxBU_S_n%6f`#oUi>n*vzJvN+gF7GX9*j92*aVlHDox88D*4nY>ZY$vPR6i7`c+>QO zWlmzkfoq364jJp54TyEMtG!*RJ~eU0J}0FqQ%>!hsJH0EgATYX3Aq|F*-%CtUR(@094TEO|e()j0F)nMIb9y*7RqDC~Nw@ZT{if9KO_MxUp0 z%XA7>do28tt$a)FMSr=1UmIeM!n0Ykq$dl&W ztbGp8BvOx>@>Zx!&7CH9zE?~__d{Uhfd^s7?ZqWpf|X}|j5%wg%bOB(uJO&QJmp^L zX)%+(t=nU%d&c&m7rk1q#X{wu1Dns+iwyzb{O)vi!o!fQuOP=GNS2c%2@08}x{r33Yd+qN5kvvRW z&u=Tw+kJiWmZyqG<7*#BY~4HOaN(IR{i-Y0q-(}qzvTIK$&!V;vb1Lxe_j>R7IQyz zhebZ8(u;0p#g*o&AJ*v$W;=0yakJ`uC2%b|fA7{aeEsQt(EK0MA-3Smm6k=XWp$*# zoP8RvF}dhSKv5<8J>@C!-q&?@>G&T%`C2Eg(s^fy@M&!^y|c#qmS5T)UbC_Mtar;N zcYXVL)1E({8+~KF(6P_(=GfdNa$vD_wMENo~ax)tJA9ckX=CjSQZ=_*w1e+B@Oz7H;C5c=*}h$#$#Pu6^h+ xEp!rl{+bCqS$aqJs7;w?84`ZB=;+6K#wCW_1@%|U+dwzKdb;|#taD0e0sykWTBHB~ literal 0 HcmV?d00001 diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md index ffd0efb365a76f..1467ecae568255 100644 --- a/doc/user/project/merge_requests/versions.md +++ b/doc/user/project/merge_requests/versions.md @@ -46,6 +46,27 @@ This only applies to commits that are in the most recent version of a merge request - if a commit was in a merge request, then rebased out of that merge request, they will not be linked. +## (HEAD) comparison mode for Merge Requests + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/27008) in GitLab 12.9. + +Merge Requests, particularly the **Changes** tab, is where source code +is reviewed and discussed. In circumstances where the target branch was +merged into the source branch of the merge request, the changes in the +source and target branch can be shown mixed together making it hard to +understand which changes are being added and which already exist in the +target branch. + +In GitLab 12.9, we are adding an **experimental** comparison mode, which +will show a diff calculated by simulating a merge - a more accurate +representation of the change than using the merge base of the two +branches. The new mode is available from the comparison target drop down +by selecting **master (HEAD)**. In the future it will +[replace](https://gitlab.com/gitlab-org/gitlab/issues/198458) the +current default comparison. + +![Merge request versions compare HEAD](img/versions_compare_head.png) + + -- GitLab