Topic: Straw polls for P1144R0 "Object relocation in
Author: mihailnajdenov@gmail.com
Date: Mon, 12 Nov 2018 02:05:44 -0800 (PST)
Raw View
------=_Part_1784_574227862.1542017144278
Content-Type: multipart/alternative;
boundary="----=_Part_1785_1919990702.1542017144278"
------=_Part_1785_1919990702.1542017144278
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
I will take the liberty to express my thoughts in which my votes will=20
become clear
I like the general direction. Initially I hoped triviality can be expressed=
=20
in terms of functions and side effects, but it can't, it must be part of=20
the type.
So, pro to all questions on the general direction.
I am also pro the library facilities.
Now, on the things that bother me.
First, traits will be superseded by Refection. I feel the traits API will=
=20
have to be "rebased" which makes it much less attractive.
Second, and my main gripe - the use of attribute to create a new type=20
(FWIW).=20
This does not feel right and never will. Sure, creating a new type is=20
pretty much unavoidable if we want all the benefits, but doing it this way=
=20
is a hack.=20
Can we do this in another, more type-systemy way?=20
Can we have a magic base class? Can we have magic typedef.=20
Can we make type specialization work (the folly way without the downsides)?
If we *absolutely *can not get away from the attribute joker, then can we=
=20
create special attribute subtype that makes it clear it is special=20
something like (off the top of my head) [[typedef: relocatable]], something=
=20
to donate type-introducing attributes.=20
Or of course, a keyword is probably best option - keywords are already used=
=20
to both create and influence types (const, volatile, final etc).=20
On Monday, November 12, 2018 at 3:35:40 AM UTC+2, Arthur O'Dwyer wrote:
>
> P1144R0 "Object relocation in terms of move plus destroy"=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>=20
> was presented to SG17 (EWGI) in San Diego. (Thanks to Corentin Jabot for=
=20
> trying to make it happen!) The paper lists the following straw polls that=
=20
> *could* have been taken. None of these polls were taken, and no feedback=
=20
> was given on the paper in San Diego.
>
> So I'd like to get *your* opinions! Please reply in this thread with=20
> your !votes on any or all of the following statements, in the traditional=
=20
> WG21 straw poll format: "Strongly For" the statement as written; "For" it=
;=20
> "Neutral" (as in, you considered the question and your expert opinion is=
=20
> that you are neutral on it =E2=80=94 please do not use this option as a s=
ynonym for=20
> *abstaining* due to *lack* of an opinion); "Against" the statement as=20
> written; or "Strongly Against" it.
>
> The polls will remain open for one week, until Sunday 2018-11-18. If you=
=20
> don't want your !votes to be public, you can always email them to me=20
> privately.
> I will tally the ballots and report the results in P1144R1, which will=20
> appear in the post-San-Diego mailing (submission deadline: 2018-11-26).
>
> Here are the polls. Please vote in any or all of them, but *only after=20
> reading the paper=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>.*=
=20
> When a poll says "...as proposed in this paper," it's referring to the=20
> formal wording from P1144R0. You would have to read that formal wording t=
o=20
> know what's being asked!
> ---------------------------------------
>
> EWG1. We approve of the general idea that user-defined classes should be=
=20
> able to warrant their own trivial relocatability via a standard mechanism=
..
>
> EWG2. We approve of the general idea that user-defined classes which=20
> follow the Rule of Zero=20
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/=
cxx11/2012/08/15/rule-of-zero.html>=20
> should inherit the trivial relocatability of their bases and members.
>
> EWG3. Nobody should be able to warrant the trivial relocatability of clas=
s=20
> `C` except for class `C` itself (i.e., we do not want to see a=20
> customization point analogous to `std::hash`).
>
> EWG4. A class should be able to warrant its own trivial relocatability vi=
a=20
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
> EWG5. A class should be able to warrant its own trivial relocatability vi=
a=20
> some attribute, but not necessarily under that exact name.
>
> EWG6. A class should be able to warrant its own trivial relocatability as=
=20
> proposed in this paper, but we prefer to see a contextual keyword rather=
=20
> than an attribute.
>
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is=
=20
> added to the `<type_traits>` header, the programmer should be permitted t=
o=20
> specialize it for program-defined types (i.e., we want to see that trait=
=20
> itself become a customization point analogous to `std::hash`).
>
> EWG8. Trivial relocatability should be assumed by default. Classes such a=
s=20
> those in Appendix C=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non=
-trivial-samples>=20
> should indicate their non-trivial relocatability via an opt-in mechanism.
>
> EWG9. To simplify conditionally trivial relocation=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sam=
ple-conditional>,=20
> if an attribute with the semantics of `[[trivially_relocatable]]` is adde=
d,=20
> it should take a boolean argument.
>
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)`=20
> should be added to the `<memory>` header, as proposed in this paper.
>
> LEWG11. The type trait `is_relocatable<T>` should be added to the=20
> `<type_traits>` header, as proposed in this paper.
>
> LEWG12. If `is_relocatable<T>` is added, then we should also add=20
> `is_nothrow_relocatable<T>`, as proposed in this paper.
>
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to=
=20
> the `<type_traits>` header, under that exact name, as proposed in this=20
> paper.
>
> LEWG14. We approve of a trait with the semantics of=20
> `is_trivially_relocatable<T>`, but possibly under a different name. (For=
=20
> example, `is_bitwise_relocatable`.)
>
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,=
=20
> then the type trait `is_trivially_swappable<T>` should also be added to t=
he=20
> `<type_traits>` header.
>
> -----------------------
>
> Discussion and comments on P1144R0 is also welcome =E2=80=94 preferably i=
n the=20
> original discussion thread=20
> <https://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBw=
AJ>,=20
> or via private email, but if it winds up in this thread, I'm okay with th=
at.
>
> Thanks,
> Arthur
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/54659521-5bf1-4977-ba77-06586b9fb0b2%40isocpp.or=
g.
------=_Part_1785_1919990702.1542017144278
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I will take the liberty to express my thoughts in which my=
votes will become clear<div><br></div><div>I like the general direction. I=
nitially I hoped triviality can be expressed in terms of functions and side=
effects, but it can't, it must be part of the type.</div><div><br></di=
v><div>So, pro to all questions on the general direction.</div><div><br></d=
iv><div><div>I am also pro the library facilities.</div><div><br></div><div=
><br></div><div>Now, on the things that bother me.</div><div><br></div><div=
>First, traits will be superseded by Refection. I feel the traits API will =
have to be "rebased" which makes it much less attractive.</div><d=
iv><br></div><div>Second, and my main gripe - the use of attribute to creat=
e a new type (FWIW).=C2=A0</div><div>This does not feel right and never wil=
l. Sure, creating a new type is pretty much unavoidable if we want all the =
benefits, but doing it this way is a hack.=C2=A0</div><div><br></div><div>C=
an we do this in another, more type-systemy way?=C2=A0</div><div>Can we hav=
e a magic base class? Can we have magic typedef.=C2=A0</div><div>Can we mak=
e type specialization work (the folly way without the downsides)?</div><div=
><br></div><div>If we <i>absolutely </i>can not get away from the attribute=
joker, then can we create special attribute subtype that makes it clear it=
is special=C2=A0</div><div>something like (off the top of my head) [[typed=
ef: relocatable]], something to donate type-introducing attributes.=C2=A0</=
div><div><br></div><div>Or of course, a keyword is probably best option - k=
eywords are already used to both create and influence types (const, volatil=
e, final etc).=C2=A0</div><div><br></div><div><br></div><div><br>On Monday,=
November 12, 2018 at 3:35:40 AM UTC+2, Arthur O'Dwyer wrote:<blockquot=
e class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: =
1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><a href=3D"http://=
www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html" target=3D"_b=
lank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.co=
m/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpape=
rs%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznW=
toE1XzwyGq8CvGsJpA';return true;" onclick=3D"this.href=3D'http://ww=
w.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2F=
docs%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjC=
NHruSIPUznWtoE1XzwyGq8CvGsJpA';return true;">P1144R0 "Object reloc=
ation in terms of move plus destroy"</a> was presented to SG17 (EWGI) =
in San Diego. (Thanks to Corentin Jabot for trying to make it happen!) The =
paper lists the following straw polls that <i><b>could</b></i> have been ta=
ken. None of these polls were taken, and no feedback was given on the paper=
in San Diego.</div><div><br></div><div>So I'd like to get <i>your</i> =
opinions! =C2=A0Please reply in this thread with your !votes on any or all =
of the following statements, in the traditional WG21 straw poll format: &qu=
ot;Strongly For" the statement as written; "For" it; "N=
eutral" (as in, you considered the question and your expert opinion is=
that you are neutral on it =E2=80=94 please do not use this option as a sy=
nonym for=C2=A0<i>abstaining</i> due to <i>lack</i> of an opinion); "A=
gainst" the statement as written; or "Strongly Against" it.<=
/div><div><br></div><div>The polls will remain open for one week, until Sun=
day 2018-11-18. If you don't want your !votes to be public, you can alw=
ays email them to me privately.</div><div>I will tally the ballots and repo=
rt the results in P1144R1, which will appear in the post-San-Diego mailing =
(submission deadline: 2018-11-26).</div><div><br></div><div>Here are the po=
lls. Please vote in any or all of them, but <b>only after <a href=3D"http:/=
/www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html" target=3D"_=
blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.c=
om/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpap=
ers%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUzn=
WtoE1XzwyGq8CvGsJpA';return true;" onclick=3D"this.href=3D'http://w=
ww.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2=
Fdocs%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQj=
CNHruSIPUznWtoE1XzwyGq8CvGsJpA';return true;">reading the paper</a>.</b=
> When a poll says "...as proposed in this paper," it's refer=
ring to the formal wording from P1144R0. You would have to read that formal=
wording to know what's being asked!</div><div>------------------------=
------<wbr>---------</div><div><br></div><div>EWG1. We approve of the gener=
al idea that user-defined classes should be able to warrant their own trivi=
al relocatability via a standard mechanism.</div><div><br></div><div>EWG2. =
We approve of the general idea that user-defined classes which follow the <=
a href=3D"https://web.archive.org/web/20130607234833/http://flamingdangerzo=
ne.com/cxx11/2012/08/15/rule-of-zero.html" target=3D"_blank" rel=3D"nofollo=
w" onmousedown=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%3A=
%2F%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzo=
ne.com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1=
\x26usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;" onclick=3D=
"this.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F%2Fweb.archive=
..org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.com%2Fcxx11%2F=
2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCN=
G0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;">Rule of Zero</a> should inh=
erit the trivial relocatability of their bases and members.</div><div><br><=
/div><div>EWG3. Nobody should be able to warrant the trivial relocatability=
of class `C` except for class `C` itself (i.e., we do not want to see a cu=
stomization point analogous to `std::hash`).</div><div><br></div><div>EWG4.=
A class should be able to warrant its own trivial relocatability via the a=
ttribute `[[trivially_relocatable]]`, as proposed in this paper.</div><div>=
<br></div><div>EWG5. A class should be able to warrant its own trivial relo=
catability via some attribute, but not necessarily under that exact name.</=
div><div><br></div><div>EWG6. A class should be able to warrant its own tri=
vial relocatability as proposed in this paper, but we prefer to see a conte=
xtual keyword rather than an attribute.</div><div><br></div><div>EWG7. If a=
trait with the semantics of `is_trivially_relocatable<T>` is added t=
o the `<type_traits>` header, the programmer should be permitted to s=
pecialize it for program-defined types (i.e., we want to see that trait its=
elf become a customization point analogous to `std::hash`).</div><div><br><=
/div><div>EWG8. Trivial relocatability should be assumed by default. Classe=
s such as those in <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/p=
apers/2018/p1144r0.html#non-trivial-samples" target=3D"_blank" rel=3D"nofol=
low" onmousedown=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A=
%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r=
0.html%23non-trivial-samples\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ=
5IYIc7NQLChnFEyQ6nVN7A';return true;" onclick=3D"this.href=3D'http:=
//www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg2=
1%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23non-trivial-samples\x26sa\x3dD\x2=
6sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChnFEyQ6nVN7A';return true;">=
Appendix C</a> should indicate their non-trivial relocatability via an opt-=
in mechanism.</div><div><br></div><div>EWG9. To simplify <a href=3D"http://=
www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-condit=
ional" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'h=
ttp://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2=
Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23sample-conditional\x26sa\x3dD=
\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ';return true=
;" onclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2F=
www.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html=
%23sample-conditional\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD=
96leOeCAJ5_EdtQ';return true;">conditionally trivial relocation</a>, if=
an attribute with the semantics of `[[trivially_relocatable]]` is added, i=
t should take a boolean argument.</div><div><br></div><div>LEWG10. The algo=
rithm `uninitialized_relocate(first, last, d_first)` should be added to the=
`<memory>` header, as proposed in this paper.</div><div><br></div><d=
iv>LEWG11. The type trait `is_relocatable<T>` should be added to the =
`<type_traits>` header, as proposed in this paper.</div><div><br></di=
v><div>LEWG12. If `is_relocatable<T>` is added, then we should also a=
dd `is_nothrow_relocatable<T>`, as proposed in this paper.</div><div>=
<br></div><div>LEWG13. The type trait `is_trivially_relocatable<T>` s=
hould be added to the `<type_traits>` header, under that exact name, =
as proposed in this paper.</div><div><br></div><div>LEWG14. We approve of a=
trait with the semantics of `is_trivially_relocatable<T>`, but possi=
bly under a different name. (For example, `is_bitwise_relocatable`.)</div><=
div><br></div><div>LEWG15. If `is_trivially_relocatable<T>` is added,=
under that exact name, then the type trait `is_trivially_swappable<T>=
;` should also be added to the `<type_traits>` header.</div><div><br>=
</div><div>-----------------------</div><div><br></div><div>Discussion and =
comments on P1144R0 is also welcome =E2=80=94 preferably=C2=A0<a href=3D"ht=
tps://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ" t=
arget=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'https://g=
roups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ';retu=
rn true;" onclick=3D"this.href=3D'https://groups.google.com/a/isocpp.or=
g/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ';return true;">in the original di=
scussion thread</a>, or via private email, but if it winds up in this threa=
d, I'm okay with that.</div><div><br></div><div>Thanks,</div><div>Arthu=
r</div></div></blockquote></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/54659521-5bf1-4977-ba77-06586b9fb0b2%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/54659521-5bf1-4977-ba77-06586b9fb0b2=
%40isocpp.org</a>.<br />
------=_Part_1785_1919990702.1542017144278--
------=_Part_1784_574227862.1542017144278--
.
Author: florian.csdt@gmail.com
Date: Mon, 12 Nov 2018 08:54:23 -0800 (PST)
Raw View
------=_Part_2105_204962882.1542041663625
Content-Type: multipart/alternative;
boundary="----=_Part_2106_1343454666.1542041663625"
------=_Part_2106_1343454666.1542041663625
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Le lundi 12 novembre 2018 02:35:40 UTC+1, Arthur O'Dwyer a =C3=A9crit :
>
> P1144R0 "Object relocation in terms of move plus destroy"=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>=20
> was presented to SG17 (EWGI) in San Diego. (Thanks to Corentin Jabot for=
=20
> trying to make it happen!) The paper lists the following straw polls that=
=20
> *could* have been taken. None of these polls were taken, and no feedback=
=20
> was given on the paper in San Diego.
>
> So I'd like to get *your* opinions! Please reply in this thread with=20
> your !votes on any or all of the following statements, in the traditional=
=20
> WG21 straw poll format: "Strongly For" the statement as written; "For" it=
;=20
> "Neutral" (as in, you considered the question and your expert opinion is=
=20
> that you are neutral on it =E2=80=94 please do not use this option as a s=
ynonym for=20
> *abstaining* due to *lack* of an opinion); "Against" the statement as=20
> written; or "Strongly Against" it.
>
> The polls will remain open for one week, until Sunday 2018-11-18. If you=
=20
> don't want your !votes to be public, you can always email them to me=20
> privately.
> I will tally the ballots and report the results in P1144R1, which will=20
> appear in the post-San-Diego mailing (submission deadline: 2018-11-26).
>
> Here are the polls. Please vote in any or all of them, but *only after=20
> reading the paper=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>.*=
=20
> When a poll says "...as proposed in this paper," it's referring to the=20
> formal wording from P1144R0. You would have to read that formal wording t=
o=20
> know what's being asked!
> ---------------------------------------
>
> EWG1. We approve of the general idea that user-defined classes should be=
=20
> able to warrant their own trivial relocatability via a standard mechanism=
..
>
Strongly For
>
> EWG2. We approve of the general idea that user-defined classes which=20
> follow the Rule of Zero=20
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/=
cxx11/2012/08/15/rule-of-zero.html>=20
> should inherit the trivial relocatability of their bases and members.
>
Strongly For=20
>
> EWG3. Nobody should be able to warrant the trivial relocatability of clas=
s=20
> `C` except for class `C` itself (i.e., we do not want to see a=20
> customization point analogous to `std::hash`).
>
For=20
>
> EWG4. A class should be able to warrant its own trivial relocatability vi=
a=20
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
Neutral=20
>
> EWG5. A class should be able to warrant its own trivial relocatability vi=
a=20
> some attribute, but not necessarily under that exact name.
>
Neutral=20
>
> EWG6. A class should be able to warrant its own trivial relocatability as=
=20
> proposed in this paper, but we prefer to see a contextual keyword rather=
=20
> than an attribute.
>
Neutral=20
>
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is=
=20
> added to the `<type_traits>` header, the programmer should be permitted t=
o=20
> specialize it for program-defined types (i.e., we want to see that trait=
=20
> itself become a customization point analogous to `std::hash`).
>
Strongly Against=20
>
> EWG8. Trivial relocatability should be assumed by default. Classes such a=
s=20
> those in Appendix C=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non=
-trivial-samples>=20
> should indicate their non-trivial relocatability via an opt-in mechanism.
>
Against=20
>
> EWG9. To simplify conditionally trivial relocation=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sam=
ple-conditional>,=20
> if an attribute with the semantics of `[[trivially_relocatable]]` is adde=
d,=20
> it should take a boolean argument.
>
Neutral=20
>
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)`=20
> should be added to the `<memory>` header, as proposed in this paper.
>
For=20
>
> LEWG11. The type trait `is_relocatable<T>` should be added to the=20
> `<type_traits>` header, as proposed in this paper.
>
Strongly Against=20
>
> LEWG12. If `is_relocatable<T>` is added, then we should also add=20
> `is_nothrow_relocatable<T>`, as proposed in this paper.
>
For=20
>
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to=
=20
> the `<type_traits>` header, under that exact name, as proposed in this=20
> paper.
>
For=20
>
> LEWG14. We approve of a trait with the semantics of=20
> `is_trivially_relocatable<T>`, but possibly under a different name. (For=
=20
> example, `is_bitwise_relocatable`.)
>
Strongly For=20
>
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,=
=20
> then the type trait `is_trivially_swappable<T>` should also be added to t=
he=20
> `<type_traits>` header.
>
For=20
>
> -----------------------
>
> Discussion and comments on P1144R0 is also welcome =E2=80=94 preferably i=
n the=20
> original discussion thread=20
> <https://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBw=
AJ>,=20
> or via private email, but if it winds up in this thread, I'm okay with th=
at.
>
> Thanks,
> Arthur
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/9221ecb4-ea61-46e9-9aab-4d4143610e5f%40isocpp.or=
g.
------=_Part_2106_1343454666.1542041663625
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>Le lundi 12 novembre 2018 02:35:40 UTC+1, Arthur O=
'Dwyer a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"ma=
rgin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">=
<div dir=3D"ltr"><div><a href=3D"http://www.open-std.org/jtc1/sc22/wg21/doc=
s/papers/2018/p1144r0.html" target=3D"_blank" rel=3D"nofollow" onmousedown=
=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-s=
td.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3d=
D\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWtoE1XzwyGq8CvGsJpA';return tru=
e;" onclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2=
Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.htm=
l\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWtoE1XzwyGq8CvGsJpA'=
;return true;">P1144R0 "Object relocation in terms of move plus destro=
y"</a> was presented to SG17 (EWGI) in San Diego. (Thanks to Corentin =
Jabot for trying to make it happen!) The paper lists the following straw po=
lls that <i><b>could</b></i> have been taken. None of these polls were take=
n, and no feedback was given on the paper in San Diego.</div><div><br></div=
><div>So I'd like to get <i>your</i> opinions! =C2=A0Please reply in th=
is thread with your !votes on any or all of the following statements, in th=
e traditional WG21 straw poll format: "Strongly For" the statemen=
t as written; "For" it; "Neutral" (as in, you considere=
d the question and your expert opinion is that you are neutral on it =E2=80=
=94 please do not use this option as a synonym for=C2=A0<i>abstaining</i> d=
ue to <i>lack</i> of an opinion); "Against" the statement as writ=
ten; or "Strongly Against" it.</div><div><br></div><div>The polls=
will remain open for one week, until Sunday 2018-11-18. If you don't w=
ant your !votes to be public, you can always email them to me privately.</d=
iv><div>I will tally the ballots and report the results in P1144R1, which w=
ill appear in the post-San-Diego mailing (submission deadline: 2018-11-26).=
</div><div><br></div><div>Here are the polls. Please vote in any or all of =
them, but <b>only after <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/d=
ocs/papers/2018/p1144r0.html" target=3D"_blank" rel=3D"nofollow" onmousedow=
n=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-=
std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3=
dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWtoE1XzwyGq8CvGsJpA';return tr=
ue;" onclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%=
2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.ht=
ml\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWtoE1XzwyGq8CvGsJpA'=
;;return true;">reading the paper</a>.</b> When a poll says "...as pro=
posed in this paper," it's referring to the formal wording from P1=
144R0. You would have to read that formal wording to know what's being =
asked!</div><div>------------------------------<wbr>---------</div><div><br=
></div><div>EWG1. We approve of the general idea that user-defined classes =
should be able to warrant their own trivial relocatability via a standard m=
echanism.</div></div></blockquote><div>Strongly For</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>EWG2. We a=
pprove of the general idea that user-defined classes which follow the <a hr=
ef=3D"https://web.archive.org/web/20130607234833/http://flamingdangerzone.c=
om/cxx11/2012/08/15/rule-of-zero.html" target=3D"_blank" rel=3D"nofollow" o=
nmousedown=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F%=
2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.c=
om%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x26=
usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;" onclick=3D"thi=
s.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F%2Fweb.archive.org=
%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.com%2Fcxx11%2F2012=
%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG0-o=
V_GpdnIP-4dWgeb4q0MdCEvA';return true;">Rule of Zero</a> should inherit=
the trivial relocatability of their bases and members.</div></div></blockq=
uote><div>Strongly For <br></div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex=
;"><div dir=3D"ltr"><div><br></div><div>EWG3. Nobody should be able to warr=
ant the trivial relocatability of class `C` except for class `C` itself (i.=
e., we do not want to see a customization point analogous to `std::hash`).<=
/div></div></blockquote><div>For <br></div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding=
-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>EWG4. A class should be a=
ble to warrant its own trivial relocatability via the attribute `[[triviall=
y_relocatable]]`, as proposed in this paper.</div></div></blockquote><div>N=
eutral <br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><div><br></div><div>EWG5. A class should be able to warrant its own tri=
vial relocatability via some attribute, but not necessarily under that exac=
t name.</div></div></blockquote><div>Neutral <br></div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>EWG6. A class=
should be able to warrant its own trivial relocatability as proposed in th=
is paper, but we prefer to see a contextual keyword rather than an attribut=
e.</div></div></blockquote><div>Neutral <br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>EWG7. If a trait w=
ith the semantics of `is_trivially_relocatable<T>` is added to the `&=
lt;type_traits>` header, the programmer should be permitted to specializ=
e it for program-defined types (i.e., we want to see that trait itself beco=
me a customization point analogous to `std::hash`).</div></div></blockquote=
><div>Strongly Against <br></div><blockquote class=3D"gmail_quote" style=3D=
"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex=
;"><div dir=3D"ltr"><div><br></div><div>EWG8. Trivial relocatability should=
be assumed by default. Classes such as those in <a href=3D"http://www.open=
-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples" =
target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://w=
ww.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2=
Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23non-trivial-samples\x26sa\x3dD\x26sn=
tz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChnFEyQ6nVN7A';return true;" onc=
lick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.op=
en-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23non=
-trivial-samples\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChn=
FEyQ6nVN7A';return true;">Appendix C</a> should indicate their non-triv=
ial relocatability via an opt-in mechanism.</div></div></blockquote><div>Ag=
ainst <br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"lt=
r"><div><br></div><div>EWG9. To simplify <a href=3D"http://www.open-std.org=
/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional" target=3D=
"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google=
..com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fp=
apers%2F2018%2Fp1144r0.html%23sample-conditional\x26sa\x3dD\x26sntz\x3d1\x2=
6usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ';return true;" onclick=3D"th=
is.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org=
%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23sample-condit=
ional\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ&=
#39;;return true;">conditionally trivial relocation</a>, if an attribute wi=
th the semantics of `[[trivially_relocatable]]` is added, it should take a =
boolean argument.</div></div></blockquote><div>Neutral <br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: =
1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br></div><div>LEW=
G10. The algorithm `uninitialized_relocate(first, last, d_first)` should be=
added to the `<memory>` header, as proposed in this paper.</div></di=
v></blockquote><div>For <br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div><br></div><div>LEWG11. The type trait `is_reloc=
atable<T>` should be added to the `<type_traits>` header, as pr=
oposed in this paper.</div></div></blockquote><div>Strongly Against <br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;=
border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><br><=
/div><div>LEWG12. If `is_relocatable<T>` is added, then we should als=
o add `is_nothrow_relocatable<T>`, as proposed in this paper.</div></=
div></blockquote><div>For <br></div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div><br></div><div>LEWG13. The type trait `is_trivi=
ally_relocatable<T>` should be added to the `<type_traits>` hea=
der, under that exact name, as proposed in this paper.</div></div></blockqu=
ote><div>For <br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><div><br></div><div>LEWG14. We approve of a trait with the semant=
ics of `is_trivially_relocatable<T>`, but possibly under a different =
name. (For example, `is_bitwise_relocatable`.)</div></div></blockquote><div=
>Strongly For <br></div><blockquote class=3D"gmail_quote" style=3D"margin: =
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div d=
ir=3D"ltr"><div><br></div><div>LEWG15. If `is_trivially_relocatable<T>=
;` is added, under that exact name, then the type trait `is_trivially_swapp=
able<T>` should also be added to the `<type_traits>` header.</d=
iv></div></blockquote><div>For <br></div><blockquote class=3D"gmail_quote" =
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-l=
eft: 1ex;"><div dir=3D"ltr"><div><br></div><div>-----------------------</di=
v><div><br></div><div>Discussion and comments on P1144R0 is also welcome =
=E2=80=94 preferably=C2=A0<a href=3D"https://groups.google.com/a/isocpp.org=
/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ" target=3D"_blank" rel=3D"nofollow" on=
mousedown=3D"this.href=3D'https://groups.google.com/a/isocpp.org/d/msg/=
sg14/6mAbZOTdVjk/wYaO5wQzBwAJ';return true;" onclick=3D"this.href=3D=
9;https://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwA=
J';return true;">in the original discussion thread</a>, or via private =
email, but if it winds up in this thread, I'm okay with that.</div><div=
><br></div><div>Thanks,</div><div>Arthur</div></div></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/9221ecb4-ea61-46e9-9aab-4d4143610e5f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/9221ecb4-ea61-46e9-9aab-4d4143610e5f=
%40isocpp.org</a>.<br />
------=_Part_2106_1343454666.1542041663625--
------=_Part_2105_204962882.1542041663625--
.
Author: Balog Pal <pasa@lib.hu>
Date: Tue, 13 Nov 2018 01:09:53 -0800 (PST)
Raw View
------=_Part_406_187789521.1542100193379
Content-Type: multipart/alternative;
boundary="----=_Part_407_1062797873.1542100193379"
------=_Part_407_1062797873.1542100193379
Content-Type: text/plain; charset="UTF-8"
>EWG2. We approve of the general idea that user-defined classes which
follow the Rule of Zero
<https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
should inherit the trivial relocatability of their bases and members.
>Strongly For
I don't see how that makes sense. R0 is based on user-declared spec
functions. Can I do this to break relocability?
struct A {
A* p = this;
A** pp = &p;
};
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/bebbf794-3f04-4de0-9a4f-a50d9c629ffc%40isocpp.org.
------=_Part_407_1062797873.1542100193379
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>>EWG2. We approve of the general idea that user-de=
fined classes which follow the <a href=3D"https://web.archive.org/web/20130=
607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html" =
rel=3D"nofollow" target=3D"_blank">Rule of Zero</a> should inherit the triv=
ial relocatability of their bases and members.</div><div>>Strongly For <=
br></div><div><br></div><div>I don't see how that makes sense. R0 is ba=
sed on user-declared spec functions. Can I do this to break relocability? <=
br></div><div><br></div><div><div style=3D"color: #000000;background-color:=
#fffffe;font-family: Consolas, "><div><span style=3D"font-family: courier =
new, monospace;"><span style=3D"color: #0000ff;">struct</span><span style=
=3D"color: #000000;"> A {</span></span></div><span style=3D"font-family: co=
urier new, monospace;"></span><div><span style=3D"font-family: courier new,=
monospace;"><span style=3D"color: #000000;">A* p =3D </span><span style=3D=
"color: #0000ff;">this</span><span style=3D"color: #000000;">;</span></span=
></div><div><span style=3D"font-family: courier new, monospace;"><span styl=
e=3D"color: #000000;">A** pp =3D &p;</span></span></div><div><span styl=
e=3D"font-family: courier new, monospace;"><span style=3D"color: #000000;">=
};</span></span></div></div><div style=3D"color: #000000;background-color: =
#fffffe;font-family: Consolas, "><br></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/bebbf794-3f04-4de0-9a4f-a50d9c629ffc%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/bebbf794-3f04-4de0-9a4f-a50d9c629ffc=
%40isocpp.org</a>.<br />
------=_Part_407_1062797873.1542100193379--
------=_Part_406_187789521.1542100193379--
.
Author: florian.csdt@gmail.com
Date: Tue, 13 Nov 2018 01:25:02 -0800 (PST)
Raw View
------=_Part_2292_858036748.1542101102531
Content-Type: multipart/alternative;
boundary="----=_Part_2293_805292339.1542101102531"
------=_Part_2293_805292339.1542101102531
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Le mardi 13 novembre 2018 10:09:53 UTC+1, Balog Pal a =C3=A9crit :
>
> >EWG2. We approve of the general idea that user-defined classes which=20
> follow the Rule of Zero=20
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/=
cxx11/2012/08/15/rule-of-zero.html>=20
> should inherit the trivial relocatability of their bases and members.
> >Strongly For=20
>
> I don't see how that makes sense. R0 is based on user-declared spec=20
> functions. Can I do this to break relocability?=20
>
> struct A {
> A* p =3D this;
> A** pp =3D &p;
> };
>
>
Your class A cannot keep its invariants (p points to this, and pp points to=
=20
p) across copy or move. So it's fine in that case to also break on=20
relocation.
For your class to be correct, you would need to write/disable copy and move=
=20
constructors. In that case, rule of zero would not apply and relocability=
=20
would not be inherited.
As defined in this proposal, relocability cannot break a class by default.
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/95e020bf-f1dc-47e2-94b0-ccd1baab856e%40isocpp.or=
g.
------=_Part_2293_805292339.1542101102531
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br>Le mardi 13 novembre 2018 10:09:53 UTC+1, Balog Pal a =
=C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><div>>EWG2. We approve of the general idea that user-defined classes=
which follow the <a href=3D"https://web.archive.org/web/20130607234833/htt=
p://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html" rel=3D"nofoll=
ow" target=3D"_blank" onmousedown=3D"this.href=3D'https://www.google.co=
m/url?q\x3dhttps%3A%2F%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2=
F%2Fflamingdangerzone.com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26s=
a\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';retur=
n true;" onclick=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%=
3A%2F%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdanger=
zone.com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3=
d1\x26usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;">Rule of =
Zero</a> should inherit the trivial relocatability of their bases and membe=
rs.</div><div>>Strongly For <br></div><div><br></div><div>I don't se=
e how that makes sense. R0 is based on user-declared spec functions. Can I =
do this to break relocability? <br></div><div><br></div><div><div><div><spa=
n style=3D"font-family:courier new,monospace"><span style=3D"color:#0000ff"=
>struct</span><span style=3D"color:#000000"> A {</span></span></div><span s=
tyle=3D"font-family:courier new,monospace"></span><div><span style=3D"font-=
family:courier new,monospace"><span style=3D"color:#000000">A* p =3D </span=
><span style=3D"color:#0000ff">this</span><span style=3D"color:#000000">;</=
span></span></div><div><span style=3D"font-family:courier new,monospace"><s=
pan style=3D"color:#000000">A** pp =3D &p;</span></span></div><div><spa=
n style=3D"font-family:courier new,monospace"><span style=3D"color:#000000"=
>};</span></span></div></div><div><br></div></div></div></blockquote><div><=
br></div><div>Your class A cannot keep its invariants (p points to this, an=
d pp points to p) across copy or move. So it's fine in that case to als=
o break on relocation.</div><div>For your class to be correct, you would ne=
ed to write/disable copy and move constructors. In that case, rule of zero =
would not apply and relocability would not be inherited.</div><div><br></di=
v><div>As defined in this proposal, relocability cannot break a class by de=
fault.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/95e020bf-f1dc-47e2-94b0-ccd1baab856e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/95e020bf-f1dc-47e2-94b0-ccd1baab856e=
%40isocpp.org</a>.<br />
------=_Part_2293_805292339.1542101102531--
------=_Part_2292_858036748.1542101102531--
.
Author: Balog Pal <pasa@lib.hu>
Date: Tue, 13 Nov 2018 13:03:44 +0100
Raw View
On 11/13/2018 10:25 AM, florian.csdt@gmail.com wrote:
> Your class A cannot keep its invariants (p points to this, and pp points
> to p) across copy or move. So it's fine in that case to also break on
> relocation.
> For your class to be correct, you would need to write/disable copy and
> move constructors. In that case, rule of zero would not apply and
> relocability would not be inherited.
Right, that is not the good example. I still have a strong feeling that
R0 connects badly to this feature. The other direction looks more
obvious: just the presense of dtor looks completely irrelevant. Majority
of ctors handle different kinds of invariants.
I think I could construct one with virtual inheritance that uses no
user-defined ctors but has an embedded pointer.
As a general note this paper looks intimidatingly overcomplicated. As a
programmer I'd welcome a SIMPLE facility, where I can opt in for
relocability, and the library accounts for that. no composition, no
automatics, no heuristics, UB if I lied -- and the whole paper would fit
on a single page with a poll just to bikeshed the syntax for opt-in.
And the advanced logic can be added later on as real life experience is
gained how people use it. Perfect is enemy of good.
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f861476e-f494-1ee2-f5e2-5d49356e78b7%40lib.hu.
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Tue, 13 Nov 2018 10:50:04 -0500
Raw View
--0000000000002ccc00057a8dc625
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Tue, Nov 13, 2018 at 7:03 AM Balog Pal <pasa@lib.hu> wrote:
> On 11/13/2018 10:25 AM, florian.csdt@gmail.com wrote:
> > Your class A cannot keep its invariants (p points to this, and pp point=
s
> > to p) across copy or move. So it's fine in that case to also break on
> > relocation.
> > For your class to be correct, you would need to write/disable copy and
> > move constructors. In that case, rule of zero would not apply and
> > relocability would not be inherited.
>
> Right, that is not the good example. I still have a strong feeling that
> R0 connects badly to this feature. The other direction looks more
> obvious: just the presense of dtor looks completely irrelevant. Majority
> of ctors handle different kinds of invariants.
>
The behavior of the destructor is important. For example, in a class that
owns a resource, the destructor is what frees that resource.
What distinguishes "relocate" from "move" is that "relocate" consists of
"move *plus destroy* (of the source object)": If we don't consider the
behavior of the destructor, then we're not considering the one thing that
makes "trivially relocatable" different from "trivially move-constructible.=
"
Specifically, *if* a user-defined dtor did *not* disable trivial
relocatability, then `struct CountDestructions { std::string s;
~CountDestructions(); };` would be considered trivially relocatable, when
it clearly is not. (That is: its relocation operation involves running
user-provided mystery code that may have observable side effects.)
I think I could construct one with virtual inheritance that uses no
> user-defined ctors but has an embedded pointer.
>
I would pay to see an example of a class that is_trivially_relocatable by
P1144R0's definition without being actually trivially relocatable. If you
can break P1144, please tell me.
I am not quite confident that my Godbolt implementation is bug-free, but
hey, if you can find an example that breaks on Godbolt, I'll pay up, too.
As a general note this paper looks intimidatingly overcomplicated.
This sounds like a problem; I'd like to fix it. Can you send me an email
off-thread naming the aspects of the paper that are "too complicated"?
The only thing I know to do about it so far, for R1, is that now that R0
has been put into a mailing, it would be acceptable to cut some of the
material and replace it with notes saying "see R0" (for non-normative,
digressive parts such as Section 5 and Appendix B).
> As a
> programmer I'd welcome a SIMPLE facility, where I can opt in for
> relocability, and the library accounts for that. no composition, no
> automatics, no heuristics, UB if I lied -- and the whole paper would fit
> on a single page with a poll just to bikeshed the syntax for opt-in.
>
That wouldn't handle lambdas or primitive struct types such as `struct
Person { std::string name; int age; }`. I guarantee you that you wouldn't
actually be happy with manual annotation. (The paper already alludes to the
perils of manual annotation.)
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#doing=
-it-wrong>
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LF7vGOS-xsftMJdDXUnJ2iPhEPjKV7sov%3DiMRJK=
eG7pQ%40mail.gmail.com.
--0000000000002ccc00057a8dc625
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">On Tue, Nov 13, 2018 at 7:03 AM Balog Pal=
<<a href=3D"mailto:pasa@lib.hu">pasa@lib.hu</a>> wrote:<br><div clas=
s=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px=
0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:=
rgb(204,204,204);padding-left:1ex">On 11/13/2018 10:25 AM, <a href=3D"mailt=
o:florian.csdt@gmail.com" target=3D"_blank">florian.csdt@gmail.com</a> wrot=
e:<br>
> Your class A cannot keep its invariants (p points to this, and pp poin=
ts <br>
> to p) across copy or move. So it's fine in that case to also break=
on <br>
> relocation.<br>
> For your class to be correct, you would need to write/disable copy and=
<br>
> move constructors. In that case, rule of zero would not apply and <br>
> relocability would not be inherited.<br>
<br>
Right, that is not the good example. I still have a strong feeling that <br=
>
R0 connects badly to this feature.=C2=A0 The other direction looks more <br=
>
obvious: just the presense of dtor looks completely irrelevant. Majority <b=
r>
of ctors handle different kinds of invariants.<br></blockquote><div><br></d=
iv><div>The behavior of the destructor is important. For example, in a clas=
s that owns a resource, the destructor is what frees that resource.</div><d=
iv>What distinguishes "relocate" from "move" is that &q=
uot;relocate" consists of "move <i>plus destroy</i>=C2=A0(of the =
source object)": If we don't consider the behavior of the destruct=
or, then we're not considering the one thing that makes "trivially=
relocatable" different from "trivially move-constructible."=
</div><div>Specifically, <i>if</i> a user-defined dtor did <i>not</i> disab=
le trivial relocatability, then `struct CountDestructions { std::string s; =
~CountDestructions(); };` would be considered trivially relocatable, when i=
t clearly is not. (That is: its relocation operation involves running user-=
provided mystery code that may have observable side effects.)</div><div><br=
></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204=
,204);padding-left:1ex">I think I could construct one with virtual inherita=
nce that uses no <br>
user-defined ctors but has an embedded pointer.<br></blockquote><div><br></=
div><div>I would pay to see an example of a class that is_trivially_relocat=
able by P1144R0's definition without being actually trivially relocatab=
le. If you can break P1144, please tell me.</div><div>I am not quite confid=
ent that my Godbolt implementation is bug-free, but hey, if you can find an=
example that breaks on Godbolt, I'll pay up, too.</div><div><br></div>=
<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb=
(204,204,204);padding-left:1ex">As a general note this paper looks intimida=
tingly overcomplicated.</blockquote><div><br></div><div>This sounds like a =
problem; I'd like to fix it. Can you send me an email off-thread naming=
the aspects of the paper that are "too complicated"?</div><div>T=
he only thing I know to do about it so far, for R1, is that now that R0 has=
been put into a mailing, it would be acceptable to cut some of the materia=
l and replace it with notes saying "see R0" (for non-normative, d=
igressive parts such as Section 5 and Appendix B).</div><div><br></div><div=
>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px =
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(2=
04,204,204);padding-left:1ex"> As a <br>
programmer I'd welcome a SIMPLE facility, where I can opt in for <br>
relocability, and the library accounts for that. no composition, no <br>
automatics, no heuristics, UB if I lied -- and the whole paper would fit <b=
r>
on a single page with a poll just to bikeshed the syntax for opt-in.<br></b=
lockquote><div><br></div><div>That wouldn't handle lambdas or primitive=
struct types such as `struct Person { std::string name; int age; }`.=C2=A0=
I guarantee you that you wouldn't actually be happy with manual annota=
tion. (<a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p=
1144r0.html#doing-it-wrong">The paper already alludes to the perils of manu=
al annotation.)</a></div><div><br></div><div>=E2=80=93Arthur</div></div></d=
iv></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LF7vGOS-xsftMJdDXUnJ2iPhEPjKV7=
sov%3DiMRJKeG7pQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LF7vGOS-=
xsftMJdDXUnJ2iPhEPjKV7sov%3DiMRJKeG7pQ%40mail.gmail.com</a>.<br />
--0000000000002ccc00057a8dc625--
.
Author: Balog Pal <pasa@lib.hu>
Date: Tue, 13 Nov 2018 18:47:29 +0100
Raw View
A had the feeling like we are in two completely different
conversations... and that was the case indeed, I located the source.
All along I was talking about trivially relocatable (without pointing it
out, my bad). While the answers were provided in the general relocability.
This may provide some of the explanation of my previous claim on the
"overcomplicated". I just don't see any value from all those other
flavors. Neither from the top of my head nor from the paper. It provides
a good case for the trivial that I agree with and would like in the
language very much. As most of the types I work with are actually such.
And I do move them around in all kinds of operations not limited to
vector::push_back and sort.
What is the benefit of the other stuff? What cares for knowing a type is
nontrivially_throwing relocatable or nontrivially_nothrow_relocatable? I
mean as a separate, named concept, beyond its raw ingredients?
If you know that, and believe it is significant benefit, you need to
emphasize that in the paper bigtime (while benefits of just doing a bulk
big memcpy instead of formal constructions and destructions are IMO
evident.)
Also providing a safe set of rules that can figure out
trivial_relocation for an aggregate/composite should be easier. Both to
compose and evaluate that is quite important estimating chances to get
into the standard and at all and the overall time it would take.
Even at being at the start of the C++23 timeframe it is a factor worth
considering. Also if you feel strongly about the more general approach,
it can be added in a next paper after this is accepted.
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/d5772b99-df6a-8152-a71a-8df1119b497c%40lib.hu.
.
Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Tue, 13 Nov 2018 12:48:55 -0500
Raw View
On 11/11/2018 20.35, Arthur O'Dwyer wrote:
> EWG1. We approve of the general idea that user-defined classes should be
> able to warrant their own trivial relocatability via a standard mechanism.
SF.
> EWG2. We approve of the general idea that user-defined classes which follow
> the Rule of Zero
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
> should inherit the trivial relocatability of their bases and members.
F.
> EWG3. Nobody should be able to warrant the trivial relocatability of class
> `C` except for class `C` itself (i.e., we do not want to see a
> customization point analogous to `std::hash`).
N leaning to A.
While this makes sense *in principle*, in practice it's not unusual to
want/need this optimization for a class which is outside of your control.
> EWG4. A class should be able to warrant its own trivial relocatability via
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
N leaning to A.
One of the reasons we tend to talk about "destructive move" is that
there are lifetime implications. It's not clear that this can be
correctly expressed via an attribute. It seems like users would need to
call a special flavor of dtor.
(I'm also far from convinced this is an "acceptable" use of an attribute.)
> EWG5. A class should be able to warrant its own trivial relocatability via
> some attribute, but not necessarily under that exact name.
N leaning to A.
This is an overly leading question; it assumes that "an attribute" is
the correct way to express trivial relocatability.
> EWG6. A class should be able to warrant its own trivial relocatability as
> proposed in this paper, but we prefer to see a contextual keyword rather
> than an attribute.
Strongly N.
Again, this is too leading. The correct solution might be:
class Foo
{
Foo(Foo~ other) = default; // relocating ctor
...
};
....which isn't really "a contextual keyword".
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> added to the `<type_traits>` header, the programmer should be permitted to
> specialize it for program-defined types (i.e., we want to see that trait
> itself become a customization point analogous to `std::hash`).
Weakly F.
This seems redundant with EWG3.
> EWG8. Trivial relocatability should be assumed by default. Classes such as
> those in Appendix C
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples>
> should indicate their non-trivial relocatability via an opt-in mechanism.
If you *literally* meant "all" classes, vs. e.g. those that meet some
reasonable criteria, then SA leaning toward OMDB.
> EWG9. To simplify conditionally trivial relocation
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional>,
> if an attribute with the semantics of `[[trivially_relocatable]]` is added,
> it should take a boolean argument.
I'm not even going to answer this one. As others, *way* too leading as
far as assuming a particular approach which does *not* have consensus.
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)` should
> be added to the `<memory>` header, as proposed in this paper.
Weakly F.
> LEWG11. The type trait `is_relocatable<T>` should be added to the
> `<type_traits>` header, as proposed in this paper.
N.
> LEWG12. If `is_relocatable<T>` is added, then we should also add
> `is_nothrow_relocatable<T>`, as proposed in this paper.
N.
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to the
> `<type_traits>` header, under that exact name, as proposed in this paper.
F.
In practice, I'm not sure how useful the other two will be.
> LEWG14. We approve of a trait with the semantics of
> `is_trivially_relocatable<T>`, but possibly under a different name. (For
> example, `is_bitwise_relocatable`.)
F, I guess.
Seems a bit redundant with LEWG13, but I guess the point is for people
that want to complain about the color of the bikeshed.
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,
> then the type trait `is_trivially_swappable<T>` should also be added to the
> `<type_traits>` header.
N.
--
Matthew
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/e6595d7c-b048-49cf-557c-8f8645652b1c%40gmail.com.
.
Author: mihailnajdenov@gmail.com
Date: Tue, 13 Nov 2018 11:24:10 -0800 (PST)
Raw View
------=_Part_886_1621654533.1542137050186
Content-Type: multipart/alternative;
boundary="----=_Part_887_1930126827.1542137050186"
------=_Part_887_1930126827.1542137050186
Content-Type: text/plain; charset="UTF-8"
Matthew, the paper is not about "destructive move".
In a way the paper is "what can do after dmove has failed" and "let's
standardize established practices".
On Tuesday, November 13, 2018 at 7:48:59 PM UTC+2, Matthew Woehlke wrote:
>
> On 11/11/2018 20.35, Arthur O'Dwyer wrote:
> > EWG1. We approve of the general idea that user-defined classes should be
> > able to warrant their own trivial relocatability via a standard
> mechanism.
>
> SF.
>
> > EWG2. We approve of the general idea that user-defined classes which
> follow
> > the Rule of Zero
> > <
> https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
>
> > should inherit the trivial relocatability of their bases and members.
>
> F.
>
> > EWG3. Nobody should be able to warrant the trivial relocatability of
> class
> > `C` except for class `C` itself (i.e., we do not want to see a
> > customization point analogous to `std::hash`).
>
> N leaning to A.
>
> While this makes sense *in principle*, in practice it's not unusual to
> want/need this optimization for a class which is outside of your control.
>
> > EWG4. A class should be able to warrant its own trivial relocatability
> via
> > the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
> N leaning to A.
>
> One of the reasons we tend to talk about "destructive move" is that
> there are lifetime implications. It's not clear that this can be
> correctly expressed via an attribute. It seems like users would need to
> call a special flavor of dtor.
>
> (I'm also far from convinced this is an "acceptable" use of an attribute.)
>
> > EWG5. A class should be able to warrant its own trivial relocatability
> via
> > some attribute, but not necessarily under that exact name.
>
> N leaning to A.
>
> This is an overly leading question; it assumes that "an attribute" is
> the correct way to express trivial relocatability.
>
> > EWG6. A class should be able to warrant its own trivial relocatability
> as
> > proposed in this paper, but we prefer to see a contextual keyword rather
> > than an attribute.
>
> Strongly N.
>
> Again, this is too leading. The correct solution might be:
>
> class Foo
> {
> Foo(Foo~ other) = default; // relocating ctor
> ...
> };
>
> ...which isn't really "a contextual keyword".
>
> > EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> > added to the `<type_traits>` header, the programmer should be permitted
> to
> > specialize it for program-defined types (i.e., we want to see that trait
> > itself become a customization point analogous to `std::hash`).
>
> Weakly F.
>
> This seems redundant with EWG3.
>
> > EWG8. Trivial relocatability should be assumed by default. Classes such
> as
> > those in Appendix C
> > <
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples>
>
> > should indicate their non-trivial relocatability via an opt-in
> mechanism.
>
> If you *literally* meant "all" classes, vs. e.g. those that meet some
> reasonable criteria, then SA leaning toward OMDB.
>
> > EWG9. To simplify conditionally trivial relocation
> > <
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional>,
>
> > if an attribute with the semantics of `[[trivially_relocatable]]` is
> added,
> > it should take a boolean argument.
>
> I'm not even going to answer this one. As others, *way* too leading as
> far as assuming a particular approach which does *not* have consensus.
>
> > LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)`
> should
> > be added to the `<memory>` header, as proposed in this paper.
>
> Weakly F.
>
> > LEWG11. The type trait `is_relocatable<T>` should be added to the
> > `<type_traits>` header, as proposed in this paper.
>
> N.
>
> > LEWG12. If `is_relocatable<T>` is added, then we should also add
> > `is_nothrow_relocatable<T>`, as proposed in this paper.
>
> N.
>
> > LEWG13. The type trait `is_trivially_relocatable<T>` should be added to
> the
> > `<type_traits>` header, under that exact name, as proposed in this
> paper.
>
> F.
>
> In practice, I'm not sure how useful the other two will be.
>
> > LEWG14. We approve of a trait with the semantics of
> > `is_trivially_relocatable<T>`, but possibly under a different name. (For
> > example, `is_bitwise_relocatable`.)
>
> F, I guess.
>
> Seems a bit redundant with LEWG13, but I guess the point is for people
> that want to complain about the color of the bikeshed.
>
> > LEWG15. If `is_trivially_relocatable<T>` is added, under that exact
> name,
> > then the type trait `is_trivially_swappable<T>` should also be added to
> the
> > `<type_traits>` header.
>
> N.
>
> --
> Matthew
>
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/c8d925b6-5692-41f5-b097-9c874d35bdeb%40isocpp.org.
------=_Part_887_1930126827.1542137050186
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Matthew, the paper is not about "destructive move&quo=
t;.=C2=A0<div>In a way the paper is "what can do after dmove has faile=
d" and "let's standardize established practices".<div><b=
r></div><div><br>On Tuesday, November 13, 2018 at 7:48:59 PM UTC+2, Matthew=
Woehlke wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 11/11/2018 2=
0.35, Arthur O'Dwyer wrote:
<br>> EWG1. We approve of the general idea that user-defined classes sho=
uld be=20
<br>> able to warrant their own trivial relocatability via a standard me=
chanism.
<br>
<br>SF.
<br>
<br>> EWG2. We approve of the general idea that user-defined classes whi=
ch follow=20
<br>> the Rule of Zero=20
<br>> <<a href=3D"https://web.archive.org/web/20130607234833/http://f=
lamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html" target=3D"_blank" =
rel=3D"nofollow" onmousedown=3D"this.href=3D'https://www.google.com/url=
?q\x3dhttps%3A%2F%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Ff=
lamingdangerzone.com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3d=
D\x26sntz\x3d1\x26usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return tru=
e;" onclick=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F=
%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.=
com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x2=
6usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;">https://web.a=
rchive.org/web/<wbr>20130607234833/http://<wbr>flamingdangerzone.com/cxx11/=
<wbr>2012/08/15/rule-of-zero.html</a>>=20
<br>> should inherit the trivial relocatability of their bases and membe=
rs.
<br>
<br>F.
<br>
<br>> EWG3. Nobody should be able to warrant the trivial relocatability =
of class=20
<br>> `C` except for class `C` itself (i.e., we do not want to see a=20
<br>> customization point analogous to `std::hash`).
<br>
<br>N leaning to A.
<br>
<br>While this makes sense *in principle*, in practice it's not unusual=
to
<br>want/need this optimization for a class which is outside of your contro=
l.
<br>
<br>> EWG4. A class should be able to warrant its own trivial relocatabi=
lity via=20
<br>> the attribute `[[trivially_relocatable]]`, as proposed in this pap=
er.
<br>
<br>N leaning to A.
<br>
<br>One of the reasons we tend to talk about "destructive move" i=
s that
<br>there are lifetime implications. It's not clear that this can be
<br>correctly expressed via an attribute. It seems like users would need to
<br>call a special flavor of dtor.
<br>
<br>(I'm also far from convinced this is an "acceptable" use =
of an attribute.)
<br>
<br>> EWG5. A class should be able to warrant its own trivial relocatabi=
lity via=20
<br>> some attribute, but not necessarily under that exact name.
<br>
<br>N leaning to A.
<br>
<br>This is an overly leading question; it assumes that "an attribute&=
quot; is
<br>the correct way to express trivial relocatability.
<br>
<br>> EWG6. A class should be able to warrant its own trivial relocatabi=
lity as=20
<br>> proposed in this paper, but we prefer to see a contextual keyword =
rather=20
<br>> than an attribute.
<br>
<br>Strongly N.
<br>
<br>Again, this is too leading. The correct solution might be:
<br>
<br>=C2=A0 class Foo
<br>=C2=A0 {
<br>=C2=A0 =C2=A0 Foo(Foo~ other) =3D default; // relocating ctor
<br>=C2=A0 =C2=A0 ...
<br>=C2=A0 };
<br>
<br>...which isn't really "a contextual keyword".
<br>
<br>> EWG7. If a trait with the semantics of `is_trivially_relocatable&l=
t;T>` is=20
<br>> added to the `<type_traits>` header, the programmer should b=
e permitted to=20
<br>> specialize it for program-defined types (i.e., we want to see that=
trait=20
<br>> itself become a customization point analogous to `std::hash`).
<br>
<br>Weakly F.
<br>
<br>This seems redundant with EWG3.
<br>
<br>> EWG8. Trivial relocatability should be assumed by default. Classes=
such as=20
<br>> those in Appendix C=20
<br>> <<a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/=
2018/p1144r0.html#non-trivial-samples" target=3D"_blank" rel=3D"nofollow" o=
nmousedown=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2F=
www.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html=
%23non-trivial-samples\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7=
NQLChnFEyQ6nVN7A';return true;" onclick=3D"this.href=3D'http://www.=
google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdo=
cs%2Fpapers%2F2018%2Fp1144r0.html%23non-trivial-samples\x26sa\x3dD\x26sntz\=
x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChnFEyQ6nVN7A';return true;">http:/=
/www.open-std.org/jtc1/<wbr>sc22/wg21/docs/papers/2018/<wbr>p1144r0.html#no=
n-trivial-<wbr>samples</a>>=20
<br>> should indicate their non-trivial relocatability via an opt-in mec=
hanism.
<br>
<br>If you *literally* meant "all" classes, vs. e.g. those that m=
eet some
<br>reasonable criteria, then SA leaning toward OMDB.
<br>
<br>> EWG9. To simplify conditionally trivial relocation=20
<br>> <<a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/=
2018/p1144r0.html#sample-conditional" target=3D"_blank" rel=3D"nofollow" on=
mousedown=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fw=
ww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%=
23sample-conditional\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD9=
6leOeCAJ5_EdtQ';return true;" onclick=3D"this.href=3D'http://www.go=
ogle.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs=
%2Fpapers%2F2018%2Fp1144r0.html%23sample-conditional\x26sa\x3dD\x26sntz\x3d=
1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ';return true;">http://ww=
w.open-std.org/jtc1/<wbr>sc22/wg21/docs/papers/2018/<wbr>p1144r0.html#sampl=
e-<wbr>conditional</a>>,=20
<br>> if an attribute with the semantics of `[[trivially_relocatable]]` =
is added,=20
<br>> it should take a boolean argument.
<br>
<br>I'm not even going to answer this one. As others, *way* too leading=
as
<br>far as assuming a particular approach which does *not* have consensus.
<br>
<br>> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first=
)` should=20
<br>> be added to the `<memory>` header, as proposed in this paper=
..
<br>
<br>Weakly F.
<br>
<br>> LEWG11. The type trait `is_relocatable<T>` should be added t=
o the=20
<br>> `<type_traits>` header, as proposed in this paper.
<br>
<br>N.
<br>
<br>> LEWG12. If `is_relocatable<T>` is added, then we should also=
add=20
<br>> `is_nothrow_relocatable<T>`, as proposed in this paper.
<br>
<br>N.
<br>
<br>> LEWG13. The type trait `is_trivially_relocatable<T>` should =
be added to the=20
<br>> `<type_traits>` header, under that exact name, as proposed i=
n this paper.
<br>
<br>F.
<br>
<br>In practice, I'm not sure how useful the other two will be.
<br>
<br>> LEWG14. We approve of a trait with the semantics of=20
<br>> `is_trivially_relocatable<T>`, but possibly under a differen=
t name. (For=20
<br>> example, `is_bitwise_relocatable`.)
<br>
<br>F, I guess.
<br>
<br>Seems a bit redundant with LEWG13, but I guess the point is for people
<br>that want to complain about the color of the bikeshed.
<br>
<br>> LEWG15. If `is_trivially_relocatable<T>` is added, under tha=
t exact name,=20
<br>> then the type trait `is_trivially_swappable<T>` should also =
be added to the=20
<br>> `<type_traits>` header.
<br>
<br>N.
<br>
<br>--=20
<br>Matthew
<br></blockquote></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/c8d925b6-5692-41f5-b097-9c874d35bdeb%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/c8d925b6-5692-41f5-b097-9c874d35bdeb=
%40isocpp.org</a>.<br />
------=_Part_887_1930126827.1542137050186--
------=_Part_886_1621654533.1542137050186--
.
Author: mihailnajdenov@gmail.com
Date: Tue, 13 Nov 2018 12:23:48 -0800 (PST)
Raw View
------=_Part_2845_1972397069.1542140628956
Content-Type: multipart/alternative;
boundary="----=_Part_2846_2101925531.1542140628956"
------=_Part_2846_2101925531.1542140628956
Content-Type: text/plain; charset="UTF-8"
On Tuesday, November 13, 2018 at 7:47:33 PM UTC+2, Balog Pal wrote:
>
> A had the feeling like we are in two completely different
> conversations... and that was the case indeed, I located the source.
>
> All along I was talking about trivially relocatable (without pointing it
> out, my bad). While the answers were provided in the general relocability.
>
> This may provide some of the explanation of my previous claim on the
> "overcomplicated". I just don't see any value from all those other
> flavors. Neither from the top of my head nor from the paper. It provides
> a good case for the trivial that I agree with and would like in the
> language very much. As most of the types I work with are actually such.
> And I do move them around in all kinds of operations not limited to
> vector::push_back and sort.
>
> What is the benefit of the other stuff? What cares for knowing a type is
> nontrivially_throwing relocatable or nontrivially_nothrow_relocatable? I
> mean as a separate, named concept, beyond its raw ingredients?
>
Mildly agree.
I wonder could we just drop trivially and go with relocatable only to mean
a trivial one and have no non-trivial relocatable concept on its own
> If you know that, and believe it is significant benefit, you need to
> emphasize that in the paper bigtime (while benefits of just doing a bulk
> big memcpy instead of formal constructions and destructions are IMO
> evident.)
Also providing a safe set of rules that can figure out
> trivial_relocation for an aggregate/composite should be easier. Both to
> compose and evaluate that is quite important estimating chances to get
> into the standard and at all and the overall time it would take.
> Even at being at the start of the C++23 timeframe it is a factor worth
> considering. Also if you feel strongly about the more general approach,
> it can be added in a next paper after this is accepted.
>
>
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/952a0e78-0541-475b-9399-93ad883918bf%40isocpp.org.
------=_Part_2846_2101925531.1542140628956
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Tuesday, November 13, 2018 at 7:47:33 PM UTC+2,=
Balog Pal wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">A had the fee=
ling like we are in two completely different=20
<br>conversations... and that was the case indeed, I located the source.
<br>
<br>All along I was talking about trivially relocatable (without pointing i=
t=20
<br>out, my bad). While the answers were provided in the general relocabili=
ty.
<br>
<br>This may provide some of the explanation of my previous claim on the=20
<br>"overcomplicated". I just don't see any value from all th=
ose other=20
<br>flavors. Neither from the top of my head nor from the paper. It provide=
s=20
<br>a good case for the trivial that I agree with and would like in the=20
<br>language very much. =C2=A0As most of the types I work with are actually=
such.=20
<br>And I do move them around in all kinds of operations not limited to=20
<br>vector::push_back and sort.
<br>
<br>What is the benefit of the other stuff? What cares for knowing a type i=
s=20
<br>nontrivially_throwing relocatable or nontrivially_nothrow_<wbr>relocata=
ble? I=20
<br>mean as a separate, named concept, beyond its raw ingredients?
<br></blockquote><div><br></div><div>Mildly agree.</div><div><br></div><div=
>I wonder could we just drop trivially and go with relocatable only to mean=
a trivial one and have no non-trivial relocatable concept on its own</div>=
<div><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>If you know that, and believe it is significant benefit, you need to=20
<br>emphasize that in the paper bigtime (while benefits of just doing a bul=
k=20
<br>big memcpy instead of formal constructions and destructions are IMO=20
<br>evident.)=C2=A0</blockquote><blockquote class=3D"gmail_quote" style=3D"=
margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;=
">Also providing a safe set of rules that can figure out=20
<br>trivial_relocation for an aggregate/composite should be easier. Both to=
=20
<br>compose and evaluate that is quite important estimating chances to get=
=20
<br>into the standard and at all and the overall time it would take.=C2=A0=
=C2=A0</blockquote><blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>Even at being at the start of the C++23 timeframe it is a factor worth=
=20
<br>considering. Also if you feel strongly about the more general approach,=
=20
<br>it can be added in a next paper after this is accepted.
<br>
<br></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/952a0e78-0541-475b-9399-93ad883918bf%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/952a0e78-0541-475b-9399-93ad883918bf=
%40isocpp.org</a>.<br />
------=_Part_2846_2101925531.1542140628956--
------=_Part_2845_1972397069.1542140628956--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Tue, 13 Nov 2018 16:19:56 -0500
Raw View
--000000000000d67ca8057a926117
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Tue, Nov 13, 2018 at 3:23 PM <mihailnajdenov@gmail.com> wrote:
> On Tuesday, November 13, 2018 at 7:47:33 PM UTC+2, Balog Pal wrote:
>>
>> A had the feeling like we are in two completely different
>> conversations... and that was the case indeed, I located the source.
>>
>> All along I was talking about trivially relocatable (without pointing it
>> out, my bad). While the answers were provided in the general
>> relocability.
>>
>> This may provide some of the explanation of my previous claim on the
>> "overcomplicated". I just don't see any value from all those other
>> flavors. Neither from the top of my head nor from the paper. It provides
>> a good case for the trivial that I agree with and would like in the
>> language very much. As most of the types I work with are actually such.
>> And I do move them around in all kinds of operations not limited to
>> vector::push_back and sort.
>>
>> What is the benefit of the other stuff?
>
>
My thinking was that it is useful to give a proper name to the "relocate"
operation =E2=80=94 the verb itself =E2=80=94 separately from the question =
of whether the
operation is trivial or not. Compare "destructible" versus "trivially
destructible"; I believe the case is exactly analogous. Personally, I
would strongly object to a proposal that was "P1144R0, but with
is_trivially_relocatable_v renamed to just is_relocatable_v." (However,
I've seen other informal proposals, such as I think Florian's, where
"relocate" was being introduced as a whole new verb with a completely
different meaning, and in which the operation was a black box with no
finer-grained adverb structure. E.g. in Pablo's N4158 "Destructive Move,"
<https://quuxplusone.github.io/blog/2018/09/28/trivially-relocatable-vs-des=
tructive-movable/>
there
was no way to ask whether the operation was "trivial."
So P1144R0 provides the "whole relocatability package" =E2=80=94 everything=
the
programmer could need in order to work with relocatability. This means the
uninitialized-memory algorithm *and* the trio of type traits. You can do
the operation; you can ask if you can do the operation; and you can ask
whether the operation is nothrow or trivial, just like with "constructible"
and "destructible" and "swappable" and so on.
What cares for knowing a type is
>> nontrivially_throwing relocatable or nontrivially_nothrow_relocatable? I
>> mean as a separate, named concept, beyond its raw ingredients?
>
>
It is at least possible for the user-programmer to build
`is_nothrow_relocatable` and `is_relocatable` by himself, using the
existing building blocks `is_nothrow_{con,de}structible` and
`is_{con,de}structible`. So we technically don't need those type traits.
`is_nothrow_relocatable` is useful for `vector::resize`. To do resize at
all, our `T` must be relocatable. We'll do a loop move-constructing, and
then a second loop destructing. But if our `T` is nothrow relocatable, then
we can do a single loop relocating (that is, move-constructing and
destructing, element by element); this will be cache-friendlier. But if our
`T` is trivially relocatable, then we don't need any loop, and we just do a
single memcpy.
(Here please ignore the stupid party tricks `std::vector` does with
move_if_noexcept on copyable types. Let's either assume all our types are
move-only, or assume we wrote our own sane `vector` class.)
I admit I am worried about the meaning of `is_nothrow_relocatable`. Suppose
I have
struct [[trivially_relocatable]] Cat {
Cat(Cat&&) noexcept(false); // might throw
~Cat();
};
This `Cat` is relocatable, and it is trivially relocatable. Is it "nothrow
relocatable"? If we build `is_nothrow_relocatable` ourselves out of
`is_nothrow_move_constructible` and `is_nothrow_destructible`, then we'll
say `Cat` is NOT nothrow relocatable. And in fact it would be dangerous for
vector::resize to use a single loop instead of a double loop. But if
vector::resize uses `memcpy` =E2=80=94 which it is permitted to do, in `Cat=
`'s case
=E2=80=94 then the whole operation will definitely be nothrow in practice.
I think the only sane solution is to say that `Cat` is NOT nothrow
relocatable, even though it is trivially relocatable.
One way out of the dilemma would be to eliminate is_nothrow_relocatable
(and is_relocatable) from the proposal. But I think it doesn't make any
sense to eliminate any single piece out of the jigsaw puzzle, if that
elimination would leave a very obvious puzzle-piece-shaped hole that any
user-programmer could just fill back in. If we leave holes, we should make
sure they are not puzzle-piece-shaped. :P
If you know that, and believe it is significant benefit, you need to
>> emphasize that in the paper bigtime (while benefits of just doing a bulk
>> big memcpy instead of formal constructions and destructions are IMO
>> evident.)
>
>
The benefit of is_nothrow_relocatable is much much smaller, but I think
it's there.
In fact, that's pretty much the only benefit that Pablo's N4158 was going
to get, and it was well-received enough to get an R1.
Also providing a safe set of rules that can figure out
>> trivial_relocation for an aggregate/composite should be easier.
>
>
Can you elaborate on this? (i.e.: I think you're wrong.)
The set of rules in P1144R0 section 4.4
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#wordi=
ng-inheritance>
is specifically to deal with "trivially relocatable," so they wouldn't get
any shorter or simpler. P1144 doesn't provide, and doesn't need to
provide, any other set of rules to deal with "relocatable" or "nothrow
relocatable," because those fall out of the existing type system completely
naturally.
My continued thanks for this discussion! :)
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LMfugSPWhARwb%2BkDQZNjBHGSSm%3DJsi9SWbX%2=
B5ZWDvsSw%40mail.gmail.com.
--000000000000d67ca8057a926117
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">On Tue, Nov 13, 2018 at 3:23 PM <<a hr=
ef=3D"mailto:mihailnajdenov@gmail.com">mihailnajdenov@gmail.com</a>> wro=
te:<br><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;=
border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr">On Tu=
esday, November 13, 2018 at 7:47:33 PM UTC+2, Balog Pal wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1p=
x;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1=
ex">A had the feeling like we are in two completely different=20
<br>conversations... and that was the case indeed, I located the source.
<br>
<br>All along I was talking about trivially relocatable (without pointing i=
t=20
<br>out, my bad). While the answers were provided in the general relocabili=
ty.
<br>
<br>This may provide some of the explanation of my previous claim on the=20
<br>"overcomplicated". I just don't see any value from all th=
ose other=20
<br>flavors. Neither from the top of my head nor from the paper. It provide=
s=20
<br>a good case for the trivial that I agree with and would like in the=20
<br>language very much.=C2=A0 As most of the types I work with are actually=
such.=20
<br>And I do move them around in all kinds of operations not limited to=20
<br>vector::push_back and sort.
<br>
<br>What is the benefit of the other stuff?</blockquote></div></blockquote>=
<div><br></div><div>My thinking was that it is useful to give a proper name=
to the "relocate" operation =E2=80=94 the verb itself =E2=80=94 =
separately from the question of whether the operation is trivial or not. Co=
mpare "destructible" versus "trivially destructible"; I=
believe the case is exactly analogous.=C2=A0 Personally, I would strongly =
object to a proposal that was "P1144R0, but with is_trivially_relocata=
ble_v renamed to just is_relocatable_v." =C2=A0(However, I've seen=
other informal proposals, such as I think Florian's, where "reloc=
ate" was being introduced as a whole new verb with a completely differ=
ent meaning, and in which the operation was a black box with no finer-grain=
ed adverb structure. E.g.=C2=A0<a href=3D"https://quuxplusone.github.io/blo=
g/2018/09/28/trivially-relocatable-vs-destructive-movable/">in Pablo's =
N4158 "Destructive Move,"</a>=C2=A0there was no way to ask whethe=
r the operation was "trivial."</div><div><br></div><div>So P1144R=
0 provides the "whole relocatability package" =E2=80=94 everythin=
g the programmer could need in order to work with relocatability. This mean=
s the uninitialized-memory algorithm <i>and</i> the trio of type traits. Yo=
u can do the operation; you can ask if you can do the operation; and you ca=
n ask whether the operation is nothrow or trivial, just like with "con=
structible" and "destructible" and "swappable" and=
so on.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-l=
eft-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1p=
x;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1=
ex"> What cares for knowing a type is=20
<br>nontrivially_throwing relocatable or nontrivially_nothrow_relocatable? =
I=20
<br>mean as a separate, named concept, beyond its raw ingredients?</blockqu=
ote></div></blockquote><div><br></div><div>It is at least possible for the =
user-programmer to build `is_nothrow_relocatable` and `is_relocatable` by h=
imself, using the existing building blocks `is_nothrow_{con,de}structible` =
and `is_{con,de}structible`. So we technically don't need those type tr=
aits.</div><div><br></div><div>`is_nothrow_relocatable` is useful for `vect=
or::resize`. To do resize at all, our `T` must be relocatable. We'll do=
a loop move-constructing, and then a second loop destructing. But if our `=
T` is nothrow relocatable, then we can do a single loop relocating (that is=
, move-constructing and destructing, element by element); this will be cach=
e-friendlier. But if our `T` is trivially relocatable, then we don't ne=
ed any loop, and we just do a single memcpy.</div><div><br></div><div>(Here=
please ignore the stupid party tricks `std::vector` does with move_if_noex=
cept on copyable types. Let's either assume all our types are move-only=
, or assume we wrote our own sane `vector` class.)</div><div><br></div><div=
>I admit I am worried about the meaning of `is_nothrow_relocatable`. Suppos=
e I have</div><div><br></div><div>=C2=A0 =C2=A0 struct [[trivially_relocata=
ble]] Cat {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 Cat(Cat&&) noexce=
pt(false); =C2=A0// might throw</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ~Cat(=
);</div><div>=C2=A0 =C2=A0 };</div><div><br></div><div>This `Cat` is reloca=
table, and it is trivially relocatable. Is it "nothrow relocatable&quo=
t;?=C2=A0 If we build `is_nothrow_relocatable` ourselves out of `is_nothrow=
_move_constructible` and `is_nothrow_destructible`, then we'll say `Cat=
` is NOT nothrow relocatable. And in fact it would be dangerous for vector:=
:resize to use a single loop instead of a double loop. But if vector::resiz=
e uses `memcpy` =E2=80=94 which it is permitted to do, in `Cat`'s case =
=E2=80=94 then the whole operation will definitely be nothrow in practice.<=
/div><div>I think the only sane solution is to say that `Cat` is NOT nothro=
w relocatable, even though it is trivially relocatable.</div><div><br></div=
><div>One way out of the dilemma would be to eliminate is_nothrow_relocatab=
le (and is_relocatable) from the proposal.=C2=A0 But I think it doesn't=
make any sense to eliminate any single piece out of the jigsaw puzzle, if =
that elimination would leave a very obvious puzzle-piece-shaped hole that a=
ny user-programmer could just fill back in.=C2=A0 If we leave holes, we sho=
uld make sure they are not puzzle-piece-shaped. :P</div><div><br></div><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left=
-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);paddi=
ng-left:1ex"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border=
-left-color:rgb(204,204,204);padding-left:1ex">If you know that, and believ=
e it is significant benefit, you need to=20
<br>emphasize that in the paper bigtime (while benefits of just doing a bul=
k=20
<br>big memcpy instead of formal constructions and destructions are IMO=20
<br>evident.)</blockquote></div></blockquote><div><br></div><div>The benefi=
t of is_nothrow_relocatable is much much smaller, but I think it's ther=
e.</div><div>In fact, that's pretty much the only benefit that Pablo=
9;s N4158 was going to get, and it was well-received enough to get an R1.</=
div><div><br></div><div><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;=
border-left-color:rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><bloc=
kquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-=
width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);paddin=
g-left:1ex">Also providing a safe set of rules that can figure out=20
<br>trivial_relocation for an aggregate/composite should be easier.</blockq=
uote></div></blockquote><div><br></div><div>Can you elaborate on this? (i.e=
..: I think you're wrong.)</div><div>The set of rules in <a href=3D"http=
://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#wording-in=
heritance">P1144R0 section 4.4</a> is specifically to deal with "trivi=
ally relocatable," so they wouldn't get any shorter or simpler.=C2=
=A0 P1144 doesn't provide, and doesn't need to provide, any other s=
et of rules to deal with "relocatable" or "nothrow relocatab=
le," because those fall out of the existing type system completely nat=
urally.</div><div><br></div><div>My continued thanks for this discussion! :=
)</div><div>=E2=80=93Arthur</div></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LMfugSPWhARwb%2BkDQZNjBHGSSm%3=
DJsi9SWbX%2B5ZWDvsSw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LMfu=
gSPWhARwb%2BkDQZNjBHGSSm%3DJsi9SWbX%2B5ZWDvsSw%40mail.gmail.com</a>.<br />
--000000000000d67ca8057a926117--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Tue, 13 Nov 2018 16:55:14 -0500
Raw View
--000000000000082140057a92e0c6
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Tue, Nov 13, 2018 at 12:48 PM Matthew Woehlke <mwoehlke.floss@gmail.com>
wrote:
> On 11/11/2018 20.35, Arthur O'Dwyer wrote:
> > EWG3. Nobody should be able to warrant the trivial relocatability of
> class
> > `C` except for class `C` itself (i.e., we do not want to see a
> > customization point analogous to `std::hash`).
>
> N leaning to A.
>
> While this makes sense *in principle*, in practice it's not unusual to
> want/need this optimization for a class which is outside of your control.
>
Many thanks for your !votes, even those I might argue with; I have recorded
them. :)
I don't want to appear argumentative, but I do want to present my proposed
workaround for dealing with this problem:
std::vector<thirdparty::SharedPtr> vec; // oops, doesn't get the
memcpy optimization
vec.emplace_back(...); // oops
template<class T> struct [[trivially_relocatable]] TR : public T {
using T::T; };
std::vector<TR<thirdparty::SharedPtr>> tvec; // OK, gets the memcpy
optimization
tvec.emplace_back(...); // OK
This is definitely a "workaround," not a good practice; but personally I'd
rather see this workaround in a few places (for a few years) than see a
customization point put into the Standard (forever).
> EWG4. A class should be able to warrant its own trivial relocatability
> via
> > the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
> N leaning to A.
>
> One of the reasons we tend to talk about "destructive move" is that
> there are lifetime implications. It's not clear that this can be
> correctly expressed via an attribute. It seems like users would need to
> call a special flavor of dtor.
>
I recorded this as "N", although I can revise it to "A" if you want.
The intent of EWG4 is to ask if you agree *with the statement*. If your
opinion is that you don't want P1144's attribute because you want a special
flavor of destructor *instead*, then that is a perfectly valid reason to
vote "A". Or if you don't want P1144's attribute because you don't like
attributes. Or if you don't like P1144's attribute because it's named
wrong. Or really any *reason*. The poll is just whether you agree or
disagree with the statement as written.
Personally I don't think you'll ever get a special flavor of destructor in
C++. Certainly I don't know how to get that. But it's a valid motivation
for anyone's "A" vote (*contra* to what I think Mihail was saying).
(I'm also far from convinced this is an "acceptable" use of an attribute.)
>
The results for EWG5 and EWG6 should give some guidance there. EWG4/EWG5
differentiate "I like your attribute approach but want to bikeshed the
name"; EWG5/EWG6 differentiate "I like the general approach but want to
bikeshed the choice of an attribute vs. a keyword."
As with EWG4: If you want to express "I *don't* think a class should be
able to warrant its etc. etc. via etc. etc.," then you'd vote "A" or "SA".
> EWG6. A class should be able to warrant its own trivial relocatability as
> > proposed in this paper, but we prefer to see a contextual keyword rathe=
r
> > than an attribute.
>
> Strongly N.
>
> Again, this is too leading. The correct solution might be:
>
> class Foo
> {
> Foo(Foo~ other) =3D default; // relocating ctor
> ...
> };
>
> ...which isn't really "a contextual keyword".
>
More relevantly, that isn't remotely "as proposed in this paper"! If you
disagree that a class should be able to etc. etc. *as proposed in this
paper,* then you should be voting "A" on many of these.
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> > added to the `<type_traits>` header, the programmer should be permitted
> to
> > specialize it for program-defined types (i.e., we want to see that trai=
t
> > itself become a customization point analogous to `std::hash`).
>
> Weakly F.
>
> This seems redundant with EWG3.
>
EWG3 is about the existence of *some* customization mechanism not
controlled by the class author.
EWG7 is about the desirability of letting the user specialize anything out
of <type_traits>.
(Personally, I'm "OMDB" on EWG7. See my blog
<https://quuxplusone.github.io/blog/tags/#customization-points> for my
confidently held theory of customization point design.)
> EWG8. Trivial relocatability should be assumed by default. Classes such
> as
> > those in Appendix C
> > <
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-=
trivial-samples>
>
> > should indicate their non-trivial relocatability via an opt-in mechanis=
m.
>
> If you *literally* meant "all" classes, vs. e.g. those that meet some
> reasonable criteria, then SA leaning toward OMDB.
>
Yes, I did. "SA" recorded. :)
Tangentially, I am curious what you would consider "some reasonable
criteria."
> EWG9. To simplify conditionally trivial relocation
> > <
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#samp=
le-conditional>,
>
> > if an attribute with the semantics of `[[trivially_relocatable]]` is
> added,
> > it should take a boolean argument.
>
> I'm not even going to answer this one. As others, *way* too leading as
> far as assuming a particular approach which does *not* have consensus.
>
Abstention recorded.
The intent of EWG9 is to get feedback on whether the attribute should take
a boolean argument, *if* the attribute is accepted. If the attribute is not
accepted, then the result of EWG9 probably becomes moot. (But it might
still inform a different design, or even provide a barometer for someone
designing a completely different attribute for a completely different
purpose.)
Some people may have strong opinions on EWG9, and I want to get that
feedback sooner rather than later, hence the conditional question. (Some
people may vote "SA" on EWG1 and LEWG14, indicating strong disagreement
with the paper, and nevertheless have a strong opinion on EWG9!)
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to
> the
> > `<type_traits>` header, under that exact name, as proposed in this pape=
r.
>
> F.
>
> In practice, I'm not sure how useful the other two will be.
>
> > LEWG14. We approve of a trait with the semantics of
> > `is_trivially_relocatable<T>`, but possibly under a different name. (Fo=
r
> > example, `is_bitwise_relocatable`.)
>
> F, I guess.
>
> Seems a bit redundant with LEWG13, but I guess the point is for people
> that want to complain about the color of the bikeshed.
>
Yes. LEWG13 is "we want a bikeshed of this color." LEWG14 is "we do want a
bikeshed, but maybe a different color." People who don't want a bikeshed at
all should vote "A, A". People who want a bikeshed but don't like the
current color should vote "A, F". People who just want a bikeshed and don't
care about the color should vote "F, F".
Thanks!
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0J8kep7%2BQZR3bOOisBD63xBkwFbyyQ%2BpvM412%=
3Dc9oWfKw%40mail.gmail.com.
--000000000000082140057a92e0c6
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr">On Tue,=
Nov 13, 2018 at 12:48 PM Matthew Woehlke <<a href=3D"mailto:mwoehlke.fl=
oss@gmail.com">mwoehlke.floss@gmail.com</a>> wrote:<br><div class=3D"gma=
il_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,=
204,204);padding-left:1ex">On 11/11/2018 20.35, Arthur O'Dwyer wrote:<b=
r>> EWG3. Nobody should be able to warrant the trivial relocatability of=
class <br>
> `C` except for class `C` itself (i.e., we do not want to see a <br>
> customization point analogous to `std::hash`).<br>
<br>
N leaning to A.<br>
<br>
While this makes sense *in principle*, in practice it's not unusual to<=
br>
want/need this optimization for a class which is outside of your control.<b=
r></blockquote><div><br></div><div>Many thanks for your !votes, even those =
I might argue with; I have recorded them. :)</div><div><br></div><div>I don=
't want to appear argumentative, but I do want to present my proposed w=
orkaround for dealing with this problem:</div><div><br></div><div>=C2=A0 =
=C2=A0 std::vector<thirdparty::SharedPtr> vec; =C2=A0// oops, doesn&#=
39;t get the memcpy optimization<br></div><div><div>=C2=A0 =C2=A0 vec.empla=
ce_back(...); =C2=A0// oops</div></div><div><br></div><div><br></div><div>=
=C2=A0 =C2=A0 template<class T> struct [[trivially_relocatable]] TR :=
public T { using T::T; };</div><div><br></div><div><div>=C2=A0 =C2=A0 std:=
:vector<TR<thirdparty::SharedPtr>> tvec; =C2=A0// OK, gets the =
memcpy optimization</div></div><div>=C2=A0 =C2=A0 tvec.emplace_back(...); =
=C2=A0// OK</div><div><br></div><div>This is definitely a "workaround,=
" not a good practice; but personally I'd rather see this workarou=
nd in a few places (for a few years) than see a customization point put int=
o the Standard (forever).</div><div><br></div><div><br></div><div><br></div=
><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border=
-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);=
padding-left:1ex">> EWG4. A class should be able to warrant its own triv=
ial relocatability via <br>
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.<=
br>
<br>
N leaning to A.<br>
<br>
One of the reasons we tend to talk about "destructive move" is th=
at<br>
there are lifetime implications. It's not clear that this can be<br>
correctly expressed via an attribute. It seems like users would need to<br>
call a special flavor of dtor.<br></blockquote><div><br></div><div>I record=
ed this as "N", although I can revise it to "A" if you =
want.</div><div>The intent of EWG4 is to ask if you agree <i>with the state=
ment</i>. If your opinion is that you don't want P1144's attribute =
because you want a special flavor of destructor <i>instead</i>, then that i=
s a perfectly valid reason to vote "A". Or if you don't want =
P1144's attribute because you don't like attributes. Or if you don&=
#39;t like P1144's attribute because it's named wrong. Or really an=
y <i>reason</i>. The poll is just whether you agree or disagree with the st=
atement as written.</div><div><br></div><div>Personally I don't think y=
ou'll ever get a special flavor of destructor in C++. Certainly I don&#=
39;t know how to get that. But it's a valid motivation for anyone's=
"A" vote (<i>contra</i> to what I think Mihail was saying).</div=
><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0=
px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rg=
b(204,204,204);padding-left:1ex">(I'm also far from convinced this is a=
n "acceptable" use of an attribute.)<br></blockquote><div><br></d=
iv><div>The results for EWG5 and EWG6 should give some guidance there. EWG4=
/EWG5 differentiate "I like your attribute approach but want to bikesh=
ed the name"; EWG5/EWG6 differentiate "I like the general approac=
h but want to bikeshed the choice of an attribute vs. a keyword."</div=
><div>As with EWG4: If you want to express "I <i>don't</i> think a=
class should be able to warrant its etc. etc. via etc. etc.," then yo=
u'd vote "A" or "SA".</div><div><br></div><div><br>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b=
order-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,=
204);padding-left:1ex">
> EWG6. A class should be able to warrant its own trivial relocatability=
as <br>
> proposed in this paper, but we prefer to see a contextual keyword rath=
er <br>
> than an attribute.<br>
<br>
Strongly N.<br>
<br>
Again, this is too leading. The correct solution might be:<br>
<br>
=C2=A0 class Foo<br>
=C2=A0 {<br>
=C2=A0 =C2=A0 Foo(Foo~ other) =3D default; // relocating ctor<br>
=C2=A0 =C2=A0 ...<br>
=C2=A0 };<br>
<br>
....which isn't really "a contextual keyword".<br></blockquote=
><div><br></div><div>More relevantly, that isn't remotely "as prop=
osed in this paper"!=C2=A0 If you disagree that a class should be able=
to etc. etc. <i>as proposed in this paper,</i> then you should be voting &=
quot;A" on many of these.</div><div><br></div><div><br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-widt=
h:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-le=
ft:1ex">
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T&=
gt;` is <br>
> added to the `<type_traits>` header, the programmer should be pe=
rmitted to <br>
> specialize it for program-defined types (i.e., we want to see that tra=
it <br>
> itself become a customization point analogous to `std::hash`).<br>
<br>
Weakly F.<br>
<br>
This seems redundant with EWG3.<br></blockquote><div><br></div><div>EWG3 is=
about the existence of <i>some</i> customization mechanism not controlled =
by the class author.</div><div>EWG7 is about the desirability of letting th=
e user specialize anything out of <type_traits>.</div><div>(Personall=
y, I'm "OMDB" on EWG7. See <a href=3D"https://quuxplusone.git=
hub.io/blog/tags/#customization-points">my blog</a> for my confidently held=
theory of customization point design.)</div><div><br></div><div><br></div>=
<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-=
left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);p=
adding-left:1ex">
> EWG8. Trivial relocatability should be assumed by default. Classes suc=
h as <br>
> those in Appendix C <br>
> <<a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018=
/p1144r0.html#non-trivial-samples" rel=3D"noreferrer" target=3D"_blank">htt=
p://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivi=
al-samples</a>> <br>
> should indicate their non-trivial relocatability via an opt-in mechani=
sm.<br>
<br>
If you *literally* meant "all" classes, vs. e.g. those that meet =
some<br>
reasonable criteria, then SA leaning toward OMDB.<br></blockquote><div><br>=
</div><div>Yes, I did. "SA" recorded. :)</div><div>Tangentially, =
I am curious what you would consider "some reasonable criteria."<=
/div><div><br></div><div><br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;=
border-left-color:rgb(204,204,204);padding-left:1ex">> EWG9. To simplify=
conditionally trivial relocation <br>
> <<a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018=
/p1144r0.html#sample-conditional" rel=3D"noreferrer" target=3D"_blank">http=
://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-con=
ditional</a>>, <br>
> if an attribute with the semantics of `[[trivially_relocatable]]` is a=
dded, <br>
> it should take a boolean argument.<br>
<br>
I'm not even going to answer this one. As others, *way* too leading as<=
br>
far as assuming a particular approach which does *not* have consensus.<br><=
/blockquote><div><br></div><div>Abstention recorded.</div><div>The intent o=
f EWG9 is to get feedback on whether the attribute should take a boolean ar=
gument, <i>if</i> the attribute is accepted. If the attribute is not accept=
ed, then the result of EWG9 probably becomes moot. (But it might still info=
rm a different design, or even provide a barometer for someone designing a =
completely different attribute for a completely different purpose.)<br></di=
v><div>Some people may have strong opinions on EWG9, and I want to get that=
feedback sooner rather than later, hence the conditional question. (Some p=
eople may vote "SA" on EWG1 and LEWG14, indicating strong disagre=
ement with the paper, and nevertheless have a strong opinion on EWG9!)</div=
><div><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;borde=
r-left-color:rgb(204,204,204);padding-left:1ex">> LEWG13. The type trait=
`is_trivially_relocatable<T>` should be added to the <br>
> `<type_traits>` header, under that exact name, as proposed in th=
is paper.<br>
<br>
F.<br>
<br>
In practice, I'm not sure how useful the other two will be.<br>
<br>
> LEWG14. We approve of a trait with the semantics of <br>
> `is_trivially_relocatable<T>`, but possibly under a different na=
me. (For <br>
> example, `is_bitwise_relocatable`.)<br>
<br>
F, I guess.<br>
<br>
Seems a bit redundant with LEWG13, but I guess the point is for people<br>
that want to complain about the color of the bikeshed.<br></blockquote><div=
><br></div><div>Yes. LEWG13 is "we want a bikeshed of this color."=
; LEWG14 is "we do want a bikeshed, but maybe a different color."=
People who don't want a bikeshed at all should vote "A, A". =
People who want a bikeshed but don't like the current color should vote=
"A, F". People who just want a bikeshed and don't care about=
the color should vote "F, F".</div><div><br></div><div>Thanks!</=
div><div>=E2=80=93Arthur</div></div></div></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0J8kep7%2BQZR3bOOisBD63xBkwFbyy=
Q%2BpvM412%3Dc9oWfKw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0J8ke=
p7%2BQZR3bOOisBD63xBkwFbyyQ%2BpvM412%3Dc9oWfKw%40mail.gmail.com</a>.<br />
--000000000000082140057a92e0c6--
.
Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Tue, 13 Nov 2018 17:01:37 -0500
Raw View
On 13/11/2018 14.24, mihailnajdenov@gmail.com wrote:
> Matthew, the paper is not about "destructive move".
Really? Because that's exactly what uninitialized_relocate does.
> In a way the paper is "what can do after dmove has failed"
What do you mean by "failed"? Do you mean "papers taking that approach
have not been accepted", or do you mean that the code attempted a dmove
and... something happened? (It threw an exception?)
I was *in* SG17 when we reviewed the paper. I did not at all get the
impression that "destructive move" (assuming that you are implying some
specific implementation strategy, and not the general problem) was
"dead". Rather, I got the impression that this general problem is *hard*
and we aren't confident that we have seen a paper yet that adequately
deals with all of the tricky details. *Including* P1144. (Of note: folks
were concerned about allocators.)
I wasn't present for the presentation of other papers in this area, so I
can't be sure why they failed, but again, my impression from SG17 was
that they failed due to tricky details, not because the overall
approaches were unacceptable.
The approach taken in P1144 feels extremely magical. It proposes an
*attribute* that allows the compiler leeway to implement a particular
library function in a way that has somewhat profound implications on the
memory model. I am... unconvinced that an attribute is the right way to
accomplish that, nor that there is not value in having a "first class"
destroying ctor.
--
Matthew
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/e6d943be-1a9f-881d-52d0-8258245eaefa%40gmail.com.
.
Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Tue, 13 Nov 2018 17:40:31 -0500
Raw View
On 13/11/2018 16.55, Arthur O'Dwyer wrote:
>> N leaning to A.
>=20
> I recorded this as "N", although I can revise it to "A" if you want.
That's fine; any "X leaning to Y" means that in a real straw poll where
I can't qualify, I would *probably* vote 'X' :-).
Anyway, IMHO the "votes" on some of the leading questions aren't very
meaningful anyway. (At least mine aren't :-).)
Since I'm rationalizing... several votes of that nature were in the line
of "I am not really *personally* on board with this approach, but not
enough to try to block it if the rest of EWG seems happy".
> Personally I don't think you'll ever get a special flavor of destructor i=
n
> C++. Certainly I don't know how to get that. But it's a valid motivation
> for anyone's "A" vote (*contra* to what I think Mihail was saying).
Sure. As noted in my reply, I wasn't present for discussion of any such
papers, but my impression in SG17 was that the reason we haven't
approved any such approach isn't due to *philosophical* dislike, but
because the details are really hard, and no paper has yet satisfactorily
dealt with all such details.
>> EWG6. A class should be able to warrant its own trivial relocatability a=
s
>>> proposed in this paper, but we prefer to see a contextual keyword rathe=
r
>>> than an attribute.
>>
>> Again, this is too leading. [...]
>=20
> More relevantly, that isn't remotely "as proposed in this paper"! If you
> disagree that a class should be able to etc. etc. *as proposed in this
> paper,* then you should be voting "A" on many of these.
Well, sure, but again my impression from SG17 is that the design space
is still open. My voting is very much based on that. (And again, I'm not
*strongly* opposed enough to try to kill this approach if it seems
viable. Wisteria may not be my first choice, but we need the bikeshed
more than we need it painted my favorite shade of glaucous.)
>>> EWG7. If a trait with the semantics of
>>> `is_trivially_relocatable<T>` is added to the `<type_traits>`
>>> header, the programmer should be permitted to specialize it for
>>> program-defined types (i.e., we want to see that trait itself
>>> become a customization point analogous to `std::hash`).
>>
>> Weakly F.
>>
>> This seems redundant with EWG3.
>=20
> EWG3 is about the existence of *some* customization mechanism not
> controlled by the class author.
> EWG7 is about the desirability of letting the user specialize anything ou=
t
> of <type_traits>.
> (Personally, I'm "OMDB" on EWG7. See my blog
> <https://quuxplusone.github.io/blog/tags/#customization-points> for my
> confidently held theory of customization point design.)
Granted. I meant more along the lines of, if EWG3 "passes", this becomes
irrelevant.
I also don't warrant that EQG7 is the *best* customization point, hence
why I am only *weakly* in favor. It's better than nothing, and you
didn't propose alternatives :-).
>>> EWG8. Trivial relocatability should be assumed by default.
>>> Classes such as those in Appendix C should indicate their
>>> non-trivial relocatability via an opt-in mechanism.
>>
>> If you *literally* meant "all" classes, vs. e.g. those that meet some
>> reasonable criteria, then SA leaning toward OMDB.
>=20
> Yes, I did. "SA" recorded. :)
>
> Tangentially, I am curious what you would consider "some reasonable
> criteria."
P1144=C2=A73 seems plausible, at least at first glance (i.e. with the cavea=
t
that I haven't spent a ton of time trying to break those criteria).
Given that, TBH I was a bit surprised by this question. (Unless, as
noted, I am misreading it...)
>>> EWG9. To simplify conditionally trivial relocation, if an
>>> attribute with the semantics of `[[trivially_relocatable]]` is=20
>>> added, it should take a boolean argument.
>>
>> I'm not even going to answer this one.
Actually, I'll take that back. *If* we go with an attribute (and IMHO
that remains a *very* big 'if'), then I think it does make sense to have
a way to explicitly force it off =E2=86=92 F, but weakly.
>>> LEWG14. We approve of a trait with the semantics of
>>> `is_trivially_relocatable<T>`, but possibly under a different name. (Fo=
r
>>> example, `is_bitwise_relocatable`.)
>>
>> F, I guess.
(I should note that some folks have been complaining that reflection
will make type traits moot. I suppose to that extent, a) I want the
shed, but b) I don't particularly care if it's a bike shed (type trait)
or a tool shed (some reflection-based mechanism), just as long as there
is *some* way I can ask if a type is trivially relocatable.)
--=20
Matthew
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/e6ddf8bc-9940-48c3-45ce-d9b98fdaf872%40gmail.com=
..
.
Author: Edward Catmur <ed@catmur.co.uk>
Date: Tue, 13 Nov 2018 21:31:40 -0800 (PST)
Raw View
------=_Part_921_1698822704.1542173500631
Content-Type: multipart/alternative;
boundary="----=_Part_922_1106298621.1542173500632"
------=_Part_922_1106298621.1542173500632
Content-Type: text/plain; charset="UTF-8"
I'd like to preface my votes with some justification for my views.
Firstly, I believe that the concept of trivial relocatability implies the
concept of non-trivial relocatability, and not just in the
move-construct-and-destruct sense, but via some as yet unspecified
mechanism that does not require two objects to exist at the same time -
(very) tentatively a memcpy-and-noexcept-repair. This means that we should
leave open the path toward such a mechanism.
Secondly, lifetime is *serious* - it accounts for many of the bugs that
afflict experienced programmers. In particular I'm worried about behavior
classes that own callbacks (or event handlers), since these are typically
lambdas capturing `this`, and such classes may well be stored in containers
and thus subject to relocation. It should never be easy to make claims
about the lifetime behavior of another class. With regards to warranting
trivial relocatability of one's own class, this should only be possible if
the bases and members are themselves (warranted to be) trivially
relocatable; the wrapper class presented above is too prone to abuse to be
allowed. There is still an escape hatch to impose trivial relocatability on
a third-party class - use `aligned_storage` and construct, move, copy and
destruct as appropriate the wrapped class. For the danger involved, this is
not an unreasonable amount of work to impose on the programmer.
That is, a class should only be able to warrant its own trivial
relocatability if it *would* be trivially relocatable but for the presence
of its own user-defined special member functions. This should be similar to
and familiar from the concept of explicitly defaulting move constructor,
etc. Together, this suggests that the appropriate syntax for warranting
trivial relocatability or otherwise should be a special member function
that can be defaulted or deleted, but not user-supplied as yet: `RELOCATE =
(default|delete);` where:
* RELOCATE is a bikeshed placeholder for a special member;
* `default` means that the class is trivially relocatable if all its bases
and members are trivially relocatable, and otherwise is not (there is no
way to "force" trivial relocatability);
* `delete` means that the class is not trivially relocatable, even if it
would otherwise qualify. (The class can still be relocated by
move-construct-and-destruct.)
The advantage of this syntax would be that the path to destructive move
would be open: once the semantics are understood, convert RELOCATE to a
special member *function* and allow the user to provide a body. That said,
a contextual keyword wouldn't be too bad, and even the attribute as
proposed would be better than not going forward - but in either case, it
should still not be possible to force trivial relocatability on another
class by wrapping it, so the attribute or contextual keyword should only
counteract the presence of user-provided or deleted special member
functions of that class.
And thanks for working on this and for canvassing opinion here.
EWG1. We approve of the general idea that user-defined classes should be
> able to warrant their own trivial relocatability via a standard mechanism.
>
SA, except when their bases and members are themselves relocatable, in
which case SF. (The "escape hatch" is to use `aligned_storage`.)
> EWG2. We approve of the general idea that user-defined classes which
> follow the Rule of Zero
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
> should inherit the trivial relocatability of their bases and members.
>
SF
EWG3. Nobody should be able to warrant the trivial relocatability of class
> `C` except for class `C` itself (i.e., we do not want to see a
> customization point analogous to `std::hash`).
>
SF
> EWG4. A class should be able to warrant its own trivial relocatability via
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
A (and SA if its bases and members are not trivially relocatable, per EWG1)
- I don't think an attribute is appropriate for modifying lifetime behavior.
> EWG5. A class should be able to warrant its own trivial relocatability via
> some attribute, but not necessarily under that exact name.
>
A (and SA), per EWG4
> EWG6. A class should be able to warrant its own trivial relocatability as
> proposed in this paper, but we prefer to see a contextual keyword rather
> than an attribute.
>
F but only under the conditions described per EWG1, and in that a
contextual keyword is better than an attribute, but a special member
(defaultable/deletable only, for now) would be better still.
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> added to the `<type_traits>` header, the programmer should be permitted to
> specialize it for program-defined types (i.e., we want to see that trait
> itself become a customization point analogous to `std::hash`).
>
SA
> EWG8. Trivial relocatability should be assumed by default. Classes such as
> those in Appendix C
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples>
> should indicate their non-trivial relocatability via an opt-in mechanism.
>
SA
> EWG9. To simplify conditionally trivial relocation
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional>,
> if an attribute with the semantics of `[[trivially_relocatable]]` is added,
> it should take a boolean argument.
>
A
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)`
> should be added to the `<memory>` header, as proposed in this paper.
>
F
> LEWG11. The type trait `is_relocatable<T>` should be added to the
> `<type_traits>` header, as proposed in this paper.
>
F
> LEWG12. If `is_relocatable<T>` is added, then we should also add
> `is_nothrow_relocatable<T>`, as proposed in this paper.
>
F
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to
> the `<type_traits>` header, under that exact name, as proposed in this
> paper.
>
F
> LEWG14. We approve of a trait with the semantics of
> `is_trivially_relocatable<T>`, but possibly under a different name. (For
> example, `is_bitwise_relocatable`.)
>
F, but I'm happy with the proposed name.
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,
> then the type trait `is_trivially_swappable<T>` should also be added to the
> `<type_traits>` header.
>
F, but it doesn't seem essential, as discussed in the paper.
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/684c403d-79fe-47fd-a69f-979c11786f86%40isocpp.org.
------=_Part_922_1106298621.1542173500632
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I'd like to preface my votes with some justificat=
ion for my views.</div><div><br></div><div>Firstly, I believe that the conc=
ept of trivial relocatability implies the concept of non-trivial relocatabi=
lity, and not just in the move-construct-and-destruct sense, but via some a=
s yet unspecified mechanism that does not require two objects to exist at t=
he same time - (very) tentatively a memcpy-and-noexcept-repair. This means =
that we should leave open the path toward such a mechanism.</div><div><br><=
/div><div>Secondly, lifetime is *serious* - it accounts for many of the bug=
s that afflict experienced programmers. In particular I'm worried about=
behavior classes that own callbacks (or event handlers), since these are t=
ypically lambdas capturing `this`, and such classes may well be stored in c=
ontainers and thus subject to relocation. It should never be easy to make c=
laims about the lifetime behavior of another class. With regards to warrant=
ing trivial relocatability of one's own class, this should only be poss=
ible if the bases and members are themselves (warranted to be) trivially re=
locatable; the wrapper class presented above is too prone to abuse to be al=
lowed. There is still an escape hatch to impose trivial relocatability on a=
third-party class - use `aligned_storage` and construct, move, copy and de=
struct as appropriate the wrapped class. For the danger involved, this is n=
ot an unreasonable amount of work to impose on the programmer.</div><div><b=
r></div><div>That is, a class should only be able to warrant its own trivia=
l relocatability if it *would* be trivially relocatable but for the presenc=
e of its own user-defined special member functions. This should be similar =
to and familiar from the concept of explicitly defaulting move constructor,=
etc. Together, this suggests that the appropriate syntax for warranting tr=
ivial relocatability or otherwise should be a special member function that =
can be defaulted or deleted, but not user-supplied as yet: `RELOCATE =3D (d=
efault|delete);` where:</div><div>* RELOCATE is a bikeshed placeholder for =
a special member;</div><div>* `default` means that the class is trivially r=
elocatable if all its bases and members are trivially relocatable, and othe=
rwise is not (there is no way to "force" trivial relocatability);=
</div><div>* `delete` means that the class is not trivially relocatable, ev=
en if it would otherwise qualify. (The class can still be relocated by move=
-construct-and-destruct.)</div><div>The advantage of this syntax would be t=
hat the path to destructive move would be open: once the semantics are unde=
rstood, convert RELOCATE to a special member *function* and allow the user =
to provide a body. That said, a contextual keyword wouldn't be too bad,=
and even the attribute as proposed would be better than not going forward =
- but in either case, it should still not be possible to force trivial relo=
catability on another class by wrapping it, so the attribute or contextual =
keyword should only counteract the presence of user-provided or deleted spe=
cial member functions of that class.</div><div><br></div><div>And thanks fo=
r working on this and for canvassing opinion here.</div><div><br></div><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-=
left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>EWG1. We app=
rove of the general idea that user-defined classes should be able to warran=
t their own trivial relocatability via a standard mechanism.<br></div></div=
></blockquote><div><br></div><div>SA, except when their bases and members a=
re themselves relocatable, in which case SF. (The "escape hatch" =
is to use `aligned_storage`.)</div><div>=C2=A0</div><blockquote class=3D"gm=
ail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc soli=
d;padding-left: 1ex;"><div dir=3D"ltr"><div>EWG2. We approve of the general=
idea that user-defined classes which follow the <a href=3D"https://web.arc=
hive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/r=
ule-of-zero.html" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.hr=
ef=3D'https://www.google.com/url?q\x3dhttps%3A%2F%2Fweb.archive.org%2Fw=
eb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.com%2Fcxx11%2F2012%2F0=
8%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG0-oV_Gp=
dnIP-4dWgeb4q0MdCEvA';return true;" onclick=3D"this.href=3D'https:/=
/www.google.com/url?q\x3dhttps%3A%2F%2Fweb.archive.org%2Fweb%2F201306072348=
33%2Fhttp%3A%2F%2Fflamingdangerzone.com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-=
zero.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdC=
EvA';return true;">Rule of Zero</a> should inherit the trivial relocata=
bility of their bases and members.</div></div></blockquote><div>=C2=A0</div=
><div>SF</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div dir=3D"ltr"><div>EWG3. Nobody should be able to warrant the trivial rel=
ocatability of class `C` except for class `C` itself (i.e., we do not want =
to see a customization point analogous to `std::hash`).</div></div></blockq=
uote><div><br></div><div>SF</div><div>=C2=A0</div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><div dir=3D"ltr"><div>EWG4. A class should be able to w=
arrant its own trivial relocatability via the attribute `[[trivially_reloca=
table]]`, as proposed in this paper.</div></div></blockquote><div><br></div=
><div>A (and SA if its bases and members are not trivially relocatable, per=
EWG1) - I don't think an attribute is appropriate for modifying lifeti=
me behavior.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div>EWG5. A class should be able to warrant its own=
trivial relocatability via some attribute, but not necessarily under that =
exact name.</div></div></blockquote><div><br></div><div>A (and SA), per EWG=
4</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: =
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div d=
ir=3D"ltr"><div>EWG6. A class should be able to warrant its own trivial rel=
ocatability as proposed in this paper, but we prefer to see a contextual ke=
yword rather than an attribute.</div></div></blockquote><div><br></div><div=
>F but only under the conditions described per EWG1, and in that a contextu=
al keyword is better than an attribute, but a special member (defaultable/d=
eletable only, for now) would be better still.</div><div>=C2=A0</div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>EWG7. If a tra=
it with the semantics of `is_trivially_relocatable<T>` is added to th=
e `<type_traits>` header, the programmer should be permitted to speci=
alize it for program-defined types (i.e., we want to see that trait itself =
become a customization point analogous to `std::hash`).</div></div></blockq=
uote><div><br></div><div>SA</div><div>=C2=A0</div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><div dir=3D"ltr"><div>EWG8. Trivial relocatability shou=
ld be assumed by default. Classes such as those in <a href=3D"http://www.op=
en-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples=
" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http:/=
/www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21=
%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23non-trivial-samples\x26sa\x3dD\x26=
sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChnFEyQ6nVN7A';return true;" o=
nclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.=
open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23n=
on-trivial-samples\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLC=
hnFEyQ6nVN7A';return true;">Appendix C</a> should indicate their non-tr=
ivial relocatability via an opt-in mechanism.</div></div></blockquote><div>=
<br></div><div>SA</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div dir=3D"ltr"><div>EWG9. To simplify <a href=3D"http://www.ope=
n-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional" =
target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://w=
ww.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2=
Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23sample-conditional\x26sa\x3dD\x26snt=
z\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ';return true;" oncl=
ick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.ope=
n-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23samp=
le-conditional\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeC=
AJ5_EdtQ';return true;">conditionally trivial relocation</a>, if an att=
ribute with the semantics of `[[trivially_relocatable]]` is added, it shoul=
d take a boolean argument.</div></div></blockquote><div><br></div><div>A</d=
iv><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><div>LEWG10. The algorithm `uninitialized_relocate(first, last, d_=
first)` should be added to the `<memory>` header, as proposed in this=
paper.</div></div></blockquote><div><br></div><div>F</div><div>=C2=A0</div=
><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bo=
rder-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><=
div>LEWG11. The type trait `is_relocatable<T>` should be added to the=
`<type_traits>` header, as proposed in this paper.</div></div></bloc=
kquote><div><br></div><div>F</div><div>=C2=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid=
;padding-left: 1ex;"><div dir=3D"ltr"><div>LEWG12. If `is_relocatable<T&=
gt;` is added, then we should also add `is_nothrow_relocatable<T>`, a=
s proposed in this paper.</div></div></blockquote><div><br></div><div>F</di=
v><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;mar=
gin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D=
"ltr"><div>LEWG13. The type trait `is_trivially_relocatable<T>` shoul=
d be added to the `<type_traits>` header, under that exact name, as p=
roposed in this paper.</div></div></blockquote><div><br></div><div>F</div><=
div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"lt=
r"><div>LEWG14. We approve of a trait with the semantics of `is_trivially_r=
elocatable<T>`, but possibly under a different name. (For example, `i=
s_bitwise_relocatable`.)</div></div></blockquote><div><br></div><div>F, but=
I'm happy with the proposed name.</div><div>=C2=A0</div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px =
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div></div><div>LEWG15. If =
`is_trivially_relocatable<T>` is added, under that exact name, then t=
he type trait `is_trivially_swappable<T>` should also be added to the=
`<type_traits>` header.</div></div></blockquote><div><br></div><div>=
=C2=A0F, but it doesn't seem essential, as discussed in the paper.</div=
></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/684c403d-79fe-47fd-a69f-979c11786f86%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/684c403d-79fe-47fd-a69f-979c11786f86=
%40isocpp.org</a>.<br />
------=_Part_922_1106298621.1542173500632--
------=_Part_921_1698822704.1542173500631--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Wed, 14 Nov 2018 01:06:42 -0500
Raw View
--000000000000ae3861057a99bd06
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Wed, Nov 14, 2018 at 12:31 AM Edward Catmur <ed@catmur.co.uk> wrote:
> I'd like to preface my votes with some justification for my views.
>
> Firstly, I believe that the concept of trivial relocatability implies the
> concept of non-trivial relocatability, and not just in the
> move-construct-and-destruct sense, but via some as yet unspecified
> mechanism that does not require two objects to exist at the same time -
> (very) tentatively a memcpy-and-noexcept-repair. This means that we shoul=
d
> leave open the path toward such a mechanism.
>
(P1144 essentially assumes that no such mechanism will ever be forthcoming.
But I'm aware of the memcpy-and-fixup idea.)
Secondly, lifetime is *serious* - it accounts for many of the bugs that
> afflict experienced programmers. In particular I'm worried about behavior
> classes that own callbacks (or event handlers), since these are typically
> lambdas capturing `this`, and such classes may well be stored in containe=
rs
> and thus subject to relocation. It should never be easy to make claims
> about the lifetime behavior of another class. With regards to warranting
> trivial relocatability of one's own class, this should only be possible i=
f
> the bases and members are themselves (warranted to be) trivially
> relocatable; the wrapper class presented above is too prone to abuse to b=
e
> allowed. There is still an escape hatch to impose trivial relocatability =
on
> a third-party class - use `aligned_storage` and construct, move, copy and
> destruct as appropriate the wrapped class. For the danger involved, this =
is
> not an unreasonable amount of work to impose on the programmer.
>
> That is, a class should only be able to warrant its own trivial
> relocatability if it *would* be trivially relocatable but for the presenc=
e
> of its own user-defined special member functions.
>
Over on the Clang pull request, rjmccall is taking a similar stand, and I'm
having trouble understanding why it's desirable. The way I see it, the
whole point of the type-trait is so that library authors can inspect it and
make correct decisions about the trivial-relocatability of their wrapper
classes. (EWG9 is related.) Obviously if you want your wrapper class merely
to propagate the trivial-relocatability of all its bases and members, then
you should be *allowed* to do that; but I don't want to prohibit people
from writing e.g.
struct [[trivially_relocatable]] Widget {
boost::shared_ptr<int> sptr; // assume Boost won't catch up for a
little while, and/or we're stuck on an old version of Boost
};
or e.g.
struct [[trivially_relocatable]] BatteriesIncluded {
char heap[1000];
std::vector<int, offset_ptr_allocator<int>> vec; // all pointers
are stored as offsets into 'heap'
BatteriesIncluded(BatteriesIncluded&&); // very complicated fixup
goes here
};
If I understand your statement correctly, you do want to prohibit people
from writing either of these things.
(And over on the pull request, I understand rjmccall as saying that maybe
we should allow people to write these things but quietly ignore the
attribute, unless they "double-opt-in" by writing e.g. `class
[[trivially_relocatable_bikeshed!]] Widget`. I have a hard time imagining
when I'd ever want to opt in *without* double-opting-in.)
This should be similar to and familiar from the concept of explicitly
> defaulting move constructor, etc. Together, this suggests that the
> appropriate syntax for warranting trivial relocatability or otherwise
> should be a special member function that can be defaulted or deleted, but
> not user-supplied as yet: `RELOCATE =3D (default|delete);` where:
> * RELOCATE is a bikeshed placeholder for a special member;
> * `default` means that the class is trivially relocatable if all its base=
s
> and members are trivially relocatable, and otherwise is not (there is no
> way to "force" trivial relocatability);
> * `delete` means that the class is not trivially relocatable, even if it
> would otherwise qualify. (The class can still be relocated by
> move-construct-and-destruct.)
>
I don't see how you'd implement a trivially relocatable `unique_ptr` using
only these features. ...Which is fine =E2=80=94 maybe it won't be possible =
to write
`unique_ptr` in standard C++, but vendors will use secret sauce to achieve
it anyway. P1144R0 does emphasize that the type-trait would be useful even
without any *standard* attribute.
Unless you mean that `RELOCATE=3Ddefault` would mean "memcpy me" even in th=
e
presence of a non-trivial move-constructor and destructor. My kneejerk
reaction was that that would go against the spirit of what "=3Ddefault"
usually means in C++. That is,
struct List : private ListNode {
ListNode *head, *tail;
List(List&& rhs) : head(rhs.head), tail(rhs.tail) { head->prev =3D
this; tail->next =3D this; }
~List();
RELOCATE =3D default; // oops, this would be a bug
};
So the default that happens when the user doesn't provide any definition of
`RELOCATE` would have to be something like "no RELOCATE exists," and adding
an explicit `RELOCATE =3D default;` to an existing class might actually bre=
ak
its behavior.
It might be doable, but I don't think it'd be easy.
And you'd still lack any way to express `Widget` and `BatteriesIncluded`,
which I think is a problem for real codebases. (Especially `Widget`.)
EWG1. We approve of the general idea that user-defined classes should be
>> able to warrant their own trivial relocatability via a standard mechanis=
m.
>>
>
> SA, except when their bases and members are themselves relocatable, in
> which case SF. (The "escape hatch" is to use `aligned_storage`.)
>
Recorded as "SA".
> EWG4. A class should be able to warrant its own trivial relocatability vi=
a
>> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>>
>
> A (and SA if its bases and members are not trivially relocatable, per
> EWG1) - I don't think an attribute is appropriate for modifying lifetime
> behavior.
>
Recorded as "A".
Thanks!
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0L%3D0i%2BPkUPBd3DKbbpk2Z_sNgjq5dq20R_spuo=
YGSm%3D9A%40mail.gmail.com.
--000000000000ae3861057a99bd06
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wed, Nov 14, 2018 at 12:31 AM Edward Catmur <<a href=
=3D"mailto:ed@catmur.co.uk">ed@catmur.co.uk</a>> wrote:<br><div class=3D=
"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>I'd =
like to preface my votes with some justification for my views.</div><div><b=
r></div><div>Firstly, I believe that the concept of trivial relocatability =
implies the concept of non-trivial relocatability, and not just in the move=
-construct-and-destruct sense, but via some as yet unspecified mechanism th=
at does not require two objects to exist at the same time - (very) tentativ=
ely a memcpy-and-noexcept-repair. This means that we should leave open the =
path toward such a mechanism.</div></div></blockquote><div><br></div><div>(=
P1144 essentially assumes that no such mechanism will ever be forthcoming. =
But I'm aware of the memcpy-and-fixup idea.)</div><div><br></div><div><=
br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Secondly, lif=
etime is *serious* - it accounts for many of the bugs that afflict experien=
ced programmers. In particular I'm worried about behavior classes that =
own callbacks (or event handlers), since these are typically lambdas captur=
ing `this`, and such classes may well be stored in containers and thus subj=
ect to relocation. It should never be easy to make claims about the lifetim=
e behavior of another class. With regards to warranting trivial relocatabil=
ity of one's own class, this should only be possible if the bases and m=
embers are themselves (warranted to be) trivially relocatable; the wrapper =
class presented above is too prone to abuse to be allowed. There is still a=
n escape hatch to impose trivial relocatability on a third-party class - us=
e `aligned_storage` and construct, move, copy and destruct as appropriate t=
he wrapped class. For the danger involved, this is not an unreasonable amou=
nt of work to impose on the programmer.</div><div><br></div><div>That is, a=
class should only be able to warrant its own trivial relocatability if it =
*would* be trivially relocatable but for the presence of its own user-defin=
ed special member functions.</div></div></blockquote><div><br></div><div>Ov=
er on the Clang pull request, rjmccall is taking a similar stand, and I'=
;m having trouble understanding why it's desirable. The way I see it, t=
he whole point of the type-trait is so that library authors can inspect it =
and make correct decisions about the trivial-relocatability of their wrappe=
r classes. (EWG9 is related.) Obviously if you want your wrapper class mere=
ly to propagate the trivial-relocatability of all its bases and members, th=
en you should be <i>allowed</i> to do that; but I don't want to prohibi=
t people from writing e.g.</div><div><br></div><div>=C2=A0 =C2=A0 struct [[=
trivially_relocatable]] Widget {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 boos=
t::shared_ptr<int> sptr; =C2=A0// assume Boost won't catch up for=
a little while, and/or we're stuck on an old version of Boost</div><di=
v>=C2=A0 =C2=A0 };</div><div><br></div><div>or e.g.</div><div><br></div><di=
v>=C2=A0 =C2=A0 struct [[trivially_relocatable]] BatteriesIncluded {</div><=
div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 char heap[1000];</div><div>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 std::vector<int, offset_ptr_allocator<int>> vec; =
=C2=A0// all pointers are stored as offsets into 'heap'</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 BatteriesIncluded(BatteriesIncluded&&);=
=C2=A0// very complicated fixup goes here</div><div>=C2=A0 =C2=A0 };</div>=
<div><br></div><div>If I understand your statement correctly, you do want t=
o prohibit people from writing either of these things.</div><div>(And over =
on the pull request, I understand rjmccall as saying that maybe we should a=
llow people to write these things but quietly ignore the attribute, unless =
they "double-opt-in" by writing e.g. `class [[trivially_relocatab=
le_bikeshed!]] Widget`. I have a hard time imagining when I'd ever want=
to opt in <i>without</i> double-opting-in.)</div><div><br></div><div><br><=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div> This should be s=
imilar to and familiar from the concept of explicitly defaulting move const=
ructor, etc. Together, this suggests that the appropriate syntax for warran=
ting trivial relocatability or otherwise should be a special member functio=
n that can be defaulted or deleted, but not user-supplied as yet: `RELOCATE=
=3D (default|delete);` where:</div><div>* RELOCATE is a bikeshed placehold=
er for a special member;</div><div>* `default` means that the class is triv=
ially relocatable if all its bases and members are trivially relocatable, a=
nd otherwise is not (there is no way to "force" trivial relocatab=
ility);</div><div>* `delete` means that the class is not trivially relocata=
ble, even if it would otherwise qualify. (The class can still be relocated =
by move-construct-and-destruct.)</div></div></blockquote><div><br></div><di=
v>I don't see how you'd implement a trivially relocatable `unique_p=
tr` using only these features. ...Which is fine =E2=80=94 maybe it won'=
t be possible to write `unique_ptr` in standard C++, but vendors will use s=
ecret sauce to achieve it anyway. P1144R0 does emphasize that the type-trai=
t would be useful even without any <i>standard</i> attribute.</div><div>Unl=
ess you mean that `RELOCATE=3Ddefault` would mean "memcpy me" eve=
n in the presence of a non-trivial move-constructor and destructor. My knee=
jerk reaction was that that would go against the spirit of what "=3Dde=
fault" usually means in C++. That is,</div><div><br></div><div>=C2=A0 =
=C2=A0 struct List : private ListNode {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 ListNode *head, *tail;</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 List(List&=
amp;& rhs) : head(rhs.head), tail(rhs.tail) { head->prev =3D this; t=
ail->next =3D this; }</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ~List();</di=
v><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 RELOCATE =3D default; =C2=A0// oops, thi=
s would be a bug</div><div>=C2=A0 =C2=A0 };</div><div><br></div><div>So the=
default that happens when the user doesn't provide any definition of `=
RELOCATE` would have to be something like "no RELOCATE exists," a=
nd adding an explicit `RELOCATE =3D default;` to an existing class might ac=
tually break its behavior.</div><div>It might be doable, but I don't th=
ink it'd be easy.</div><div>And you'd still lack any way to express=
`Widget` and `BatteriesIncluded`, which I think is a problem for real code=
bases. (Especially `Widget`.)</div><div><br></div><div><br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc sol=
id;padding-left:1ex"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1e=
x"><div dir=3D"ltr"><div>EWG1. We approve of the general idea that user-def=
ined classes should be able to warrant their own trivial relocatability via=
a standard mechanism.<br></div></div></blockquote><div><br></div><div>SA, =
except when their bases and members are themselves relocatable, in which ca=
se SF. (The "escape hatch" is to use `aligned_storage`.)</div></d=
iv></blockquote><div><br></div><div>Recorded as "SA".</div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr"><div>EWG4. A class should be able=
to warrant its own trivial relocatability via the attribute `[[trivially_r=
elocatable]]`, as proposed in this paper.</div></div></blockquote><div><br>=
</div><div>A (and SA if its bases and members are not trivially relocatable=
, per EWG1) - I don't think an attribute is appropriate for modifying l=
ifetime behavior.</div><div></div></div></blockquote><div><br></div><div>Re=
corded as "A".</div><div><br></div><div>Thanks!</div><div>=E2=80=
=93Arthur</div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0L%3D0i%2BPkUPBd3DKbbpk2Z_sNgjq=
5dq20R_spuoYGSm%3D9A%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0L%3D=
0i%2BPkUPBd3DKbbpk2Z_sNgjq5dq20R_spuoYGSm%3D9A%40mail.gmail.com</a>.<br />
--000000000000ae3861057a99bd06--
.
Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Wed, 14 Nov 2018 10:57:33 -0500
Raw View
On 14/11/2018 00.31, Edward Catmur wrote:
> In particular I'm worried about behavior classes that own callbacks
> (or event handlers), since these are typically lambdas capturing
> `this`, and such classes may well be stored in> containers and thus
> subject to relocation.
Either such classes must have non-trivial copy/move ctors, and are thus
ineligible for being trivially relocatable, or they are broken even
without relocation (because a plain old move/copy ctor will also break
them). In fact, storing them in containers is probably already broken.
(Maybe not map, but definitely vector or flat_map.)
> With regards to warranting trivial relocatability of one's own class,
> this should only be possible if the bases and members are themselves
> (warranted to be) trivially relocatable
For default behavior, definitely agreed. However, I believe there are
known cases when an object may *appear* to not be trivially relocatable
when actually it is?
I suppose you are worried about a class that was warranted as trivially
relocatable changing so that it no longer is. This sounds like a problem
to be solved by tooling, however. We can always add compiler warnings if
the author is overriding the compiler's guess.
--
Matthew
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/dfd6f2c0-a0b9-038c-2cce-e9985da8492b%40gmail.com.
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Wed, 14 Nov 2018 11:13:53 -0500
Raw View
--000000000000242bb6057aa23926
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Wed, Nov 14, 2018 at 10:57 AM Matthew Woehlke <mwoehlke.floss@gmail.com>
wrote:
> On 14/11/2018 00.31, Edward Catmur wrote:
> > With regards to warranting trivial relocatability of one's own class,
> > this should only be possible if the bases and members are themselves
> > (warranted to be) trivially relocatable
> For default behavior, definitely agreed. However, I believe there are
> known cases when an object may *appear* to not be trivially relocatable
> when actually it is?
>
> I suppose you are worried about a class that was warranted as trivially
> relocatable changing so that it no longer is. This sounds like a problem
> to be solved by tooling, however. We can always add compiler warnings if
> the author is overriding the compiler's guess.
>
Aha. This sounds like a FAQ that I tried to address in a blog post a while
back:
https://quuxplusone.github.io/blog/2018/10/04/trivially-relocatable-faq/#wh=
at-if-i-use-the-trivially_relo
Is that post relevant to anyone's concerns?
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0LUM0QPdrHr7XHxfKq8UE1iZ5XBByBTDvzrCTewzKD=
Cww%40mail.gmail.com.
--000000000000242bb6057aa23926
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">On Wed, Nov 14, 2018 at 10:57 AM Matthew =
Woehlke <<a href=3D"mailto:mwoehlke.floss@gmail.com">mwoehlke.floss@gmai=
l.com</a>> wrote:<br><div class=3D"gmail_quote"><blockquote class=3D"gma=
il_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-le=
ft-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">On 14/1=
1/2018 00.31, Edward Catmur wrote:<br>> With regards to warranting trivi=
al relocatability of one's own class,<br>
> this should only be possible if the bases and members are themselves<b=
r>
> (warranted to be) trivially relocatable<br>
For default behavior, definitely agreed. However, I believe there are<br>
known cases when an object may *appear* to not be trivially relocatable<br>
when actually it is?<br>
<br>
I suppose you are worried about a class that was warranted as trivially<br>
relocatable changing so that it no longer is. This sounds like a problem<br=
>
to be solved by tooling, however. We can always add compiler warnings if<br=
>
the author is overriding the compiler's guess.<br></blockquote><div><br=
></div><div>Aha. This sounds like a FAQ that I tried to address in a blog p=
ost a while back:</div><div><a href=3D"https://quuxplusone.github.io/blog/2=
018/10/04/trivially-relocatable-faq/#what-if-i-use-the-trivially_relo">http=
s://quuxplusone.github.io/blog/2018/10/04/trivially-relocatable-faq/#what-i=
f-i-use-the-trivially_relo</a><br></div><div>Is that post relevant to anyon=
e's concerns?</div><div><br></div><div>=E2=80=93Arthur</div></div></div=
></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0LUM0QPdrHr7XHxfKq8UE1iZ5XBByBT=
DvzrCTewzKDCww%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0LUM0QPdrHr=
7XHxfKq8UE1iZ5XBByBTDvzrCTewzKDCww%40mail.gmail.com</a>.<br />
--000000000000242bb6057aa23926--
.
Author: mihailnajdenov@gmail.com
Date: Wed, 14 Nov 2018 12:06:52 -0800 (PST)
Raw View
------=_Part_217_437228397.1542226013047
Content-Type: multipart/alternative;
boundary="----=_Part_218_1556112152.1542226013047"
------=_Part_218_1556112152.1542226013047
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
To be honest probably being able to mark members as well, will be the best=
=20
option=20
struct [[trivially_relocatable]] Widget {
[[trivially_relocatable]] boost::shared_ptr<int> sptr; // trust=
=20
me!
};
struct [[trivially_relocatable]] BatteriesIncluded {
char heap[1000];
[[trivially_relocatable]] std::vector<int,=20
offset_ptr_allocator<int>> vec; // trust me!
BatteriesIncluded(BatteriesIncluded&&); // very complicated fixup=
=20
goes here
};
This way we are safe to compile only when all members and subclasses are tr=
ivially_relocatable=20
(either implicitly or with a tag)
Declaring a member does not make it (the member variable) trivially_relocat=
able=20
(dtor still called, etc), but will shut the compiler complaining much like=
=20
mutable does
On Wednesday, November 14, 2018 at 6:14:08 PM UTC+2, Arthur O'Dwyer wrote:
>
> On Wed, Nov 14, 2018 at 10:57 AM Matthew Woehlke <mwoehlk...@gmail.com=20
> <javascript:>> wrote:
>
>> On 14/11/2018 00.31, Edward Catmur wrote:
>> > With regards to warranting trivial relocatability of one's own class,
>> > this should only be possible if the bases and members are themselves
>> > (warranted to be) trivially relocatable
>> For default behavior, definitely agreed. However, I believe there are
>> known cases when an object may *appear* to not be trivially relocatable
>> when actually it is?
>>
>> I suppose you are worried about a class that was warranted as trivially
>> relocatable changing so that it no longer is. This sounds like a problem
>> to be solved by tooling, however. We can always add compiler warnings if
>> the author is overriding the compiler's guess.
>>
>
> Aha. This sounds like a FAQ that I tried to address in a blog post a whil=
e=20
> back:
>
> https://quuxplusone.github.io/blog/2018/10/04/trivially-relocatable-faq/#=
what-if-i-use-the-trivially_relo
> Is that post relevant to anyone's concerns?
>
> =E2=80=93Arthur
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/59afb6a8-79c3-4b93-94ea-7f64999d0b0b%40isocpp.or=
g.
------=_Part_218_1556112152.1542226013047
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">To be honest probably being able to mark members as well, =
will be the best option=C2=A0<div><br></div><div><div>=C2=A0<font face=3D"c=
ourier new, monospace">struct [[trivially_relocatable]] Widget {</font></di=
v><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 [[=
trivially_relocatable]]=C2=A0=C2=A0boost::shared_ptr<int> sptr;=C2=A0=
=C2=A0</font><span style=3D"font-family: "courier new", monospace=
;">// trust me!</span></div><div><font face=3D"courier new, monospace">=C2=
=A0 =C2=A0 };</font></div><div><font face=3D"courier new, monospace"><br></=
font></div><div><div><font face=3D"courier new, monospace">=C2=A0struct [[t=
rivially_relocatable]] BatteriesIncluded {</font></div><div><font face=3D"c=
ourier new, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 char heap[1000];</font><=
/div><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0</font><span style=3D"font-family: "courier new", monospace=
;">[[trivially_relocatable]]=C2=A0</span><span style=3D"font-family: "=
courier new", monospace;">std::vector<int, offset_ptr_allocator<=
int>> vec; =C2=A0// trust me!</span></div><div><font face=3D"courier =
new, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 BatteriesIncluded(<wbr>Batterie=
sIncluded&&); =C2=A0// very complicated fixup goes here</font></div=
><div><font face=3D"courier new, monospace">=C2=A0 =C2=A0 };</font></div></=
div><div><br></div><div>This way we are safe to compile only when all membe=
rs and subclasses are=C2=A0<span style=3D"font-family: "courier new&qu=
ot;, monospace;">trivially_relocatable (</span><font face=3D"arial, sans-se=
rif">either implicitly=C2=A0or with a tag)</font></div><div><br></div><div>=
Declaring a member does not make it (the member variable)=C2=A0<span style=
=3D"font-family: "courier new", monospace;">trivially_relocatable=
</span><font face=3D"arial, sans-serif">(dtor still called, etc)</font><sp=
an style=3D"font-family: "courier new", monospace;">, </span><fon=
t face=3D"arial, sans-serif">but will shut the compiler complaining much li=
ke mutable does</font></div><div><font face=3D"arial, sans-serif"><br></fon=
t></div><div><br></div><div><div><br>On Wednesday, November 14, 2018 at 6:1=
4:08 PM UTC+2, Arthur O'Dwyer wrote:<blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div dir=3D"ltr"><div dir=3D"ltr">On Wed, Nov 14, 2018 at 10:57 A=
M Matthew Woehlke <<a href=3D"javascript:" target=3D"_blank" gdf-obfusca=
ted-mailto=3D"yCoBsNUrAwAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D=
9;javascript:';return true;" onclick=3D"this.href=3D'javascript:=
9;;return true;">mwoehlk...@gmail.com</a>> wrote:<br><div class=3D"gmail=
_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex=
;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,20=
4,204);padding-left:1ex">On 14/11/2018 00.31, Edward Catmur wrote:<br>> =
With regards to warranting trivial relocatability of one's own class,<b=
r>
> this should only be possible if the bases and members are themselves<b=
r>
> (warranted to be) trivially relocatable<br>
For default behavior, definitely agreed. However, I believe there are<br>
known cases when an object may *appear* to not be trivially relocatable<br>
when actually it is?<br>
<br>
I suppose you are worried about a class that was warranted as trivially<br>
relocatable changing so that it no longer is. This sounds like a problem<br=
>
to be solved by tooling, however. We can always add compiler warnings if<br=
>
the author is overriding the compiler's guess.<br></blockquote><div><br=
></div><div>Aha. This sounds like a FAQ that I tried to address in a blog p=
ost a while back:</div><div><a href=3D"https://quuxplusone.github.io/blog/2=
018/10/04/trivially-relocatable-faq/#what-if-i-use-the-trivially_relo" targ=
et=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'https://www.=
google.com/url?q\x3dhttps%3A%2F%2Fquuxplusone.github.io%2Fblog%2F2018%2F10%=
2F04%2Ftrivially-relocatable-faq%2F%23what-if-i-use-the-trivially_relo\x26s=
a\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHqmR_fd_B1HknnLfROiiK4daCIAA';retur=
n true;" onclick=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%=
3A%2F%2Fquuxplusone.github.io%2Fblog%2F2018%2F10%2F04%2Ftrivially-relocatab=
le-faq%2F%23what-if-i-use-the-trivially_relo\x26sa\x3dD\x26sntz\x3d1\x26usg=
\x3dAFQjCNHqmR_fd_B1HknnLfROiiK4daCIAA';return true;">https://quuxpluso=
ne.github.io/<wbr>blog/2018/10/04/trivially-<wbr>relocatable-faq/#what-if-i=
-<wbr>use-the-trivially_relo</a><br></div><div>Is that post relevant to any=
one's concerns?</div><div><br></div><div>=E2=80=93Arthur</div></div></d=
iv></div>
</blockquote></div></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/59afb6a8-79c3-4b93-94ea-7f64999d0b0b%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/59afb6a8-79c3-4b93-94ea-7f64999d0b0b=
%40isocpp.org</a>.<br />
------=_Part_218_1556112152.1542226013047--
------=_Part_217_437228397.1542226013047--
.
Author: oleerikp@gmail.com
Date: Wed, 14 Nov 2018 15:17:35 -0800 (PST)
Raw View
------=_Part_268_1534955323.1542237455310
Content-Type: multipart/alternative;
boundary="----=_Part_269_1930304035.1542237455310"
------=_Part_269_1930304035.1542237455310
Content-Type: text/plain; charset="UTF-8"
EWG1. We approve of the general idea that user-defined classes should be
able to warrant their own trivial relocatability via a standard mechanism.
*SF*
EWG2. We approve of the general idea that user-defined classes which follow
the Rule of Zero
<https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
should inherit the trivial relocatability of their bases and members.
*SF*
EWG3. Nobody should be able to warrant the trivial relocatability of class
`C` except for class `C` itself (i.e., we do not want to see a
customization point analogous to `std::hash`).
*For*
EWG6. A class should be able to warrant its own trivial relocatability as
proposed in this paper, but we prefer to see a contextual keyword rather
than an attribute.
*For*
EWG8. Trivial relocatability should be assumed by default. Classes such as
those in Appendix C
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples>
should indicate their non-trivial relocatability via an opt-in mechanism.
*Against*
LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)` should
be added to the `<memory>` header, as proposed in this paper.
*Against*
- The suggested semantics seem questionable in the face of a possible
exception in the middle of the loop. But rather than arguing about the
specification, I think it should be dropped from the paper. The experts who
would use this could easily roll their own anyway.
LEWG12. If `is_relocatable<T>` is added, then we should also add
`is_nothrow_relocatable<T>`, as proposed in this paper.
*For*
LEWG13. The type trait `is_trivially_relocatable<T>` should be added to the
`<type_traits>` header, under that exact name, as proposed in this paper.
*SF*
LEWG14. We approve of a trait with the semantics of
`is_trivially_relocatable<T>`, but possibly under a different name. (For
example, `is_bitwise_relocatable`.)
*For*
Don't really care about the rest (neutral).
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/c2edd39c-6ccf-4f60-b0d3-eab4ddbda7fc%40isocpp.org.
------=_Part_269_1930304035.1542237455310
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>EWG1. We approve of the general idea that user-define=
d classes=20
should be able to warrant their own trivial relocatability via a=20
standard mechanism.</div><div><br></div><div><b>SF</b><br></div><div><br></=
div><div>EWG2. We approve of the general idea that user-defined classes whi=
ch follow the <a href=3D"https://web.archive.org/web/20130607234833/http://=
flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html" target=3D"_blank"=
rel=3D"nofollow">Rule of Zero</a> should inherit the trivial relocatabilit=
y of their bases and members.</div><div><br></div><div><b>SF</b><br></div><=
div><br></div><div>EWG3.
Nobody should be able to warrant the trivial relocatability of class=20
`C` except for class `C` itself (i.e., we do not want to see a=20
customization point analogous to `std::hash`).</div><div><br></div><div><b>=
For</b><br></div><br><div>EWG6.
A class should be able to warrant its own trivial relocatability as=20
proposed in this paper, but we prefer to see a contextual keyword rather
than an attribute.</div><div><br></div><div><b>For</b><br></div><br><div>E=
WG8. Trivial relocatability should be assumed by default. Classes such as t=
hose in <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/=
p1144r0.html#non-trivial-samples" target=3D"_blank" rel=3D"nofollow">Append=
ix C</a> should indicate their non-trivial relocatability via an opt-in mec=
hanism.</div><div><br></div><div><b>Against</b><br></div><div><br></div><di=
v>LEWG10.
The algorithm `uninitialized_relocate(first, last, d_first)` should be=20
added to the `<memory>` header, as proposed in this paper.</div><div>=
<br></div><div><b>Against</b><br></div><div>=C2=A0- The suggested semantics=
seem questionable in the face of a possible exception in the middle of the=
loop. But rather than arguing about the specification, I think it should b=
e dropped from the paper. The experts who would use this could easily roll =
their own anyway.<br></div><div><br></div><div>LEWG12.
If `is_relocatable<T>` is added, then we should also add=20
`is_nothrow_relocatable<T>`, as proposed in this paper.</div><div><br=
></div><div><b>For</b><br></div><div><br></div><div>LEWG13.
The type trait `is_trivially_relocatable<T>` should be added to=20
the `<type_traits>` header, under that exact name, as proposed in=20
this paper.</div><div><br></div><div><b>SF</b><br></div><div><br></div><div=
>LEWG14. We approve of a trait with=20
the semantics of `is_trivially_relocatable<T>`, but possibly under
a different name. (For example, `is_bitwise_relocatable`.)</div><div><br><=
/div><div><b>For</b><br></div><br>Don't really care about the rest (neu=
tral).<br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/c2edd39c-6ccf-4f60-b0d3-eab4ddbda7fc%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/c2edd39c-6ccf-4f60-b0d3-eab4ddbda7fc=
%40isocpp.org</a>.<br />
------=_Part_269_1930304035.1542237455310--
------=_Part_268_1534955323.1542237455310--
.
Author: Matthew Woehlke <mwoehlke.floss@gmail.com>
Date: Thu, 15 Nov 2018 10:51:07 -0500
Raw View
On 14/11/2018 18.17, oleerikp@gmail.com wrote:
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)` should
> be added to the `<memory>` header, as proposed in this paper.
>
> *Against*
> - The suggested semantics seem questionable in the face of a possible
> exception in the middle of the loop. But rather than arguing about the
> specification, I think it should be dropped from the paper. The experts who
> would use this could easily roll their own anyway.
I don't think that's true. As I understand it, this function is, in some
sense, the sole reason the proposal has value. Specifically, it is
specially blessed as being able to actually perform a memcpy but still
DTRT WRT the memory model.
Without it, "the experts who would use this" must continue to rely on
UB, which defeats one of the main objectives of the proposal. (Am I
missing something? If so, please correct me!)
(That said, "against because I don't trust the semantics in the face of
exceptions" is useful feedback.)
--
Matthew
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/c49c73bf-ba2e-f1c2-8bc0-b4cf12129c71%40gmail.com.
.
Author: oleerikp@gmail.com
Date: Thu, 15 Nov 2018 14:33:43 -0800 (PST)
Raw View
------=_Part_107_1723935215.1542321223855
Content-Type: multipart/alternative;
boundary="----=_Part_108_2072477158.1542321223904"
------=_Part_108_2072477158.1542321223904
Content-Type: text/plain; charset="UTF-8"
On Thursday, November 15, 2018 at 4:51:11 PM UTC+1, Matthew Woehlke wrote:
>
> On 14/11/2018 18.17, olee...@gmail.com <javascript:> wrote:
> > - The suggested semantics seem questionable in the face of a possible
> > exception in the middle of the loop. But rather than arguing about the
> > specification, I think it should be dropped from the paper. The experts
> who
> > would use this could easily roll their own anyway.
>
> I don't think that's true. As I understand it, this function is, in some
> sense, the sole reason the proposal has value. Specifically, it is
> specially blessed as being able to actually perform a memcpy but still
> DTRT WRT the memory model.
>
> Without it, "the experts who would use this" must continue to rely on
> UB, which defeats one of the main objectives of the proposal. (Am I
> missing something? If so, please correct me!)
>
> (That said, "against because I don't trust the semantics in the face of
> exceptions" is useful feedback.)
>
> --
> Matthew
>
Well, in that case it's not enough. We need the ability to relocate to a
destination range that is only partially uninitialized, and backwards too.
(Consider vector erase and insert.) So I would continue to rely on UB
regardless.
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/fa156786-4288-47cf-bbe2-38bac6685dd6%40isocpp.org.
------=_Part_108_2072477158.1542321223904
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, November 15, 2018 at 4:51:11 PM UTC+1, Matthe=
w Woehlke wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin=
-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 14/11/2018 =
18.17, <a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"b=
EkInil5AwAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D'javascript:&#=
39;;return true;" onclick=3D"this.href=3D'javascript:';return true;=
">olee...@gmail.com</a> wrote:
<br>> =C2=A0- The suggested semantics seem questionable in the face of a=
possible=20
<br>> exception in the middle of the loop. But rather than arguing about=
the=20
<br>> specification, I think it should be dropped from the paper. The ex=
perts who=20
<br>> would use this could easily roll their own anyway.
<br>
<br>I don't think that's true. As I understand it, this function is=
, in some
<br>sense, the sole reason the proposal has value. Specifically, it is
<br>specially blessed as being able to actually perform a memcpy but still
<br>DTRT WRT the memory model.
<br>
<br>Without it, "the experts who would use this" must continue to=
rely on
<br>UB, which defeats one of the main objectives of the proposal. (Am I
<br>missing something? If so, please correct me!)
<br>
<br>(That said, "against because I don't trust the semantics in th=
e face of
<br>exceptions" is useful feedback.)
<br>
<br>--=20
<br>Matthew
<br></blockquote><style>.gsoi_w {background: transparent url("https://ssl.g=
static.com/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/ico=
ns.png") no-repeat scroll 4px 0px / 16px auto; height: 16px;}
..gsoi_x ,.gsoi_xu {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -16px / 16px auto; height: 16px;}
..gsoi_xs ,.gsoi_xsu {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -32px / 16px auto; height: 16px;}
..gsoi_c {padding-left: 4px; height: 16px;}
..gsoi_0 {background: transparent url("https://ssl.gstatic.com/cloudsearch/s=
tatic/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-repeat scrol=
l 4px -48px / 16px auto; height: 16px; opacity: 0.55;}
..gsoi_0s {background: transparent url("https://ssl.gstatic.com/cloudsearch/=
static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-repeat scro=
ll 4px -64px / 16px auto; height: 16px; opacity: 0.55;}
..gsoi_0u {background: transparent url("https://ssl.gstatic.com/cloudsearch/=
static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-repeat scro=
ll 4px -80px / 16px auto; height: 16px; opacity: 0.55;}
..gsoi_0su {background: transparent url("https://ssl.gstatic.com/cloudsearch=
/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-repeat scr=
oll 4px -96px / 16px auto; height: 16px; opacity: 0.55;}
..gsoi_1 ,.gsoi_1u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -112px / 16px auto; height: 16px;}
..gsoi_1s ,.gsoi_1su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -128px / 16px auto; height: 16px;}
..gsoi_2 ,.gsoi_2u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -144px / 16px auto; height: 16px;}
..gsoi_2s ,.gsoi_2su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -160px / 16px auto; height: 16px;}
..gsoi_3 ,.gsoi_3u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -176px / 16px auto; height: 16px;}
..gsoi_3s ,.gsoi_3su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -192px / 16px auto; height: 16px;}
..gsoi_4 ,.gsoi_4u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -208px / 16px auto; height: 16px;}
..gsoi_4s ,.gsoi_4su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -224px / 16px auto; height: 16px;}
..gsoi_5 ,.gsoi_5u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -240px / 16px auto; height: 16px;}
..gsoi_5s ,.gsoi_5su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -256px / 16px auto; height: 16px;}
..gsoi_6 ,.gsoi_6u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -272px / 16px auto; height: 16px;}
..gsoi_6s ,.gsoi_6su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -288px / 16px auto; height: 16px;}
..gsoi_7 ,.gsoi_7u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -304px / 16px auto; height: 16px;}
..gsoi_7s ,.gsoi_7su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -320px / 16px auto; height: 16px;}
..gsoi_8 ,.gsoi_8u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -336px / 16px auto; height: 16px;}
..gsoi_8s ,.gsoi_8su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -352px / 16px auto; height: 16px;}
..gsoi_9 ,.gsoi_9u {background: transparent url("https://ssl.gstatic.com/clo=
udsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-re=
peat scroll 4px -368px / 16px auto; height: 16px;}
..gsoi_9s ,.gsoi_9su {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -384px / 16px auto; height: 16px;}
..gsoi_10 ,.gsoi_10u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -400px / 16px auto; height: 16px;}
..gsoi_10s ,.gsoi_10su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -416px / 16px auto; height: 16px;}
..gsoi_11 ,.gsoi_11u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -432px / 16px auto; height: 16px;}
..gsoi_11s ,.gsoi_11su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -448px / 16px auto; height: 16px;}
..gsoi_12 ,.gsoi_12u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -464px / 16px auto; height: 16px;}
..gsoi_12s ,.gsoi_12su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -480px / 16px auto; height: 16px;}
..gsoi_13 ,.gsoi_13u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -496px / 16px auto; height: 16px;}
..gsoi_13s ,.gsoi_13su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -512px / 16px auto; height: 16px;}
..gsoi_14 ,.gsoi_14u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -528px / 16px auto; height: 16px;}
..gsoi_14s ,.gsoi_14su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -544px / 16px auto; height: 16px;}
..gsoi_15 ,.gsoi_15u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -560px / 16px auto; height: 16px;}
..gsoi_15s ,.gsoi_15su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -576px / 16px auto; height: 16px;}
..gsoi_16 ,.gsoi_16u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -592px / 16px auto; height: 16px;}
..gsoi_16s ,.gsoi_16su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -608px / 16px auto; height: 16px;}
..gsoi_17 ,.gsoi_17u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -624px / 16px auto; height: 16px;}
..gsoi_17s ,.gsoi_17su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -640px / 16px auto; height: 16px;}
..gsoi_18 ,.gsoi_18u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -656px / 16px auto; height: 16px;}
..gsoi_18s ,.gsoi_18su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -672px / 16px auto; height: 16px;}
..gsoi_19 ,.gsoi_19u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -688px / 16px auto; height: 16px;}
..gsoi_19s ,.gsoi_19su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -704px / 16px auto; height: 16px;}
..gsoi_20 ,.gsoi_20u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -720px / 16px auto; height: 16px;}
..gsoi_20s ,.gsoi_20su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -736px / 16px auto; height: 16px;}
..gsoi_21 ,.gsoi_21u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -752px / 16px auto; height: 16px;}
..gsoi_21s ,.gsoi_21su {background: transparent url("https://ssl.gstatic.com=
/cloudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") n=
o-repeat scroll 4px -768px / 16px auto; height: 16px;}
..gsoi_22 ,.gsoi_22u {background: transparent url("https://ssl.gstatic.com/c=
loudsearch/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-=
repeat scroll 4px -784px / 16px auto; height: 16px;}
..gsoi_gcs {background: transparent url("https://ssl.gstatic.com/cloudsearch=
/static/o/d/0016-a3cdcdc31a16b3497ed6ffcdaee4f325/icons.png") no-repeat scr=
oll 4px -800px / 16px auto; height: 16px;}
..gsop_f {font: 12px arial,sans-serif; margin-left: 5px; overflow: hidden; t=
ext-overflow: ellipsis; width: 150px;}
..gsop_g {font: 12px arial,sans-serif; margin-left: 6px; width: 55px;}
..gsop_i {width: 500px; overflow: hidden; text-overflow: ellipsis;}
..gsop_j {font: 11px arial,sans-serif; color: rgb(119, 119, 119); margin-lef=
t: 2px;}
..shr-lb-shr-c-shr-mb {background-image: url("//ssl.gstatic.com/docs/documen=
ts/share/images/sprite-22.svg");}
..shr-a-shr-nc-shr-oc {position: relative; display: inline-block;}
* html .shr-a-shr-nc-shr-oc ,body .shr-a-shr-nc-shr-oc {display: inline;}
:first-child + html .shr-a-shr-nc-shr-oc {display: inline;}
..shr-h-shr-he {border-radius: 2px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.=
2); transition: all 0s linear 1s, opacity 1s ease 0s; border-style: solid; =
border-width: 0px; font-size: 11px; height: 0px; opacity: 0; visibility: hi=
dden; overflow: hidden; padding: 0px; text-align: center;}
..shr-h-shr-he-shr-jd {background-color: rgb(249, 237, 190); border-color: r=
gb(240, 195, 109); color: rgb(51, 51, 51);}
..shr-h-shr-he-shr-x {background-color: rgb(72, 72, 72); border-color: rgb(3=
2, 32, 32); color: rgb(255, 255, 255);}
..shr-h-shr-he-shr-dc {background-color: rgb(214, 233, 248); border-color: r=
gb(77, 144, 240); color: rgb(51, 51, 51);}
..shr-h-shr-he-shr-gd {background-color: rgb(221, 75, 57); border-color: rgb=
(96, 32, 25); color: rgb(255, 255, 255);}
..shr-h-shr-he-shr-fd {transition: opacity 0.218s ease 0s; border-width: 1px=
; min-height: 14px; height: auto; opacity: 1; visibility: visible; padding:=
6px 16px;}
..shr-h-shr-he-shr-qc.shr-h-shr-he-shr-fd {padding: 2px 16px;}
..shr-h-shr-cb {border-radius: 2px; cursor: default; font-size: 11px; font-w=
eight: bold; text-align: center; white-space: nowrap; margin-right: 16px; h=
eight: 27px; line-height: 27px; min-width: 54px; outline: 0px none; padding=
: 0px 8px;}
..shr-h-shr-cb-shr-ud {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
..shr-h-shr-cb-shr-bd {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..shr-h-shr-cb .shr-h-shr-cb-shr-bc {margin-top: -3px; vertical-align: middl=
e;}
..shr-h-shr-cb-shr-db {margin-left: 5px;}
..shr-h-shr-cb-shr-z {min-width: 34px; padding: 0px;}
..shr-h-shr-cb-shr-jb-shr-kb ,.shr-h-shr-cb-shr-jb-shr-ie {z-index: 1;}
..shr-h-shr-cb-shr-jb-shr-kb.shr-h-shr-cb-shr-jc {z-index: 0;}
..shr-h-shr-cb-shr-yc.shr-h-shr-cb-shr-jb-shr-kb ,.shr-h-shr-cb-shr-yc.shr-h=
-shr-cb-shr-jb-shr-ie {z-index: 2;}
..shr-h-shr-cb-shr-jb-shr-kb:focus ,.shr-h-shr-cb-shr-jb-shr-ie:focus ,.shr-=
h-shr-cb-shr-ud.shr-h-shr-cb-shr-jb-shr-kb ,.shr-h-shr-cb-shr-ud.shr-h-shr-=
cb-shr-jb-shr-ie {z-index: 3;}
..shr-h-shr-cb-shr-jb-shr-kb {margin-left: -1px; border-bottom-left-radius: =
0px; border-top-left-radius: 0px;}
..shr-h-shr-cb-shr-jb-shr-ie {margin-right: 0px; border-top-right-radius: 0p=
x; border-bottom-right-radius: 0px;}
..shr-h-shr-cb.shr-h-shr-cb-shr-jc:active {box-shadow: none;}
..shr-h-shr-cb-shr-y {box-shadow: none; background-color: rgb(77, 144, 254);=
background-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb=
(71, 135, 237)); border: 1px solid rgb(48, 121, 237); color: rgb(255, 255, =
255);}
..shr-h-shr-cb-shr-y.shr-h-shr-cb-shr-ud {box-shadow: none; background-color=
: rgb(53, 122, 232); background-image: -moz-linear-gradient(center top , rg=
b(77, 144, 254), rgb(53, 122, 232)); border: 1px solid rgb(47, 91, 183);}
..shr-h-shr-cb-shr-y:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0=
);}
..shr-h-shr-cb-shr-y.shr-h-shr-cb-shr-k-shr-l {box-shadow: none; outline: me=
dium none;}
..shr-h-shr-cb-shr-y:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t; background: rgb(53, 122, 232) none repeat scroll 0% 0%; border: 1px soli=
d rgb(47, 91, 183);}
..shr-h-shr-cb-shr-y.shr-h-shr-cb-shr-jc {background: rgb(77, 144, 254) none=
repeat scroll 0% 0%; opacity: 0.5;}
..shr-h-shr-cb-shr-qb {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-ud ,.shr-h-shr-cb-shr-qb.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-ud {box-shadow: none; background-color: rgb(2=
48, 248, 248); background-image: -moz-linear-gradient(center top , rgb(248,=
248, 248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); colo=
r: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-qb:active ,.shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-ud:activ=
e {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 2=
48, 248) none repeat scroll 0% 0%;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-bd ,.shr-h-shr-cb-shr-qb.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-bd {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-yc ,.shr-h-shr-cb-shr-qb.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-yc {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1=
) inset; background-color: rgb(238, 238, 238); background-image: -moz-linea=
r-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1p=
x solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-qb:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-k-shr-l {border: 1px solid rgb(220, 2=
20, 220); outline: medium none;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-jc {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..shr-h-shr-cb-shr-qb .shr-h-shr-cb-shr-bc {opacity: 0.55;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-yc .shr-h-shr-cb-shr-bc ,.shr-h-shr-c=
b-shr-qb.shr-h-shr-cb-shr-bd .shr-h-shr-cb-shr-bc ,.shr-h-shr-cb-shr-qb.shr=
-h-shr-cb-shr-ud .shr-h-shr-cb-shr-bc {opacity: 0.9;}
..shr-h-shr-cb-shr-qb.shr-h-shr-cb-shr-jc .shr-h-shr-cb-shr-bc {opacity: 0.3=
33;}
..shr-h-shr-cb-shr-ec {box-shadow: none; background-color: rgb(61, 148, 0); =
background-image: -moz-linear-gradient(center top , rgb(61, 148, 0), rgb(57=
, 138, 0)); border: 1px solid rgb(41, 105, 29); color: rgb(255, 255, 255); =
text-shadow: 0px 1px rgba(0, 0, 0, 0.1);}
..shr-h-shr-cb-shr-ec.shr-h-shr-cb-shr-ud {box-shadow: none; background-colo=
r: rgb(54, 130, 0); background-image: -moz-linear-gradient(center top , rgb=
(61, 148, 0), rgb(54, 130, 0)); border: 1px solid rgb(45, 98, 0); text-shad=
ow: 0px 1px rgba(0, 0, 0, 0.3);}
..shr-h-shr-cb-shr-ec:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) =
inset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, =
0);}
..shr-h-shr-cb-shr-ec.shr-h-shr-cb-shr-k-shr-l {box-shadow: none; outline: m=
edium none;}
..shr-h-shr-cb-shr-ec:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) ins=
et; background: rgb(54, 130, 0) none repeat scroll 0% 0%; border: 1px solid=
rgb(45, 98, 0);}
..shr-h-shr-cb-shr-ec.shr-h-shr-cb-shr-jc {background: rgb(61, 148, 0) none =
repeat scroll 0% 0%; opacity: 0.5;}
..shr-h-shr-cb-shr-ub {box-shadow: none; background-color: rgb(209, 72, 54);=
background-image: -moz-linear-gradient(center top , rgb(221, 75, 57), rgb(=
209, 72, 54)); border: 1px solid transparent; color: rgb(255, 255, 255); te=
xt-shadow: 0px 1px rgba(0, 0, 0, 0.1); text-transform: uppercase;}
..shr-h-shr-cb-shr-ub.shr-h-shr-cb-shr-ud {box-shadow: 0px 1px 1px rgba(0, 0=
, 0, 0.2); background-color: rgb(197, 55, 39); background-image: -moz-linea=
r-gradient(center top , rgb(221, 75, 57), rgb(197, 55, 39)); border-width: =
1px; border-style: solid; border-color: rgb(176, 40, 26) rgb(176, 40, 26) r=
gb(175, 48, 31); -moz-border-top-colors: none; -moz-border-right-colors: no=
ne; -moz-border-bottom-colors: none; -moz-border-left-colors: none; border-=
image: none;}
..shr-h-shr-cb-shr-ub:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) =
inset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, =
0);}
..shr-h-shr-cb-shr-ub.shr-h-shr-cb-shr-k-shr-l {box-shadow: none; outline: m=
edium none;}
..shr-h-shr-cb-shr-ub:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) ins=
et; background-color: rgb(176, 40, 26); background-image: -moz-linear-gradi=
ent(center top , rgb(221, 75, 57), rgb(176, 40, 26)); border: 1px solid rgb=
(153, 42, 27);}
..shr-h-shr-cb-shr-ub.shr-h-shr-cb-shr-jc {background: rgb(209, 72, 54) none=
repeat scroll 0% 0%; opacity: 0.5;}
..shr-h-shr-ke {border-radius: 2px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0=
, 0.1) inset; background-color: rgb(245, 245, 245); background-image: -moz-=
linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); borde=
r: 1px solid rgb(204, 204, 204); color: rgb(102, 102, 102); font-weight: bo=
ld; height: 27px; line-height: 27px; margin-right: 16px; outline: medium no=
ne; overflow: hidden; padding: 0px; position: relative; width: 94px;}
..shr-h-shr-ke-shr-le ,.shr-h-shr-ke-shr-me ,.shr-h-shr-ke-shr-ne {display: =
inline-block; text-align: center; text-transform: uppercase; width: 47px;}
..shr-h-shr-ke-shr-le {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1) inset;=
background-color: rgb(57, 139, 242); background-image: -moz-linear-gradien=
t(center top , rgb(59, 147, 255), rgb(54, 137, 238)); color: rgb(255, 255, =
255); height: 27px;}
..shr-h-shr-ke-shr-me {border-radius: 2px 2px 0px 0px;}
..shr-h-shr-ke-shr-ne {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); backg=
round-color: rgb(245, 245, 245); background-image: -moz-linear-gradient(cen=
ter top , rgb(248, 248, 248), rgb(241, 241, 241)); transition: all 0.13s ea=
se-out 0s; border: 1px solid rgb(204, 204, 204); display: block; height: 27=
px; left: -1px; position: absolute; top: -1px;}
..shr-h-shr-ke-shr-ne::after {content: ""; background-image: -moz-linear-gra=
dient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-linear-g=
radient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-linear=
-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-line=
ar-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-li=
near-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%); backg=
round-position: 0px 0px, 0px 2px, 0px 4px, 0px 6px, 0px 8px; background-rep=
eat: repeat-x; background-size: 2px 1px; display: block; height: 9px; left:=
15px; position: absolute; top: 9px; width: 17px;}
..shr-h-shr-ke.shr-h-shr-ke-shr-yc .shr-h-shr-ke-shr-ne {left: 47px;}
..shr-h-shr-ke:focus {border: 1px solid rgb(77, 144, 254);}
..shr-h-shr-ke.shr-h-shr-ke-shr-oe {border: 1px solid rgb(204, 204, 204);}
..shr-h-shr-cb-shr-lc {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-ud ,.shr-h-shr-cb-shr-lc.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-ud {box-shadow: none; background-color: rgb(2=
48, 248, 248); background-image: -moz-linear-gradient(center top , rgb(248,=
248, 248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); colo=
r: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-lc:active ,.shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-ud:activ=
e {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 2=
48, 248) none repeat scroll 0% 0%; color: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-bd ,.shr-h-shr-cb-shr-lc.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-bd {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-yc ,.shr-h-shr-cb-shr-lc.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-yc {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1=
) inset; background-color: rgb(238, 238, 238); background-image: -moz-linea=
r-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1p=
x solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-lc:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-k-shr-l {border: 1px solid rgba(0, 0,=
0, 0.1); outline: medium none;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-jc {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..shr-h-shr-cb-shr-lc .shr-h-shr-cb-shr-bc {opacity: 0.55;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-yc .shr-h-shr-cb-shr-bc ,.shr-h-shr-c=
b-shr-lc.shr-h-shr-cb-shr-bd .shr-h-shr-cb-shr-bc ,.shr-h-shr-cb-shr-lc.shr=
-h-shr-cb-shr-ud .shr-h-shr-cb-shr-bc {opacity: 0.9;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-jc .shr-h-shr-cb-shr-bc {opacity: 0.3=
33;}
..shr-h-shr-cb-shr-fc {border-radius: 0px; border: 1px solid transparent; fo=
nt-size: 13px; font-weight: normal; height: 21px; line-height: 21px; margin=
-right: 1px; min-width: 0px; padding: 0px;}
..shr-h-shr-cb-shr-fc.shr-h-shr-cb-shr-ud ,.shr-h-shr-cb-shr-fc.shr-h-shr-cb=
-shr-bd ,.shr-h-shr-cb-shr-fc:focus ,.shr-h-shr-cb-shr-fc:active {box-shado=
w: none;}
..shr-h-shr-cb-shr-fc .shr-h-shr-cb-shr-bc {height: 21px; opacity: 0.55; wid=
th: 21px;}
..shr-h-shr-cb-shr-fc .shr-h-shr-cb-shr-db {display: inline-block; margin: 0=
px; padding: 0px 1px;}
..shr-h-shr-cb-shr-fc.shr-h-shr-cb-shr-bd .shr-h-shr-cb-shr-bc ,.shr-h-shr-c=
b-shr-fc.shr-h-shr-cb-shr-ud .shr-h-shr-cb-shr-bc {opacity: 0.9;}
..shr-h-shr-cb-shr-fc.shr-h-shr-cb-shr-jc .shr-h-shr-cb-shr-bc {opacity: 0.3=
33;}
..shr-h-shr-cb-shr-fc:focus {border: 1px solid rgb(77, 144, 254);}
..shr-h-shr-cb-shr-fc.shr-h-shr-cb-shr-k-shr-l {border: 1px solid transparen=
t;}
..shr-h-shr-cb-shr-qc {background-color: rgb(245, 245, 245); background-imag=
e: -moz-linear-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241)=
); border: 1px solid rgba(0, 0, 0, 0.1); color: rgb(68, 68, 68); height: 17=
px; line-height: 17px; min-width: 22px; text-shadow: 0px 1px rgba(0, 0, 0, =
0.1);}
..shr-h-shr-cb-shr-qc.shr-h-shr-cb-shr-ud ,.shr-h-shr-cb-shr-qc.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-ud {background-color: rgb(248, 248, 248); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(198, 198, 198); text-shadow: 0px 1px r=
gba(0, 0, 0, 0.3);}
..shr-h-shr-cb-shr-qc:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) ins=
et;}
..shr-h-shr-cb-shr-qc.shr-h-shr-cb-shr-yc ,.shr-h-shr-cb-shr-qc.shr-h-shr-cb=
-shr-k-shr-l.shr-h-shr-cb-shr-yc {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1=
) inset; background-color: rgb(224, 224, 224); background-image: -moz-linea=
r-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1p=
x solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..shr-h-shr-cb-shr-qc:focus {border: 1px solid rgb(77, 144, 254);}
..shr-h-shr-cb-shr-qc.shr-h-shr-cb-shr-k-shr-l {border: 1px solid rgb(220, 2=
20, 220);}
..shr-h-shr-cb-shr-qc.shr-h-shr-cb-shr-jc {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..shr-a-shr-fe ,.shr-q-shr-r {box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2); b=
ackground: rgb(255, 255, 255) none repeat scroll 0% 0% padding-box; border:=
1px solid rgba(0, 0, 0, 0.333); outline: 0px none; position: absolute;}
..shr-a-shr-fe-shr-xb ,.shr-q-shr-r-shr-xb {background: rgb(255, 255, 255) n=
one repeat scroll 0% 0%; left: 0px; position: absolute; top: 0px;}
div.shr-a-shr-fe-shr-xb ,div.shr-q-shr-r-shr-xb {opacity: 0.75;}
..shr-q-shr-r {color: rgb(0, 0, 0); padding: 30px 42px;}
..shr-q-shr-r-shr-m {background-color: rgb(255, 255, 255); color: rgb(0, 0, =
0); cursor: default; font-size: 16px; font-weight: normal; line-height: 24p=
x; margin: 0px 0px 16px;}
..shr-q-shr-r-shr-m-shr-yb {height: 11px; opacity: 0.7; padding: 17px; posit=
ion: absolute; right: 0px; top: 0px; width: 11px;}
..shr-q-shr-r-shr-m-shr-yb::after {content: ""; background: rgba(0, 0, 0, 0)=
url("//ssl.gstatic.com/ui/v1/dialog/close-x.png") repeat scroll 0% 0%; pos=
ition: absolute; height: 11px; width: 11px; right: 17px;}
..shr-q-shr-r-shr-m-shr-yb:hover {opacity: 1;}
..shr-q-shr-r-shr-td {background-color: rgb(255, 255, 255); line-height: 1.4=
em; overflow-wrap: break-word;}
..shr-q-shr-r-shr-be {margin-top: 16px;}
..shr-q-shr-r-shr-be button {border-radius: 2px; background-color: rgb(245, =
245, 245); background-image: -moz-linear-gradient(center top , rgb(245, 245=
, 245), rgb(241, 241, 241)); border: 1px solid rgba(0, 0, 0, 0.1); color: r=
gb(68, 68, 68); cursor: default; font-family: inherit; font-size: 11px; fon=
t-weight: bold; height: 29px; line-height: 27px; margin: 0px 16px 0px 0px; =
min-width: 72px; outline: 0px none; padding: 0px 8px;}
..shr-q-shr-r-shr-be button:hover ,.shr-q-shr-r-shr-be button:active {box-sh=
adow: 0px 1px 1px rgba(0, 0, 0, 0.1); background-color: rgb(248, 248, 248);=
background-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rg=
b(241, 241, 241)); border: 1px solid rgb(198, 198, 198); color: rgb(51, 51,=
51);}
..shr-q-shr-r-shr-be button:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.=
1) inset;}
..shr-q-shr-r-shr-be button:focus {border: 1px solid rgb(77, 144, 254);}
..shr-q-shr-r-shr-be button[disabled] {box-shadow: none; background: rgb(255=
, 255, 255) none repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05)=
; color: rgb(184, 184, 184);}
..shr-q-shr-r-shr-be .shr-a-shr-tb-shr-y {background-color: rgb(77, 144, 254=
); background-image: -moz-linear-gradient(center top , rgb(77, 144, 254), r=
gb(71, 135, 237)); border: 1px solid rgb(48, 121, 237); color: rgb(255, 255=
, 255);}
..shr-q-shr-r-shr-be .shr-a-shr-tb-shr-y:hover ,.shr-q-shr-r-shr-be .shr-a-s=
hr-tb-shr-y:active {background-color: rgb(53, 122, 232); background-image: =
-moz-linear-gradient(center top , rgb(77, 144, 254), rgb(53, 122, 232)); bo=
rder: 1px solid rgb(47, 91, 183); color: rgb(255, 255, 255);}
..shr-q-shr-r-shr-be .shr-a-shr-tb-shr-y:active {box-shadow: 0px 1px 2px rgb=
a(0, 0, 0, 0.3) inset;}
..shr-q-shr-r-shr-be .shr-a-shr-tb-shr-y:focus {box-shadow: 0px 0px 0px 1px =
rgb(255, 255, 255) inset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px =
none rgba(0, 0, 0, 0);}
..shr-q-shr-r-shr-be .shr-a-shr-tb-shr-y[disabled] {box-shadow: none; backgr=
ound: rgb(77, 144, 254) none repeat scroll 0% 0%; color: rgb(255, 255, 255)=
; opacity: 0.5;}
..shr-h-shr-eb ,.shr-h-shr-zc ,.shr-h-shr-id {width: 512px;}
..shr-a-shr-fb {border-radius: 0px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.=
2); transition: opacity 0.218s ease 0s; background: rgb(255, 255, 255) none=
repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.2); cursor: default=
; font-size: 13px; margin: 0px; outline: medium none; padding: 6px 0px; pos=
ition: absolute;}
..shr-a-shr-fc-shr-fb-shr-cb {border-radius: 2px; background-color: rgb(245,=
245, 245); background-image: -moz-linear-gradient(center top , rgb(245, 24=
5, 245), rgb(241, 241, 241)); border: 1px solid rgb(220, 220, 220); color: =
rgb(68, 68, 68); cursor: default; font-size: 11px; font-weight: bold; line-=
height: 27px; list-style: outside none none; margin: 0px 2px; min-width: 46=
px; outline: medium none; padding: 0px 18px 0px 6px; text-align: center; te=
xt-decoration: none;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-jc {background-color: rgb(255, 255, 255); b=
order-color: rgb(243, 243, 243); color: rgb(184, 184, 184);}
..shr-a-shr-fc-shr-fb-shr-cb.shr-a-shr-fc-shr-fb-shr-cb-shr-ud {background-c=
olor: rgb(248, 248, 248); background-image: -moz-linear-gradient(center top=
, rgb(248, 248, 248), rgb(241, 241, 241)); box-shadow: 0px 1px 1px rgba(0,=
0, 0, 0.1); border-color: rgb(198, 198, 198); color: rgb(51, 51, 51);}
..shr-a-shr-fc-shr-fb-shr-cb.shr-a-shr-fc-shr-fb-shr-cb-shr-kd {border-color=
: rgb(77, 144, 254);}
..shr-a-shr-fc-shr-fb-shr-cb.shr-a-shr-fc-shr-fb-shr-cb-shr-ad ,.shr-a-shr-f=
c-shr-fb-shr-cb.shr-a-shr-fc-shr-fb-shr-cb-shr-ib {box-shadow: 0px 1px 2px =
rgba(0, 0, 0, 0.1) inset; background-color: rgb(238, 238, 238); background-=
image: -moz-linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, =
224)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51); z-inde=
x: 2;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-pe {vertical-align: top; white-space: nowra=
p;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-qe {border-color: rgb(119, 119, 119) transp=
arent; border-style: solid; border-width: 4px 4px 0px; height: 0px; width: =
0px; position: absolute; right: 5px; top: 12px;}
..shr-a-shr-fc-shr-fb-shr-cb .shr-a-shr-fc-shr-fb-shr-cb-shr-bc {margin-top:=
-3px; opacity: 0.55; vertical-align: middle;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-ib .shr-a-shr-fc-shr-fb-shr-cb-shr-bc ,.shr=
-a-shr-fc-shr-fb-shr-cb-shr-ad .shr-a-shr-fc-shr-fb-shr-cb-shr-bc ,.shr-a-s=
hr-fc-shr-fb-shr-cb-shr-bd .shr-a-shr-fc-shr-fb-shr-cb-shr-bc ,.shr-a-shr-f=
c-shr-fb-shr-cb-shr-ud .shr-a-shr-fc-shr-fb-shr-cb-shr-bc {opacity: 0.9;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-ib .shr-a-shr-fc-shr-fb-shr-cb-shr-qe ,.shr=
-a-shr-fc-shr-fb-shr-cb-shr-ad .shr-a-shr-fc-shr-fb-shr-cb-shr-qe ,.shr-a-s=
hr-fc-shr-fb-shr-cb-shr-bd .shr-a-shr-fc-shr-fb-shr-cb-shr-qe ,.shr-a-shr-f=
c-shr-fb-shr-cb-shr-ud .shr-a-shr-fc-shr-fb-shr-cb-shr-qe {border-color: rg=
b(89, 89, 89) transparent;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-kb ,.shr-a-shr-fc-shr-fb-shr-cb-shr-ie {z-i=
ndex: 1;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-kb.shr-a-shr-fc-shr-fb-shr-cb-shr-jc {z-ind=
ex: 0;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-ie:focus ,.shr-a-shr-fc-shr-fb-shr-cb-shr-u=
d.shr-a-shr-fc-shr-fb-shr-cb-shr-jb-shr-ie {z-index: 2;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-kb:focus ,.shr-a-shr-fc-shr-fb-shr-cb-shr-u=
d.shr-a-shr-fc-shr-fb-shr-cb-shr-jb-shr-kb {z-index: 2;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-jb-shr-kb {margin-left: -1px; border-bottom=
-left-radius: 0px; border-top-left-radius: 0px; min-width: 0px; padding-lef=
t: 0px; vertical-align: top;}
..shr-a-shr-fc-shr-fb-shr-cb-shr-jb-shr-ie {margin-right: 0px; border-top-ri=
ght-radius: 0px; border-bottom-right-radius: 0px;}
..shr-a-shr-o ,.shr-a-shr-re ,.shr-a-shr-se {position: relative; color: rgb(=
51, 51, 51); cursor: pointer; list-style: outside none none; margin: 0px; p=
adding: 6px 8em 6px 30px; white-space: nowrap;}
..shr-a-shr-fb-shr-te .shr-a-shr-o ,.shr-a-shr-fb-shr-cc .shr-a-shr-o {paddi=
ng-left: 16px; vertical-align: middle;}
..shr-a-shr-fb-shr-rc .shr-a-shr-o {padding-right: 44px;}
..shr-a-shr-o-shr-jc {cursor: default;}
..shr-a-shr-o-shr-jc .shr-a-shr-o-shr-je ,.shr-a-shr-o-shr-jc .shr-a-shr-o-s=
hr-td {color: rgb(204, 204, 204) !important;}
..shr-a-shr-o-shr-jc .shr-a-shr-o-shr-p {opacity: 0.3;}
..shr-a-shr-o-shr-vd ,.shr-a-shr-o-shr-ud {background-color: rgb(238, 238, 2=
38); border-color: rgb(238, 238, 238); border-style: dotted; border-width: =
1px 0px; padding-top: 5px; padding-bottom: 5px;}
..shr-a-shr-o-shr-vd .shr-a-shr-o-shr-td ,.shr-a-shr-o-shr-ud .shr-a-shr-o-s=
hr-td {color: rgb(51, 51, 51);}
..shr-a-shr-o-shr-ic ,.shr-a-shr-o-shr-p {background-repeat: no-repeat; heig=
ht: 21px; left: 3px; position: absolute; right: auto; top: 3px; vertical-al=
ign: middle; width: 21px;}
..shr-a-shr-zb-shr-bd {background-image: url("//ssl.gstatic.com/ui/v1/menu/c=
heckmark.png"); background-repeat: no-repeat; background-position: left cen=
ter;}
..shr-a-shr-zb-shr-bd .shr-a-shr-o-shr-td {color: rgb(51, 51, 51);}
..shr-a-shr-o-shr-je {color: rgb(119, 119, 119); direction: ltr; left: auto;=
padding: 0px 6px; position: absolute; right: 0px; text-align: right;}
..shr-a-shr-o-shr-rd-shr-ue {text-decoration: underline;}
..shr-a-shr-o-shr-rd-shr-pb {color: rgb(119, 119, 119); font-size: 12px; pad=
ding-left: 4px;}
..shr-a-shr-od {border-top: 1px solid rgb(235, 235, 235); margin-top: 6px; m=
argin-bottom: 6px;}
..shr-h-shr-ve {box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); background-color=
: rgb(255, 255, 255); border-width: 1px; border-style: solid; -moz-border-t=
op-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors:=
none; -moz-border-left-colors: none; border-image: none; border-color: rgb=
(187, 187, 187) rgb(187, 187, 187) rgb(168, 168, 168); padding: 16px; posit=
ion: absolute; z-index: 1201 !important;}
..shr-h-shr-ve-shr-we {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/u=
i/v1/icons/common/x_8px.png") no-repeat scroll 0% 0%; border: 1px solid tra=
nsparent; height: 21px; opacity: 0.4; outline: 0px none; position: absolute=
; right: 2px; top: 2px; width: 21px;}
..shr-h-shr-ve-shr-we:focus {border: 1px solid rgb(77, 144, 254); opacity: 0=
..8;}
..shr-h-shr-ve-shr-dd {position: absolute;}
..shr-h-shr-ve-shr-dd .shr-h-shr-ve-shr-bb ,.shr-h-shr-ve-shr-dd .shr-h-shr-=
ve-shr-hd {display: block; height: 0px; position: absolute; width: 0px;}
..shr-h-shr-ve-shr-dd .shr-h-shr-ve-shr-bb {border: 9px solid;}
..shr-h-shr-ve-shr-dd .shr-h-shr-ve-shr-hd {border: 8px solid;}
..shr-h-shr-ve-shr-sd {bottom: 0px;}
..shr-h-shr-ve-shr-kc {top: -9px;}
..shr-h-shr-ve-shr-xc {left: -9px;}
..shr-h-shr-ve-shr-mc {right: 0px;}
..shr-h-shr-ve-shr-sd .shr-h-shr-ve-shr-bb ,.shr-h-shr-ve-shr-kc .shr-h-shr-=
ve-shr-bb {border-color: rgb(187, 187, 187) transparent; left: -9px;}
..shr-h-shr-ve-shr-sd .shr-h-shr-ve-shr-bb {border-color: rgb(168, 168, 168)=
transparent;}
..shr-h-shr-ve-shr-sd .shr-h-shr-ve-shr-hd ,.shr-h-shr-ve-shr-kc .shr-h-shr-=
ve-shr-hd {border-color: rgb(255, 255, 255) transparent; left: -8px;}
..shr-h-shr-ve-shr-sd .shr-h-shr-ve-shr-bb {border-bottom-width: 0px;}
..shr-h-shr-ve-shr-sd .shr-h-shr-ve-shr-hd {border-bottom-width: 0px;}
..shr-h-shr-ve-shr-kc .shr-h-shr-ve-shr-bb {border-top-width: 0px;}
..shr-h-shr-ve-shr-kc .shr-h-shr-ve-shr-hd {border-top-width: 0px; top: 1px;=
}
..shr-h-shr-ve-shr-xc .shr-h-shr-ve-shr-bb ,.shr-h-shr-ve-shr-mc .shr-h-shr-=
ve-shr-bb {border-color: transparent rgb(187, 187, 187); top: -9px;}
..shr-h-shr-ve-shr-xc .shr-h-shr-ve-shr-hd ,.shr-h-shr-ve-shr-mc .shr-h-shr-=
ve-shr-hd {border-color: transparent rgb(255, 255, 255); top: -8px;}
..shr-h-shr-ve-shr-xc .shr-h-shr-ve-shr-bb {border-left-width: 0px;}
..shr-h-shr-ve-shr-xc .shr-h-shr-ve-shr-hd {border-left-width: 0px; left: 1p=
x;}
..shr-h-shr-ve-shr-mc .shr-h-shr-ve-shr-bb {border-right-width: 0px;}
..shr-h-shr-ve-shr-mc .shr-h-shr-ve-shr-hd {border-right-width: 0px;}
..shr-h-shr-i {border-radius: 0px; box-shadow: none; background-color: rgb(4=
2, 42, 42); border: 1px solid rgb(255, 255, 255); color: rgb(255, 255, 255)=
; cursor: default; display: block; font-size: 11px; font-weight: bold; marg=
in-left: -1px; opacity: 1; padding: 7px 9px; position: absolute; visibility=
: visible; white-space: pre-wrap; word-break: break-all;}
..shr-h-shr-i-shr-j {opacity: 0; left: 20px !important; top: 20px !important=
; visibility: hidden;}
..shr-h-shr-i-shr-ld {display: none;}
..shr-h-shr-i-shr-dd {pointer-events: none; position: absolute;}
..shr-h-shr-i-shr-dd .shr-h-shr-i-shr-bb ,.shr-h-shr-i-shr-dd .shr-h-shr-i-s=
hr-hd {content: ""; display: block; height: 0px; position: absolute; width:=
0px;}
..shr-h-shr-i-shr-dd .shr-h-shr-i-shr-bb {border: 6px solid;}
..shr-h-shr-i-shr-dd .shr-h-shr-i-shr-hd {border: 5px solid;}
..shr-h-shr-i-shr-sd {bottom: 0px;}
..shr-h-shr-i-shr-kc {top: -6px;}
..shr-h-shr-i-shr-xc {left: -6px;}
..shr-h-shr-i-shr-mc {right: 0px;}
..shr-h-shr-i-shr-sd .shr-h-shr-i-shr-bb ,.shr-h-shr-i-shr-kc .shr-h-shr-i-s=
hr-bb {border-color: rgb(255, 255, 255) transparent; left: -6px;}
..shr-h-shr-i-shr-sd .shr-h-shr-i-shr-hd ,.shr-h-shr-i-shr-kc .shr-h-shr-i-s=
hr-hd {border-color: rgb(42, 42, 42) transparent; left: -5px;}
..shr-h-shr-i-shr-sd .shr-h-shr-i-shr-bb {border-bottom-width: 0px;}
..shr-h-shr-i-shr-sd .shr-h-shr-i-shr-hd {border-bottom-width: 0px;}
..shr-h-shr-i-shr-kc .shr-h-shr-i-shr-bb {border-top-width: 0px;}
..shr-h-shr-i-shr-kc .shr-h-shr-i-shr-hd {border-top-width: 0px; top: 1px;}
..shr-h-shr-i-shr-xc .shr-h-shr-i-shr-bb ,.shr-h-shr-i-shr-mc .shr-h-shr-i-s=
hr-bb {border-color: transparent rgb(255, 255, 255); top: -6px;}
..shr-h-shr-i-shr-xc .shr-h-shr-i-shr-hd ,.shr-h-shr-i-shr-mc .shr-h-shr-i-s=
hr-hd {border-color: transparent rgb(42, 42, 42); top: -5px;}
..shr-h-shr-i-shr-xc .shr-h-shr-i-shr-bb {border-left-width: 0px;}
..shr-h-shr-i-shr-xc .shr-h-shr-i-shr-hd {border-left-width: 0px; left: 1px;=
}
..shr-h-shr-i-shr-mc .shr-h-shr-i-shr-bb {border-right-width: 0px;}
..shr-h-shr-i-shr-mc .shr-h-shr-i-shr-hd {border-right-width: 0px;}
..shr-xe-shr-ye-shr-ze {position: absolute; top: -1000px; height: 1px; overf=
low: hidden;}
..shr-c-shr-s-shr-g {font-family: Roboto,arial,sans-serif; font-size: 13px; =
font-weight: bold; position: fixed; display: inline-block; padding-bottom: =
5px;}
..shr-c-shr-d-shr-r .shr-c-shr-s-shr-g {font-family: arial,sans-serif;}
..shr-c-shr-s-shr-g .shr-h-shr-he-shr-fd {height: 21px;}
..shr-c-shr-s-shr-t {top: 23px;}
..shr-c-shr-s-shr-wc {z-index: 3021;}
..shr-c-shr-nb-shr-p {opacity: 0.55; display: inline-block; width: 21px; hei=
ght: 21px; margin-bottom: 1px; margin-top: 1px; margin-right: 1px; vertical=
-align: middle;}
..shr-c-shr-nb-shr-rb ,.shr-c-shr-nb-shr-ob {line-height: 21px;}
..shr-c-shr-nb-shr-ob ,.shr-c-shr-nb-shr-ob:visited {color: rgb(17, 85, 204)=
; text-decoration: none; cursor: pointer;}
..shr-c-shr-nb-shr-ob:focus {outline: medium none;}
..shr-c-shr-nb-shr-ob:active {color: rgb(209, 72, 54);}
..shr-c-shr-nb-shr-ob:disabled {color: rgb(34, 34, 34); cursor: default;}
..shr-c-shr-nb-shr-de-shr-p {background-position: 0px -120px;}
..shr-c-shr-nb-shr-gc-shr-hc-shr-p {background-position: 0px -72px;}
..shr-c-shr-nb-shr-sb-shr-ob-shr-p {background-position: 0px -294px;}
..shr-c-shr-d-shr-r {max-height: 100%; overflow: auto; width: auto !importan=
t; box-sizing: border-box;}
* html .shr-c-shr-d-shr-r ,body .shr-c-shr-d-shr-r {max-height: none !impor=
tant; overflow: visible !important;}
:first-child + html .shr-c-shr-d-shr-r {max-height: none !important; overfl=
ow: visible !important;}
..shr-c-shr-d-shr-r .shr-q-shr-r-shr-td {padding: 0px;}
..shr-c-shr-d-shr-r .shr-q-shr-r-shr-m {padding: 0px;}
..shr-c-shr-d-shr-r .shr-c-shr-d-shr-r-shr-cd-shr-m {height: 0px; margin: 0p=
x; padding: 0px;}
..shr-c-shr-d-shr-r .shr-q-shr-r-shr-m {font-family: arial,sans-serif; font-=
weight: normal;}
..shr-c-shr-d-shr-td-shr-ge {height: 100%; width: 100%; border: medium none;=
}
..shr-c-shr-d-shr-r .shr-q-shr-r-shr-be {display: none;}
..shr-c-shr-d-shr-x-shr-r {font-family: arial,sans-serif; font-size: 12px; w=
idth: 400px;}
..shr-c-shr-d-shr-ac-shr-pc {height: 99px; text-align: center; width: 454px;=
}
..shr-c-shr-d-shr-e {background-image: url("//ssl.gstatic.com/docs/documents=
/share/images/spinner-1.gif"); display: inline-block; margin-top: 41px; wid=
th: 16px; height: 16px;}
..shr-nc-shr-c-shr-af-shr-bf {font-size: 12pt; font-weight: bold; height: 19=
px; padding: 5px 10px; background-color: rgb(241, 244, 255);}
..shr-nc-shr-c-shr-af-shr-cf {position: absolute; z-index: 150; background-c=
olor: rgb(255, 255, 255); opacity: 0;}
..shr-c-shr-d-shr-df-shr-r-shr-c {height: 100%; width: 100%;}
..shr-c-shr-d-shr-df-shr-r-shr-cf {position: absolute; z-index: 150;}
..shr-c-shr-d-shr-ab {position: absolute !important; left: -10000px !importa=
nt; top: -10000px !important;}
..shr-c-shr-d-shr-ac-shr-r {font-family: arial,sans-serif;}
..shr-c-shr-d-shr-u {display: none; position: absolute; bottom: 0px; right: =
0px; color: rgb(119, 119, 119); font-size: 10px;}
..shr-tc-shr-uc-shr-c-shr-d-shr-r {border: medium none; border-radius: 2px; =
box-shadow: 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0,=
0, 0, 0.12), 0px 11px 15px -7px rgba(0, 0, 0, 0.2); overflow: hidden; padd=
ing: 0px;}
..shr-yd-shr-zd-shr-c-shr-d-shr-r {background: transparent none repeat scrol=
l 0% 0%; border: medium none !important; height: 100vh; padding: 0px !impor=
tant; width: 100vw !important;}
..shr-yd-shr-zd-shr-c-shr-d-shr-r .shr-q-shr-r-shr-td {background: transpare=
nt none repeat scroll 0% 0%; height: 100%; width: 100%;}
..shr-q-shr-r.shr-c-shr-d-shr-r.shr-tc-shr-uc-shr-c-shr-d-shr-r {padding: 0p=
x;}
..shr-yd-shr-zd-shr-c-shr-d-shr-r .shr-q-shr-r-shr-m ,.shr-tc-shr-uc-shr-c-s=
hr-d-shr-r .shr-q-shr-r-shr-m {display: none;}
..shr-h-shr-i {z-index: 30000;}
..shr-f-shr-g ,.shr-f-shr-p {display: inline-block;}
..shr-f-shr-cb-shr-p {margin: -3px 2px 0px -5px; vertical-align: middle !imp=
ortant;}
..shr-f-shr-i-shr-pc {color: rgb(255, 255, 255); font-size: 13px; max-width:=
300px;}
..shr-f-shr-i-shr-m {font-size: 14px; font-weight: bold;}
..shr-f-shr-i-shr-n {font-weight: normal;}
..shr-f-shr-i-shr-p-shr-g {width: 25px; vertical-align: top;}
..shr-f-shr-i-shr-pb {border-top: 1px solid rgb(85, 85, 85); margin: 2px 0px=
;}
..shr-h-shr-cb-shr-lc .shr-f-shr-cb-shr-p {opacity: 0.55;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-yc .shr-f-shr-cb-shr-p ,.shr-h-shr-cb=
-shr-lc.shr-h-shr-cb-shr-bd .shr-f-shr-cb-shr-p ,.shr-h-shr-cb-shr-lc.shr-h=
-shr-cb-shr-ud .shr-f-shr-cb-shr-p {opacity: 0.9;}
..shr-h-shr-cb-shr-lc.shr-h-shr-cb-shr-jc .shr-f-shr-cb-shr-p {opacity: 0.33=
3;}
..shr-f-shr-wb-shr-p-shr-w ,.shr-f-shr-gb-shr-p-shr-w ,.shr-f-shr-vb-shr-wb-=
shr-p-shr-w ,.shr-f-shr-vb-shr-gb-shr-p-shr-w ,.shr-f-shr-wd-shr-xd-shr-p-s=
hr-w ,.shr-f-shr-v-shr-p-shr-w ,.shr-f-shr-ee-shr-p-shr-w ,.shr-f-shr-ae-sh=
r-p {width: 21px; height: 21px; background-repeat: no-repeat; vertical-alig=
n: bottom;}
..shr-f-shr-wb-shr-p-shr-w {background-position: 0px -802px;}
..shr-f-shr-gb-shr-p-shr-w {background-position: 0px -48px;}
..shr-f-shr-vb-shr-wb-shr-p-shr-w {background-position: 0px -243px;}
..shr-f-shr-vb-shr-gb-shr-p-shr-w {background-position: 0px -599px;}
..shr-f-shr-wd-shr-xd-shr-p-shr-w {background-position: 0px -318px;}
..shr-f-shr-v-shr-p-shr-w {background-position: 0px -219px;}
..shr-f-shr-ee-shr-p-shr-w {background-position: 0px -623px;}
..shr-f-shr-ae-shr-p {background-position: 0px -898px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-wb-shr-p-shr-w {background-position: 0px -=
671px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-gb-shr-p-shr-w {background-position: 0px -=
294px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-vb-shr-wb-shr-p-shr-w {background-position=
: 0px -850px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-vb-shr-gb-shr-p-shr-w {background-position=
: 0px -551px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-wd-shr-xd-shr-p-shr-w {background-position=
: 0px -72px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-v-shr-p-shr-w {background-position: 0px -5=
75px;}
..shr-ef-shr-ff-shr-gf .shr-f-shr-ee-shr-p-shr-w {background-position: 0px -=
826px;}
..shr-q-shr-r {font-family: arial,sans-serif; z-index: 2147483647;}
..shr-q-shr-r-shr-xb {z-index: 2147483646;}
HTML {margin: 0px !important; border: medium none !important;}
..dragdrop-handle {cursor: move; -moz-user-select: none;}
..dragdrop-draggable { }
..dragdrop-dragging { }
..dragdrop-positioner {border: 1px dashed rgb(30, 144, 255); margin: 0px !im=
portant; z-index: 100;}
..dragdrop-flow-panel-positioner {color: rgb(30, 144, 255); display: inline;=
text-align: center; vertical-align: middle;}
..dragdrop-proxy {background-color: rgb(119, 170, 255);}
..dragdrop-selected ,.dragdrop-dragging ,.dragdrop-proxy {opacity: 0.3;}
..dragdrop-movable-panel {z-index: 200; margin: 0px !important; border: medi=
um none !important;}
..gb_ad {display: inline-block; padding: 0px 0px 0px 15px; vertical-align: m=
iddle;}
..gb_ad:first-child ,#gbsfw:first-child + .gb_ad {padding-left: 0px;}
..gb_Rc {position: relative;}
..gb_b {display: inline-block; outline: medium none; vertical-align: middle;=
border-radius: 2px; box-sizing: border-box; height: 30px; width: 30px; col=
or: rgb(0, 0, 0); cursor: pointer; text-decoration: none;}
#gb#gb a.gb_b {color: rgb(0, 0, 0); cursor: pointer; text-decoration: none;=
}
..gb_tb {border-color: transparent transparent rgb(255, 255, 255); border-st=
yle: dashed dashed solid; border-width: 0px 8.5px 8.5px; display: none; pos=
ition: absolute; left: 6.5px; top: 37px; z-index: 1; height: 0px; width: 0p=
x; animation: 0.2s ease 0s normal none 1 running gb__a;}
..gb_ub {border-color: transparent transparent rgba(0, 0, 0, 0.2); border-st=
yle: dashed dashed solid; border-width: 0px 8.5px 8.5px; display: none; pos=
ition: absolute; left: 6.5px; z-index: 1; height: 0px; width: 0px; animatio=
n: 0.2s ease 0s normal none 1 running gb__a; top: 36px;}
..gb_aa {background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1p=
x solid rgba(0, 0, 0, 0.2); color: rgb(0, 0, 0); box-shadow: 0px 2px 10px r=
gba(0, 0, 0, 0.2); display: none; outline: medium none; overflow: hidden; p=
osition: absolute; right: 0px; top: 44px; animation: 0.2s ease 0s normal no=
ne 1 running gb__a; border-radius: 2px; -moz-user-select: text;}
..gb_ad.gb_g .gb_tb ,.gb_ad.gb_g .gb_ub ,.gb_ad.gb_g .gb_aa ,.gb_g.gb_aa {di=
splay: block;}
..gb_ad.gb_g.gb_Qf .gb_tb ,.gb_ad.gb_g.gb_Qf .gb_ub {display: none;}
..gb_Rf {position: absolute; right: 0px; top: 44px; z-index: -1;}
..gb_cb .gb_tb ,.gb_cb .gb_ub ,.gb_cb .gb_aa {margin-top: -10px;}
..gb_8a {display: none !important;}
..gb_9a {visibility: hidden;}
..gb_Rb .gb_ub {border-width: 1px 0px 0px 1px; border-style: solid none none=
solid; border-color: rgba(0, 0, 0, 0.2) currentcolor currentcolor rgba(0, =
0, 0, 0.2); -moz-border-top-colors: none; -moz-border-right-colors: none; -=
moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image=
: none; height: 14px; width: 14px; transform: rotate(45deg);}
..gb_Rb .gb_tb {border-width: 1px 0px 0px 1px; border-style: solid none none=
solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-=
border-bottom-colors: none; -moz-border-left-colors: none; border-image: no=
ne; height: 14px; width: 14px; transform: rotate(45deg); border-color: rgb(=
255, 255, 255); background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..gb_8 .gb_b {background-position: 0px -894px; opacity: 0.55;}
..gb_9 .gb_8 .gb_b {background-position: 0px -894px;}
..gb_S .gb_8 .gb_b {background-position: 0px -2180px; opacity: 1;}
..gb_aa.gb_ba {min-height: 196px; overflow-y: auto; width: 320px;}
..gb_ca {transition: height 0.2s ease-in-out 0s;}
..gb_da {background: rgb(255, 255, 255) none repeat scroll 0% 0%; margin: 0p=
x; min-height: 100px; padding: 28px 27px 28px 28px; text-align: left; white=
-space: normal; width: 265px;}
..gb_ea {background: rgb(245, 245, 245) none repeat scroll 0% 0%; cursor: po=
inter; height: 40px; overflow: hidden;}
..gb_fa {position: relative;}
..gb_ea {display: block; line-height: 40px; text-align: center; width: 320px=
;}
..gb_fa {display: block; line-height: 40px; text-align: center;}
..gb_fa.gb_ga {line-height: 0;}
..gb_ea ,.gb_ea:visited ,.gb_ea:active ,.gb_fa ,.gb_fa:visited {color: rgba(=
0, 0, 0, 0.87); text-decoration: none;}
..gb_fa:active {color: rgba(0, 0, 0, 0.87);}
#gb a.gb_ea ,#gb a.gb_ea:visited ,#gb a.gb_ea:active ,#gb a.gb_fa ,#gb a.gb=
_fa:visited {color: rgba(0, 0, 0, 0.87); text-decoration: none;}
#gb a.gb_fa:active {color: rgba(0, 0, 0, 0.87);}
..gb_fa ,.gb_da {display: none;}
..gb_6 ,.gb_6 + .gb_fa ,.gb_ha .gb_fa ,.gb_ha .gb_da {display: block;}
..gb_fa:hover ,.gb_fa:active ,#gb a.gb_fa:hover ,#gb a.gb_fa:active {text-de=
coration: underline;}
..gb_fa {border-bottom: 1px solid rgb(235, 235, 235); left: 28px; width: 264=
px;}
..gb_ha .gb_ea {display: none;}
..gb_fa:last-child {border-bottom-width: 0px;}
..gb_ia .gb_O {display: initial;}
..gb_ia.gb_ja {height: 100px; text-align: center;}
..gb_ia.gb_ja img {padding: 34px 0px; height: 32px; width: 32px;}
..gb_ia .gb_W + img {border: 0px none; margin: 8px; height: 48px; width: 48p=
x;}
..gb_ia div.gb_ka {background: rgb(255, 255, 170) none repeat scroll 0% 0%; =
border-radius: 5px; padding: 5px; text-align: center;}
..gb_ia.gb_la ,.gb_ia.gb_ma {padding-bottom: 0px;}
..gb_ia.gb_na ,.gb_ia.gb_ma {padding-top: 0px;}
..gb_ia.gb_ma a ,.gb_ia.gb_na a {top: 0px;}
..gb_oa .gb_ea {margin-top: 0px; position: static;}
..gb_pa {display: inline-block;}
..gb_qa {margin: -12px 28px 28px; position: relative; width: 264px; border-r=
adius: 2px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1), 0px 0px 1px rgba(0,=
0, 0, 0.1);}
..gb_Z {background-image: url("https://ssl.gstatic.com/gb/images/v1_00f2d726=
..png"); background-size: 92px 2835px; display: inline-block; margin: 8px; v=
ertical-align: middle; height: 64px; width: 64px;}
..gb_ra {color: rgb(38, 38, 38); display: inline-block; font: 13px/18px Aria=
l,sans-serif; margin-right: 80px; padding: 10px 10px 10px 0px; vertical-ali=
gn: middle; white-space: normal;}
..gb_sa {font: 16px/24px Arial,sans-serif;}
..gb_ta ,#gb#gb .gb_ta {color: rgb(66, 127, 237); text-decoration: none;}
..gb_ta:hover ,#gb#gb .gb_ta:hover {text-decoration: underline;}
..gb_ua .gb_da {position: relative;}
..gb_ua .gb_O {position: absolute; top: 28px; left: 28px;}
..gb_ea.gb_va {display: none; height: 0px;}
..gb_N .gb_8 .gb_b::before ,.gb_N.gb_9 .gb_8 .gb_b::before {left: 0px; top: =
-894px;}
..gb_N.gb_S .gb_8 .gb_b::before {left: 0px; top: -2180px;}
..gb_Rb .gb_ea {position: relative;}
..gb_8 .gb_b:hover ,.gb_8 .gb_b:focus {opacity: 0.85;}
..gb_S .gb_8 .gb_b:hover ,.gb_S .gb_8 .gb_b:focus {opacity: 1;}
#gb#gb a.gb_O ,#gb#gb a.gb_P ,#gb#gb span.gb_P {color: rgba(0, 0, 0, 0.87);=
text-decoration: none;}
#gb#gb a.gb_P:hover ,#gb#gb a.gb_P:focus {opacity: 0.85; text-decoration: u=
nderline;}
..gb_Q.gb_R {display: none; padding-left: 15px; vertical-align: middle;}
..gb_Q.gb_R:first-child {padding-left: 0px;}
..gb_Q .gb_P {display: inline-block; line-height: 24px; outline: medium none=
; vertical-align: middle;}
#gb#gb.gb_S a.gb_P ,#gb#gb.gb_S span.gb_P ,#gb#gb .gb_S a.gb_P ,#gb#gb .gb_=
S span.gb_P {color: rgb(255, 255, 255);}
#gb#gb.gb_S span.gb_P ,#gb#gb .gb_S span.gb_P {opacity: 0.7;}
..gb_M.gb_M {background-size: 64px 64px;}
#gb2 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/3a1e625196=
..png");}
..gb_N #gb2 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/3a1e6=
25196.png");}
#gb22 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/3daf4c1f8=
8.png");}
..gb_N #gb22 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/3daf=
4c1f88.png");}
#gb45 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/f420d06f6=
6.png");}
..gb_N #gb45 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/f420=
d06f66.png");}
#gb72 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/28a40ba7c=
c.png");}
..gb_N #gb72 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/28a4=
0ba7cc.png");}
#gb117 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/142da275=
78.png");}
..gb_N #gb117 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/142=
da27578.png");}
#gb136 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/911e3628=
e6.png");}
..gb_N #gb136 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/911=
e3628e6.png");}
#gb166 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/41679a9e=
c5.png");}
..gb_N #gb166 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/416=
79a9ec5.png");}
#gb171 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/4244245d=
7e.png");}
..gb_N #gb171 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/424=
4245d7e.png");}
#gb177 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/4653513b=
7d.png");}
..gb_N #gb177 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/465=
3513b7d.png");}
#gb206 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/ad330d84=
59.png");}
..gb_N #gb206 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/ad3=
30d8459.png");}
#gb207 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/2c21041e=
16.png");}
..gb_N #gb207 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/2c2=
1041e16.png");}
#gb211 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/c03dda0b=
34.png");}
..gb_N #gb211 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/c03=
dda0b34.png");}
#gb217 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/71060be5=
b3.png");}
..gb_N #gb217 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/710=
60be5b3.png");}
#gb228 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/74aa55e0=
c2.png");}
..gb_N #gb228 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/74a=
a55e0c2.png");}
#gb249 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/afa40f6e=
42.png");}
..gb_N #gb249 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/afa=
40f6e42.png");}
#gb260 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/ea554714=
e7.png");}
..gb_N #gb260 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/ea5=
54714e7.png");}
#gb261 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/0b26f6f8=
e4.png");}
..gb_N #gb261 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/0b2=
6f6f8e4.png");}
#gb108 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/dfbeb247=
85.png");}
..gb_N #gb108 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/dfb=
eb24785.png");}
#gb60 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/85bb99a34=
1.png");}
..gb_N #gb60 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/85bb=
99a341.png");}
#gb175 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/eacd033c=
28.png");}
..gb_N #gb175 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/eac=
d033c28.png");}
..gb_T {padding: 1px; display: inline-block; vertical-align: top; color: bla=
ck; z-index: 999; height: 98px; width: 86px;}
..gb_T a {text-decoration: none;}
..gb_T[aria-grabbed=3D"true"] {visibility: hidden;}
..gb_T:hover {z-index: 1001;}
..gb_T:hover a {border: 1px solid rgb(229, 229, 229); border-radius: 2px; ma=
rgin: 7px 1px;}
..gb_T.gb_U a {border: 1px solid rgb(229, 229, 229); box-shadow: 0px 1px 2px=
rgba(0, 0, 0, 0.1); background: rgb(255, 255, 255) none repeat scroll 0% 0=
%; cursor: grabbing; margin: -1px; visibility: visible; z-index: 1001;}
..gb_V {opacity: 0.5;}
..gb_T.gb_U a {color: rgba(0, 0, 0, 0.87) !important; cursor: grabbing; font=
: 13px/27px Arial,sans-serif; text-decoration: none !important;}
..gb_O {color: rgba(0, 0, 0, 0.87); display: inline-block; font-size: 13px; =
margin: 8px 2px; text-align: center; outline: medium none;}
..gb_O[draggable=3D"false"] {-moz-user-select: none;}
..gb_O .gb_W ,.gb_O .gb_M {display: inline-block; vertical-align: top; heigh=
t: 64px; width: 64px;}
..gb_X {display: block; line-height: 20px; overflow: hidden; white-space: no=
wrap; width: 84px; text-overflow: ellipsis;}
..gb_T:hover .gb_O {z-index: 1;}
..gb_T:hover .gb_X {background: rgba(255, 255, 255, 0.9) none repeat scroll =
0% 0%; white-space: normal; overflow-wrap: break-word;}
..gb_O .gb_W {background-image: url("https://ssl.gstatic.com/gb/images/v1_00=
f2d726.png"); background-size: 92px 2835px;}
..gb_N .gb_O .gb_W ,.gb_N .gb_Z.gb_W {background-image: none; overflow: hidd=
en; position: relative;}
..gb_N .gb_O .gb_W::before ,.gb_N .gb_Z.gb_W::before {content: url("https://=
ssl.gstatic.com/gb/images/v1_00f2d726.png"); position: absolute;}
..gb_N .gb_M {background-image: none !important; position: relative;}
..gb_N .gb_M::before {left: 0px; position: absolute; top: 0px;}
..gb_0 .gb_O:focus ,#gb#gb .gb_0 a.gb_O:focus {text-decoration: underline;}
..gb_T.gb_1[aria-grabbed=3D"true"] {visibility: visible;}
..gb_2 ,.gb_3 {position: relative; top: 27px; visibility: hidden;}
..gb_4 ,.gb_5 {left: 37px; visibility: hidden;}
..gb_2 {float: left; width: 0px; height: 0px; border-top: 5px solid transpar=
ent; border-bottom: 5px solid transparent; border-right: 5px solid rgb(66, =
115, 219);}
..gb_3 {float: right; width: 0px; height: 0px; border-top: 5px solid transpa=
rent; border-bottom: 5px solid transparent; border-left: 5px solid rgb(66, =
115, 219);}
..gb_4 {position: absolute; top: 0px; width: 0px; height: 0px; border-left: =
5px solid transparent; border-right: 5px solid transparent; border-bottom: =
5px solid rgb(66, 115, 219);}
..gb_5 {position: absolute; top: 59px; width: 0px; height: 0px; border-left:=
5px solid transparent; border-right: 5px solid transparent; border-top: 5p=
x solid rgb(66, 115, 219);}
ul.gb_6 li.gb_1:not(:first-child) .gb_2 ,ul.gb_6 li.gb_1:not(:nth-child(-n+=
3)) .gb_4 ,ul.gb_6 li.gb_1 .gb_3 ,ul.gb_6 li.gb_1 .gb_5 ,ul.gb_7 li.gb_1 .g=
b_2 ,ul.gb_7 li.gb_1 .gb_4 ,ul.gb_7 li.gb_1:not(:last-child) .gb_3 ,ul.gb_7=
li.gb_1:not(:nth-last-child(-n+3)) .gb_5 {visibility: visible;}
a.gb_wa {border: medium none; color: rgb(66, 133, 244); cursor: default; fo=
nt-weight: bold; outline: medium none; position: relative; text-align: cent=
er; text-decoration: none; text-transform: uppercase; white-space: nowrap; =
-moz-user-select: none;}
a.gb_wa:hover::after ,a.gb_wa:focus::after {background-color: rgba(0, 0, 0,=
0.12); content: ""; height: 100%; left: 0px; position: absolute; top: 0px;=
width: 100%;}
a.gb_wa:hover ,a.gb_wa:focus {text-decoration: none;}
a.gb_wa:active {background-color: rgba(153, 153, 153, 0.4); text-decoration=
: none;}
a.gb_xa {background-color: rgb(66, 133, 244); color: rgb(255, 255, 255);}
a.gb_xa:active {background-color: rgb(0, 67, 178);}
..gb_ya {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.16);}
..gb_wa ,.gb_xa ,.gb_za ,.gb_Aa {display: inline-block; line-height: 28px; p=
adding: 0px 12px; border-radius: 2px;}
..gb_za {background: rgb(248, 248, 248) none repeat scroll 0% 0%; border: 1p=
x solid rgb(198, 198, 198);}
..gb_Aa {background: rgb(248, 248, 248) none repeat scroll 0% 0%;}
..gb_za ,#gb a.gb_za.gb_za ,.gb_Aa {color: rgb(102, 102, 102); cursor: defau=
lt; text-decoration: none;}
#gb a.gb_Aa.gb_Aa {cursor: default; text-decoration: none;}
..gb_Aa {border: 1px solid rgb(66, 133, 244); font-weight: bold; outline: me=
dium none; background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , r=
gb(67, 135, 253), rgb(70, 131, 234)) repeat scroll 0% 0%;}
#gb a.gb_Aa.gb_Aa {color: rgb(255, 255, 255);}
..gb_Aa:hover {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15);}
..gb_Aa:active {box-shadow: 0px 2px 0px rgba(0, 0, 0, 0.15) inset; backgroun=
d: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(60, 122, 228), rg=
b(63, 118, 211)) repeat scroll 0% 0%;}
..gb_Sf {display: inline-block; line-height: normal; position: relative; z-i=
ndex: 987;}
..gb_ab {background-size: 32px 32px; border-radius: 50%; display: block; mar=
gin: -1px; overflow: hidden; position: relative; height: 32px; width: 32px;=
z-index: 0;}
..gb_ab:hover ,.gb_ab:focus {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15);}
..gb_ab:active {box-shadow: 0px 2px 0px rgba(0, 0, 0, 0.15) inset;}
..gb_ab:active::after {background: rgba(0, 0, 0, 0.1) none repeat scroll 0% =
0%; border-radius: 50%; content: ""; display: block; height: 100%;}
..gb_bb {cursor: pointer; line-height: 30px; min-width: 30px; opacity: 0.75;=
overflow: hidden; vertical-align: middle; text-overflow: ellipsis;}
..gb_b.gb_bb {width: auto;}
..gb_bb:hover ,.gb_bb:focus {opacity: 0.85;}
..gb_cb .gb_bb ,.gb_cb .gb_db {line-height: 26px;}
#gb#gb.gb_cb a.gb_bb ,.gb_cb .gb_db {font-size: 11px; height: auto;}
..gb_eb {border-top: 4px solid rgb(0, 0, 0); border-left: 4px dashed transpa=
rent; border-right: 4px dashed transparent; display: inline-block; margin-l=
eft: 6px; opacity: 0.75; vertical-align: middle;}
..gb_fb:hover .gb_eb {opacity: 0.85;}
..gb_Ra > .gb_gb {padding: 3px 3px 3px 4px;}
..gb_S .gb_bb ,.gb_S .gb_eb {opacity: 1;}
#gb#gb.gb_S.gb_S a.gb_bb ,#gb#gb .gb_S.gb_S a.gb_bb {color: rgb(255, 255, 2=
55);}
..gb_S.gb_S .gb_eb {border-top-color: rgb(255, 255, 255); opacity: 1;}
..gb_9 .gb_ab:hover ,.gb_S .gb_ab:hover ,.gb_9 .gb_ab:focus ,.gb_S .gb_ab:fo=
cus {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15), 0px 1px 2px rgba(0, 0, 0,=
0.2);}
..gb_hb .gb_gb ,.gb_ib .gb_gb {position: absolute; right: 1px;}
..gb_gb.gb_R ,.gb_jb.gb_R ,.gb_fb.gb_R {flex: 0 1 auto;}
..gb_kb.gb_lb .gb_bb {width: 30px !important;}
..gb_mb.gb_9a {display: none;}
..gb_nb.gb_8a {display: none;}
..gb_nb {background-color: rgb(204, 204, 204); height: 3px; overflow: hidden=
;}
..gb_ob {background-color: rgb(244, 180, 0); height: 100%; width: 50%; anima=
tion: 1.5s linear 0s normal none infinite running progressmove;}
..gb_qb {height: 40px; position: absolute; right: -5px; top: -5px; width: 40=
px;}
..gb_rb .gb_qb ,.gb_sb .gb_qb {right: 0px; top: 0px;}
..gb_bb ~ .gb_tb ,.gb_bb ~ .gb_ub {left: auto; right: 6.5px;}
..gb_vb {outline: medium none; transform: translateZ(0px);}
..gb_vb.gb_Wa {width: 320px;}
..gb_wb ,#gb a.gb_wb.gb_wb ,.gb_xb a ,#gb .gb_xb.gb_xb a {color: rgb(51, 102=
, 204); text-decoration: none;}
..gb_wb:active ,#gb a.gb_wb:active ,.gb_wb:hover ,#gb a.gb_wb:hover ,.gb_xb =
a:active ,#gb .gb_xb a:active ,.gb_xb a:hover ,#gb .gb_xb a:hover {text-dec=
oration: underline;}
..gb_yb {margin: 20px; white-space: nowrap;}
..gb_zb ,.gb_Ab {display: inline-block; vertical-align: top;}
..gb_vb.gb_Wa .gb_Ab {max-width: 164px;}
..gb_zb {margin-right: 20px; position: relative;}
..gb_Bb {border-radius: 50%; overflow: hidden;}
..gb_Cb {background-size: 96px 96px; border: medium none; vertical-align: to=
p; height: 96px; width: 96px;}
..gb_mb {background: rgba(78, 144, 254, 0.7) none repeat scroll 0% 0%; botto=
m: 0px; color: rgb(255, 255, 255); font-size: 9px; font-weight: bold; left:=
0px; line-height: 9px; position: absolute; padding: 7px 0px; text-align: c=
enter; width: 96px;}
..gb_Bb .gb_mb {background: rgba(0, 0, 0, 0.54) none repeat scroll 0% 0%;}
..gb_Db {font-weight: bold; margin: -4px 0px 1px; text-overflow: ellipsis; o=
verflow: hidden;}
..gb_Fb {color: rgb(102, 102, 102); text-overflow: ellipsis; overflow: hidde=
n;}
..gb_xb {color: rgb(204, 204, 204); margin: 6px 0px;}
..gb_vb.gb_Wa .gb_xb a {display: block; line-height: 24px; margin: 0px;}
..gb_vb.gb_Wa .gb_xb a:first-child:last-child {line-height: normal;}
..gb_vb:not(.gb_Wa) .gb_xb a {margin: 0px 10px;}
..gb_vb:not(.gb_Wa) .gb_xb a:first-child {margin-left: 0px;}
..gb_vb:not(.gb_Wa) .gb_xb a:last-child {margin-right: 0px;}
..gb_Ab .gb_Hb {background: rgb(77, 144, 254) none repeat scroll 0% 0%; bord=
er-color: rgb(48, 121, 237); font-weight: bold; margin: 10px 0px 0px; color=
: rgb(255, 255, 255);}
#gb .gb_Ab a.gb_Hb.gb_Hb {color: rgb(255, 255, 255);}
..gb_Ab .gb_Hb:hover {background: rgb(53, 122, 232) none repeat scroll 0% 0%=
; border-color: rgb(47, 91, 183);}
..gb_Ib.gb_ja {border-top: medium none;}
..gb_Ib {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); border-color: rgba(0, 0, 0, 0.2); padding: =
10px 0px; width: 100%; display: table;}
..gb_Ib .gb_Hb {margin: 0px 20px; white-space: nowrap;}
..gb_Ib > div {display: table-cell; text-align: right;}
..gb_Ib > div:first-child {text-align: left;}
..gb_Ib .gb_Jb {display: block; text-align: center;}
..gb_Kb .gb_tb {border-bottom-color: rgb(254, 249, 219);}
..gb_Lb {background: rgb(254, 249, 219) none repeat scroll 0% 0%; font-size:=
11px; padding: 10px 20px; white-space: normal;}
..gb_Lb b ,.gb_wb {white-space: nowrap;}
..gb_Ob {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); max-height: 230px; overflow: auto;}
..gb_Ob.gb_Wa {max-height: 170px;}
..gb_Ob.gb_Wa.gb_Pb {max-height: 124px;}
..gb_Qb {border-top: 1px solid rgba(0, 0, 0, 0.2); display: block; outline-o=
ffset: -2px; padding: 10px 20px; position: relative; white-space: nowrap;}
..gb_Rb .gb_Qb:focus .gb_Sb {outline: 1px dotted rgb(255, 255, 255);}
..gb_Qb:hover {background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..gb_Qb[selected=3D"true"] {overflow: hidden;}
..gb_Qb[selected=3D"true"] > .gb_Tb {background-color: rgba(117, 117, 117, 0=
..9);}
..gb_Qb[selected=3D"true"] > .gb_Ub {display: block; position: absolute; z-i=
ndex: 2;}
..gb_Ub::-moz-focus-inner {border: 0px none;}
..gb_Ub {background-color: transparent; border: medium none; color: rgb(255,=
255, 255); display: none; font-family: Roboto,Arial,sans-serif; font-weigh=
t: 400; font-size: 14px; height: 36px; min-width: 86px; text-align: center;=
top: 16px; width: auto;}
..gb_Qb[selected=3D"true"] > .gb_Ub:focus {background-color: rgba(0, 0, 0, 0=
..24); border-radius: 2px; outline: 0px none;}
..gb_Qb[selected=3D"true"] > .gb_Ub:hover ,.gb_Qb[selected=3D"true"] > .gb_U=
b:focus:hover {background-color: rgb(86, 86, 86); border-radius: 2px;}
..gb_Qb[selected=3D"true"] > .gb_Ub:active {border-radius: 2px; background-c=
olor: rgb(33, 33, 33);}
..gb_Vb {left: 0px; margin-left: 5%;}
..gb_Wb {margin-right: 5%; right: 0px;}
..gb_Qb:first-child ,.gb_Xb:first-child + .gb_Qb {border-top: 0px none;}
..gb_Xb {display: none;}
..gb_Zb {cursor: default;}
..gb_Zb:hover {background: transparent none repeat scroll 0% 0%;}
..gb_0b {border: medium none; vertical-align: top; height: 48px; width: 48px=
;}
..gb_Sb {display: inline-block; margin: 6px 0px 0px 10px;}
..gb_vb.gb_Wa .gb_Sb {max-width: 222px;}
..gb_Zb .gb_0b ,.gb_Zb .gb_Sb {opacity: 0.4;}
..gb_1b {color: rgb(0, 0, 0); text-overflow: ellipsis; overflow: hidden;}
..gb_Zb .gb_1b {color: rgb(102, 102, 102);}
..gb_2b {color: rgb(102, 102, 102); text-overflow: ellipsis; overflow: hidde=
n;}
..gb_3b {color: rgb(102, 102, 102); font-style: italic;}
..gb_Tb {background-color: transparent; height: 100%; left: 0px; position: a=
bsolute; text-align: center; top: 0px; width: 100%; z-index: 1;}
..gb_Ub:hover {background-color: rgba(100, 100, 100, 0.4);}
..gb_4b {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); display: block; padding: 10px 20px;}
..gb_5b {background-position: -35px -242px; display: inline-block; margin: 1=
px 0px; vertical-align: middle; height: 25px; width: 25px;}
..gb_N .gb_5b::before {left: -35px; top: -242px;}
..gb_6b {color: rgb(66, 127, 237); display: inline-block; padding: 0px 25px =
0px 10px; vertical-align: middle; white-space: normal;}
..gb_4b:hover .gb_6b {text-decoration: underline;}
..gb_Ib .gb_Hb:hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); border-col=
or: rgb(198, 198, 198); color: rgb(34, 34, 34); background-color: rgb(255, =
255, 255); background-image: -moz-linear-gradient(center top , rgb(255, 255=
, 255), rgb(248, 248, 248));}
#gbsfw {min-width: 400px; overflow: visible;}
..gb_7b > iframe.gb_8b {visibility: hidden;}
..gb_8b ,#gbsfw.gb_g {display: block; outline: medium none;}
#gbsfw.gb_ka iframe {display: none;}
..gb_9b {padding: 118px 0px; text-align: center;}
..gb_ac {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/gb/images/a/f5c=
dd88b65.png") no-repeat scroll center 0px; color: rgb(170, 170, 170); font-=
size: 13px; line-height: 20px; padding-top: 76px;}
..gb_ac a {color: rgb(66, 133, 244); text-decoration: none;}
..gb_kb:not(.gb_N) .gb_ab::before ,.gb_kb:not(.gb_N) .gb_Cb::before {content=
: none;}
..gb_N .gb_ec .gb_gc::before {left: 0px; top: -1451px;}
..gb_N.gb_S .gb_ec .gb_gc::before {left: 0px; top: -2560px;}
..gb_N.gb_9 .gb_ec .gb_gc::before {left: 0px; top: -1206px;}
..gb_N .gb_Ua {background-image: none !important;}
..gb_N .gb_hc {visibility: visible;}
..gb_Rb .gb_te span {background: transparent none repeat scroll 0% 0%;}
..gb_bc {min-width: 152px; overflow: hidden; position: relative; z-index: 98=
7;}
..gb_cc {position: absolute; padding: 0px 30px;}
..gb_dc .gb_cc {right: 100%; margin-right: -152px;}
..gb_ec {display: inline-block; line-height: 0; outline: medium none; vertic=
al-align: middle;}
..gb_fc .gb_ec {position: relative; top: 2px;}
..gb_ec .gb_gc ,.gb_Ua {display: block;}
..gb_hc {border: medium none; display: block; visibility: hidden;}
..gb_ec .gb_gc {background-position: 0px -1451px; height: 33px; width: 92px;=
}
img.gb_Xa {border: 0px none; vertical-align: middle;}
..gb_S .gb_ec .gb_gc {background-position: 0px -2560px;}
..gb_9 .gb_ec .gb_gc {background-position: 0px -1206px; opacity: 0.54;}
..gb_Ic {background-position: -35px -1171px; opacity: 0.55; height: 100%; wi=
dth: 100%;}
..gb_b:hover .gb_Ic ,.gb_b:focus .gb_Ic {opacity: 0.85;}
..gb_Jc .gb_Ic {background-position: -35px -2180px;}
..gb_Kc {background-color: rgb(203, 68, 55); border-radius: 8px; font: bold =
11px/16px Arial; color: rgb(255, 255, 255); min-width: 14px; padding: 0px 1=
px; position: absolute; right: 0px; text-align: center; text-shadow: 0px 1p=
x 0px rgba(0, 0, 0, 0.1); top: 0px; visibility: hidden; z-index: 990;}
..gb_Lc .gb_Kc ,.gb_Lc .gb_Mc ,.gb_Lc .gb_Mc.gb_Nc {visibility: visible;}
..gb_Mc {padding: 0px 2px; visibility: hidden;}
..gb_Oc:not(.gb_Pc) .gb_ub ,.gb_Oc:not(.gb_Pc) .gb_tb {left: 3px;}
..gb_Kc.gb_Qc {animation: 0.6s ease-in-out 1s normal both 1 running gb__nb; =
perspective-origin: right top; transform: scale(1, 1); transform-origin: ri=
ght top 0px;}
..gb_Qc .gb_Mc {visibility: visible;}
..gb_9 .gb_b .gb_Ic {background-position: -21px -1731px; opacity: 0.7;}
..gb_9 .gb_Jc .gb_Ic {background-position: 0px -1558px;}
..gb_9 .gb_b:hover .gb_Ic ,.gb_9 .gb_b:focus .gb_Ic {opacity: 0.85;}
..gb_S .gb_b .gb_Ic {background-position: 0px -207px; opacity: 1;}
..gb_S .gb_Jc .gb_Ic {background-position: -35px -207px;}
..gb_9 .gb_Kc ,.gb_S .gb_Kc {border: medium none;}
..gb_Oc .gb_Rc {font-size: 14px; font-weight: bold; top: 0px; right: 0px;}
..gb_Oc .gb_b {display: inline-block; vertical-align: middle; box-sizing: bo=
rder-box; height: 30px; width: 30px;}
..gb_Oc .gb_tb {border-bottom-color: rgb(229, 229, 229);}
..gb_Sc {background-color: rgba(0, 0, 0, 0.55); color: rgb(255, 255, 255); f=
ont-size: 12px; font-weight: bold; line-height: 20px; margin: 5px; padding:=
0px 2px; text-align: center; box-sizing: border-box; border-radius: 50%; h=
eight: 20px; width: 20px;}
..gb_Sc.gb_Tc {background-position: -70px -1171px;}
..gb_Sc.gb_Uc {background-position: 0px -1835px;}
..gb_b:hover .gb_Sc ,.gb_b:focus .gb_Sc {background-color: rgba(0, 0, 0, 0.8=
5);}
#gbsfw.gb_Vc {background: rgb(229, 229, 229) none repeat scroll 0% 0%; bord=
er-color: rgb(204, 204, 204);}
..gb_9 .gb_Sc {background-color: rgba(0, 0, 0, 0.7);}
..gb_S .gb_Sc.gb_Sc ,.gb_S .gb_Lc .gb_Sc.gb_Sc ,.gb_S .gb_Lc .gb_b:hover .gb=
_Sc ,.gb_S .gb_Lc .gb_b:focus .gb_Sc {background-color: rgb(255, 255, 255);=
color: rgb(64, 64, 64);}
..gb_S .gb_Sc.gb_Tc {background-position: 0px -600px;}
..gb_S .gb_Sc.gb_Uc {background-position: -35px -479px;}
..gb_Lc .gb_Sc.gb_Sc {background-color: rgb(219, 68, 55); color: rgb(255, 25=
5, 255);}
..gb_Lc .gb_b:hover .gb_Sc ,.gb_Lc .gb_b:focus .gb_Sc {background-color: rgb=
(165, 39, 20);}
..gb_N .gb_Ic::before {left: -35px; top: -1171px;}
..gb_N .gb_Jc .gb_Ic::before {left: -35px; top: -2180px;}
..gb_N.gb_9 .gb_b .gb_Ic::before {left: -21px; top: -1731px;}
..gb_N.gb_9 .gb_Jc .gb_Ic::before {left: 0px; top: -1558px;}
..gb_N.gb_S .gb_b .gb_Ic::before {left: 0px; top: -207px;}
..gb_N.gb_S .gb_Jc .gb_Ic::before {left: -35px; top: -207px;}
..gb_Rb .gb_Sc {border: 1px solid rgb(255, 255, 255); color: rgb(255, 255, 2=
55);}
..gb_Rb.gb_9 .gb_Sc {border-color: rgb(0, 0, 0); color: rgb(0, 0, 0);}
..gb_N .gb_Sc.gb_Tc::before ,.gb_Rb.gb_N.gb_S .gb_Sc.gb_Tc::before {left: -7=
0px; top: -1171px;}
..gb_N .gb_Sc.gb_Uc::before ,.gb_Rb.gb_N.gb_S .gb_Sc.gb_Uc::before {left: 0p=
x; top: -1835px;}
..gb_N.gb_S .gb_Sc.gb_Tc::before ,.gb_Rb.gb_N.gb_9 .gb_Sc.gb_Tc::before {lef=
t: 0px; top: -600px;}
..gb_N.gb_S .gb_Sc.gb_Uc::before ,.gb_Rb.gb_N.gb_9 .gb_Sc.gb_Uc::before {lef=
t: -35px; top: -479px;}
..gb_Fd {color: rgb(255, 255, 255); font-size: 13px; font-weight: bold; heig=
ht: 25px; line-height: 19px; padding-top: 5px; padding-left: 12px; position=
: relative; background-color: rgb(77, 144, 254);}
..gb_Fd .gb_Hd {color: rgb(255, 255, 255); cursor: default; font-size: 22px;=
font-weight: normal; position: absolute; right: 12px; top: 5px;}
..gb_Fd .gb_md ,.gb_Fd .gb_kd {color: rgb(255, 255, 255); display: inline-bl=
ock; font-size: 11px; margin-left: 16px; padding: 0px 8px; white-space: now=
rap;}
..gb_Id {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgba=
(0, 0, 0, 0.16), rgba(0, 0, 0, 0.2)) repeat scroll 0% 0%; border-radius: 2p=
x; border: 1px solid rgba(0, 0, 0, 0.1); cursor: default !important; text-d=
ecoration: none !important;}
..gb_Id:hover {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top =
, rgba(0, 0, 0, 0.14), rgba(0, 0, 0, 0.2)) repeat scroll 0% 0%; border: 1px=
solid rgba(0, 0, 0, 0.2); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
..gb_Id:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset;}
..gb_ad.gb_bd {padding: 0px;}
..gb_bd.gb_cd .gb_aa {padding: 16px;}
..gb_bd .gb_aa {padding: 26px 26px 22px 13px; background: rgb(255, 255, 255)=
none repeat scroll 0% 0%;}
..gb_dd.gb_bd .gb_aa {background: rgb(77, 144, 254) none repeat scroll 0% 0%=
;}
a.gb_ed {color: rgb(102, 102, 102) !important; font-size: 22px; height: 9px=
; opacity: 0.8; position: absolute; right: 14px; top: 4px; text-decoration:=
none !important; width: 9px;}
..gb_dd a.gb_ed {color: rgb(193, 209, 244) !important;}
a.gb_ed:hover ,a.gb_ed:active {opacity: 1;}
..gb_cd a.gb_ed {height: 24px; right: 16px; top: 16px; width: 24px;}
svg.gb_fd {fill: rgb(60, 64, 67); opacity: 1;}
..gb_gd {padding: 0px; width: 258px; white-space: normal; display: table;}
..gb_hd .gb_aa {top: 36px; border: 0px none; padding: 16px; box-shadow: 4px =
4px 12px rgba(0, 0, 0, 0.4);}
..gb_hd .gb_gd {width: 328px;}
..gb_hd .gb_Aa ,.gb_hd:not(.gb_cd) .gb_id ,.gb_hd .gb_9c ,.gb_hd .gb_wa ,.gb=
_jd {line-height: normal; font-family: Roboto,RobotoDraft,Helvetica,Arial,s=
ans-serif;}
..gb_hd .gb_Aa ,.gb_hd .gb_id ,.gb_hd .gb_wa {font-weight: 500;}
..gb_hd .gb_Aa ,.gb_hd .gb_wa {border: 0px none; padding: 10px 8px;}
..gb_bd .gb_Aa:active {outline: medium none; box-shadow: 0px 4px 5px rgba(0,=
0, 0, 0.16);}
..gb_hd .gb_id {color: rgb(34, 34, 34); margin-bottom: 8px;}
..gb_hd.gb_cd .gb_wa.gb_kd {border-radius: 4px; height: 16px; color: rgb(95,=
99, 104); font-family: Google Sans,Roboto,RobotoDraft,Helvetica,Arial,sans=
-serif; letter-spacing: 0.25px; line-height: 16px; text-transform: none;}
..gb_hd .gb_9c {color: rgb(128, 128, 128); font-size: 14px;}
..gb_bd.gb_cd .gb_9c {color: rgb(95, 99, 104); letter-spacing: 0.25px; line-=
height: 20px;}
..gb_ld {text-align: right; font-size: 14px; padding-bottom: 0px; white-spac=
e: nowrap;}
..gb_ld .gb_md {margin-left: 8px;}
..gb_cd .gb_ld .gb_md {margin-left: 12px; text-transform: none;}
..gb_cd .gb_ld .gb_md.gb_nd {padding-right: 16px;}
..gb_ld .gb_od.gb_md img {background-color: inherit; border-radius: initial;=
height: 1.5em; margin: -0.25em 10px -0.25em 2px; vertical-align: text-top;=
width: 1.5em;}
..gb_cd .gb_ld .gb_od.gb_md.gb_nd img {height: 18px; margin: 0px 8px 0px 4px=
; width: 18px;}
..gb_hd .gb_gd .gb_pd .gb_od {border: 2px solid transparent;}
..gb_hd .gb_gd .gb_pd .gb_od:focus {border-color: rgb(187, 204, 255);}
..gb_hd .gb_gd .gb_pd .gb_od:focus::after ,.gb_hd .gb_gd .gb_pd .gb_od:hover=
::after {background-color: transparent;}
..gb_jd {background-color: rgb(64, 64, 64); color: rgb(255, 255, 255); paddi=
ng: 16px; position: absolute; top: 36px; min-width: 328px; max-width: 650px=
; right: 0px; border-radius: 2px; box-shadow: 4px 4px 12px rgba(0, 0, 0, 0.=
4);}
..gb_jd a ,.gb_jd a:visited {color: rgb(94, 151, 246); text-decoration: none=
;}
..gb_qd {text-transform: uppercase;}
..gb_rd {padding-left: 50px;}
..gb_dd .gb_gd {width: 200px;}
..gb_id {color: rgb(51, 51, 51); font-size: 16px; line-height: 20px; margin:=
0px 0px 16px;}
..gb_bd.gb_cd .gb_id {color: rgb(60, 64, 67); font-family: Google Sans,Robot=
o,RobotoDraft,Helvetica,Arial,sans-serif; letter-spacing: 0.1px; line-heigh=
t: 20px; margin-bottom: 12px;}
..gb_dd .gb_id {color: rgb(255, 255, 255);}
..gb_9c {color: rgb(102, 102, 102); line-height: 17px; margin: 0px 0px 5px;}
..gb_dd .gb_9c {color: rgb(255, 255, 255);}
..gb_9c a.gb_td {text-decoration: none; color: rgb(94, 151, 246);}
..gb_9c a.gb_td:visited {color: rgb(94, 151, 246);}
..gb_9c a.gb_td:hover ,.gb_9c a.gb_td:active {text-decoration: underline;}
..gb_ud {position: absolute; background: transparent none repeat scroll 0% 0=
%; top: -999px; z-index: -1; visibility: hidden; margin-top: 1px; margin-le=
ft: 1px;}
#gb .gb_bd {margin: 0px;}
..gb_bd .gb_Hb {background: rgb(77, 144, 254) none repeat scroll 0% 0%; bord=
er-color: rgb(48, 121, 237); margin-top: 15px;}
..gb_bd.gb_cd .gb_Hb {border: 2px solid transparent; margin-top: 19px; min-w=
idth: 70px; padding: 10px 8px; text-align: center;}
..gb_hd .gb_Aa {background: rgb(66, 133, 244) none repeat scroll 0% 0%;}
..gb_bd a.gb_Aa {color: rgb(255, 255, 255);}
..gb_bd.gb_cd a.gb_Aa {background: rgb(26, 115, 232) none repeat scroll 0% 0=
%; border-radius: 4px; font-family: Google Sans,Roboto,RobotoDraft,Helvetic=
a,Arial,sans-serif; letter-spacing: 0.25px; line-height: 16px;}
#gb .gb_bd a.gb_Hb.gb_Hb {color: rgb(255, 255, 255);}
..gb_bd .gb_Hb:hover {background: rgb(53, 122, 232) none repeat scroll 0% 0%=
; border-color: rgb(47, 91, 183);}
..gb_vd .gb_Rc .gb_tb {border-bottom-color: rgb(255, 255, 255); display: blo=
ck;}
..gb_wd .gb_Rc .gb_tb {border-bottom-color: rgb(77, 144, 254); display: bloc=
k;}
..gb_vd .gb_Rc .gb_ub ,.gb_wd .gb_Rc .gb_ub {display: block;}
..gb_xd ,.gb_pd {display: table-cell;}
..gb_xd {vertical-align: middle;}
..gb_hd:not(.gb_cd) .gb_xd {vertical-align: top;}
..gb_cd .gb_xd img {height: 48px; padding-right: 36px; width: 48px;}
..gb_pd {padding-left: 13px; width: 100%;}
..gb_hd .gb_pd {padding-left: 20px;}
..gb_bd.gb_cd .gb_pd {padding-left: 0px;}
..gb_bd.gb_cd:not(.gb_hd) .gb_pd {padding-top: 32px;}
..gb_yd {display: inline-block; padding: 1em 0px 0px; position: relative; wi=
dth: 100%;}
..gb_zd {color: rgb(255, 0, 0); font-style: italic; margin: 0px; padding-lef=
t: 46px;}
..gb_yd .gb_Ad {float: right; margin: -20px 0px; width: calc(100% - 46px);}
..gb_Bd svg {fill: grey;}
..gb_Bd.gb_Cd svg {fill: rgb(66, 133, 244);}
..gb_yd .gb_Ad label::after {background-color: rgb(66, 133, 244);}
..gb_Bd {display: inline; float: right; margin-right: 22px; position: relati=
ve; top: -4px;}
..gb_bd.gb_cd .gb_aa {border-radius: 8px; box-shadow: 0px 1px 2px 0px rgba(6=
5, 69, 73, 0.3), 0px 3px 6px 2px rgba(65, 69, 73, 0.15);}
..gb_Tf {margin-bottom: 32px; font-size: small;}
..gb_Tf .gb_Uf {margin-right: 5px;}
..gb_Tf .gb_Vf {color: red;}
..gb_Zc {display: none;}
..gb_Zc.gb_g {display: block;}
..gb_0c {background-color: rgb(255, 255, 255); box-shadow: 0px 1px 0px rgba(=
0, 0, 0, 0.08); color: rgb(0, 0, 0); position: relative; z-index: 986;}
..gb_1c {height: 40px; padding: 16px 24px; white-space: nowrap;}
..gb_2c {position: fixed; bottom: 16px; padding: 16px; right: 16px; white-sp=
ace: normal; width: 328px; transition: width 0.2s ease 0s, bottom 0.2s ease=
0s, right 0.2s ease 0s; border-radius: 2px; box-shadow: 0px 5px 5px -3px r=
gba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px r=
gba(0, 0, 0, 0.12);}
..gb_0c .gb_Hb {border: 0px none; font-weight: 500; font-size: 14px; line-he=
ight: 36px; min-width: 32px; padding: 0px 16px; vertical-align: middle;}
..gb_0c .gb_Hb::before {content: ""; height: 6px; left: 0px; position: absol=
ute; top: -6px; width: 100%;}
..gb_0c .gb_Hb::after {bottom: -6px; content: ""; height: 6px; left: 0px; po=
sition: absolute; width: 100%;}
..gb_0c .gb_Hb + .gb_Hb {margin-left: 8px;}
..gb_3c {height: 48px; padding: 4px; margin: -8px 0px 0px -8px;}
..gb_2c .gb_3c {float: left; margin: -4px;}
..gb_4c {font-family: Roboto,RobotoDraft,Helvetica,Arial,sans-serif; overflo=
w: hidden; vertical-align: top;}
..gb_1c .gb_4c {display: inline-block; padding-left: 8px; width: 640px;}
..gb_2c .gb_4c {display: block; margin-left: 56px; padding-bottom: 16px;}
..gb_5c {background-color: inherit;}
..gb_1c .gb_5c {display: inline-block; position: absolute; top: 18px; right:=
24px;}
..gb_2c .gb_5c {text-align: right; padding-right: 24px; padding-top: 6px;}
..gb_5c .gb_6c {height: 1.5em; margin: -0.25em 10px -0.25em 0px; vertical-al=
ign: text-top; width: 1.5em;}
..gb_7c {line-height: 20px; font-size: 16px; font-weight: 700; color: rgba(0=
, 0, 0, 0.87);}
..gb_2c .gb_7c {color: rgba(0, 0, 0, 0.87); font-size: 16px; line-height: 20=
px; padding-top: 8px;}
..gb_1c .gb_7c ,.gb_1c .gb_8c {width: 640px;}
..gb_8c .gb_9c ,.gb_8c {line-height: 20px; font-size: 13px; font-weight: 400=
; color: rgba(0, 0, 0, 0.54);}
..gb_2c .gb_8c .gb_9c {font-size: 14px;}
..gb_2c .gb_8c {padding-top: 12px;}
..gb_2c .gb_8c a {color: rgb(66, 133, 244);}
..gb_Wf {position: relative; width: 650px; z-index: 986;}
#gbq2 {padding-top: 15px;}
..gb_Xf .gb_Wf {min-width: 200px; flex: 0 2 auto;}
..gb_Zf ~ .gb_Wf {min-width: 0px;}
..gb_Xf #gbqf {margin-right: 0px; display: flex;}
..gb_Xf .gbqff {min-width: 0px; flex: 1 1 auto;}
..gb_N .gbqfi::before {left: 0px; top: -479px;}
..gb_Rb .gbqfb:focus .gbqfi {outline: 1px dotted rgb(255, 255, 255);}
#gbq2 {display: block;}
#gbqf {display: block; margin: 0px 60px 0px 0px; white-space: nowrap;}
..gbqff {border: medium none; display: inline-block; margin: 0px; padding: 0=
px; vertical-align: top; width: 100%;}
..gbqfqw ,#gbqfb ,.gbqfwa {vertical-align: top;}
#gbqfaa ,#gbqfab ,#gbqfqwb {position: absolute;}
#gbqfaa {left: 0px;}
#gbqfab {right: 0px;}
..gbqfqwb ,.gbqfqwc {right: 0px; left: 0px; height: 100%;}
..gbqfqwb {padding: 0px 8px;}
#gbqfbw {display: inline-block; vertical-align: top;}
#gbqfb {border: 1px solid transparent; border-bottom-left-radius: 0px; bord=
er-top-left-radius: 0px; height: 30px; margin: 0px; outline: medium none; p=
adding: 0px; width: 60px; box-shadow: none; box-sizing: border-box; backgro=
und: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(67, 135, 253), =
rgb(70, 131, 234)) repeat scroll 0% 0%;}
#gbqfb:hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
#gbqfb:focus {box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.5) inset;}
#gbqfb:hover:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset, 0=
px 1px 1px rgba(0, 0, 0, 0.1);}
#gbqfb:active:active {border: 1px solid transparent; box-shadow: 0px 2px 0p=
x rgba(0, 0, 0, 0.15) inset; background: rgba(0, 0, 0, 0) -moz-linear-gradi=
ent(center top , rgb(60, 122, 228), rgb(63, 118, 211)) repeat scroll 0% 0%;=
}
..gbqfi {background-position: 0px -479px; display: inline-block; margin: -1p=
x; height: 30px; width: 30px;}
..gbqfqw {background: rgb(255, 255, 255) none repeat scroll 0% 0% padding-bo=
x; border-width: 1px 0px 1px 1px; border-style: solid; -moz-border-top-colo=
rs: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; =
-moz-border-left-colors: none; border-image: none; border-color: rgba(0, 0,=
0, 0.15); height: 30px; box-sizing: border-box;}
#gbfwc .gbqfqw {border-right-width: 1px;}
#gbqfqw {position: relative;}
..gbqfqw.gbqfqw:hover {border-color: rgba(0, 0, 0, 0.3);}
..gbqfwa {display: inline-block; width: 100%;}
..gbqfwb {width: 40%;}
..gbqfwc {width: 60%;}
..gbqfwb .gbqfqw {margin-left: 10px;}
..gbqfqw.gbqfqw:active ,.gbqfqw.gbqfqwf.gbqfqwf {border-color: rgb(66, 133, =
244);}
#gbqfq ,#gbqfqb ,#gbqfqc {background: transparent none repeat scroll 0% 0%;=
border: medium none; height: 20px; margin-top: 4px; padding: 0px; vertical=
-align: top; width: 100%;}
#gbqfq:focus ,#gbqfqb:focus ,#gbqfqc:focus {outline: medium none;}
..gbqfif ,.gbqfsf {color: rgb(34, 34, 34); font: 16px arial,sans-serif;}
#gbqfbwa {display: none; text-align: center; height: 0px;}
#gbqfbwa .gbqfba {margin: 16px 8px;}
#gbqfsa ,#gbqfsb {font: bold 11px/27px Arial,sans-serif !important; vertica=
l-align: top;}
..gb_9 .gbqfqw.gbqfqw ,.gb_S .gbqfqw.gbqfqw {border-color: rgb(255, 255, 255=
); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_9 #gbqfb ,.gb_S #gbqfb {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_9 #gbqfb:hover ,.gb_S #gbqfb:hover {box-shadow: 0px 1px 1px rgba(0, 0, =
0, 0.1), 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_9 #gbqfb:active ,.gb_S #gbqfb:active {box-shadow: 0px 2px 0px rgba(0, 0=
, 0, 0.15) inset, 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gbqfb ,.gbqfba ,.gbqfbb {cursor: default !important; display: inline-block=
; font-weight: bold; height: 29px; line-height: 29px; min-width: 54px; padd=
ing: 0px 8px; text-align: center; text-decoration: none !important; border-=
radius: 2px; -moz-user-select: none;}
..gbqfba:focus {border: 1px solid rgb(77, 144, 254); outline: medium none; b=
ox-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.5) inset;}
..gbqfba:hover {border-color: rgb(198, 198, 198); color: rgb(34, 34, 34) !im=
portant; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); background: rgba(0, 0,=
0, 0) -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, =
241)) repeat scroll 0% 0%;}
..gbqfba:hover:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset, =
0px 1px 1px rgba(0, 0, 0, 0.1);}
..gbqfb::-moz-focus-inner {border: 0px none;}
..gbqfba::-moz-focus-inner {border: 0px none;}
..gbqfba {border: 1px solid rgba(0, 0, 0, 0.1); color: rgb(68, 68, 68) !impo=
rtant; font-size: 11px; background: rgba(0, 0, 0, 0) -moz-linear-gradient(c=
enter top , rgb(245, 245, 245), rgb(241, 241, 241)) repeat scroll 0% 0%;}
..gbqfba:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..gb_0f .gb_b {background-position: -35px -2805px; opacity: 0.55; height: 30=
px; width: 30px;}
..gb_0f .gb_b:hover ,.gb_0f .gb_b:focus {opacity: 0.85;}
..gb_0f .gb_tb {border-bottom-color: rgb(245, 245, 245);}
#gbsfw.gb_1f {background: rgb(245, 245, 245) none repeat scroll 0% 0%; bord=
er-color: rgb(204, 204, 204);}
..gb_S .gb_0f .gb_b {background-position: 0px -1171px; opacity: 1;}
..gb_9 .gb_0f .gb_b {background-position: -52px -859px; opacity: 0.7;}
..gb_9 .gb_0f .gb_b:hover ,.gb_9 .gb_0f .gb_b:focus {opacity: 0.85;}
..gb_N .gb_0f .gb_b::before {left: -35px; top: -2805px;}
..gb_N.gb_9 .gb_0f .gb_b::before {left: -52px; top: -859px;}
..gb_N.gb_S .gb_0f .gb_b::before {left: 0px; top: -1171px;}
..gb_pg {width: 480px;}
..gb_qg {background: rgba(0, 0, 0, 0.04) none repeat scroll 0% 0%; border-bo=
ttom-right-radius: 0px; line-height: 30px; position: relative; text-align: =
center; width: 100%;}
..gb_qg:hover {background: rgba(0, 0, 0, 0.08) none repeat scroll 0% 0%;}
..gb_qg .gb_rg {margin: 0px 10px;}
..gb_sg {position: relative; z-index: 1;}
..gb_tg {background: rgb(238, 238, 238) none repeat scroll 0% 0%; border-bot=
tom: 1px solid rgb(227, 227, 227); border-left: 1px solid rgb(227, 227, 227=
); display: inline-block; line-height: 32px; text-align: center; width: 160=
px;}
..gb_sg .gb_tg:first-child {border-left: medium none;}
..gb_sg .gb_g {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bord=
er-bottom: medium none;}
..gb_ug {display: none; text-align: center;}
..gb_ug.gb_g {display: block;}
..gb_vg {color: inherit; display: inline-block; padding: 15px; text-decorati=
on: none;}
..gb_wg {background-clip: content-box; background-origin: content-box; displ=
ay: inherit; height: 64px; width: 64px;}
..gb_xg {display: block; text-align: center;}
..gb_yg {border-top: medium none; top: 78px; z-index: 1; border-radius: 0px =
0px 2px 2px;}
..gb_zg {display: inline-block; vertical-align: middle;}
..gb_Ag {display: inline-block; vertical-align: middle; background-size: 100=
% auto; height: 20px; width: 20px;}
..gb_Bg {background-image: url("//ssl.gstatic.com/gb/images/a/5a1c013d3d.png=
");}
..gb_Cg {background-image: url("//ssl.gstatic.com/gb/images/a/de580e5330.png=
");}
..gb_Dg {background-image: url("//ssl.gstatic.com/gb/images/a/451603daf6.png=
");}
..gb_zg {margin-left: 4px;}
..gb_Eg {margin: 5px; width: 470px;}
..gb_Fg {border: medium none; display: block; margin: 0px 5px; outline: medi=
um none; padding: 0px 5px; height: 30px; width: 450px;}
..gb_Hg {border-width: 1px medium medium; border-style: solid none none; bor=
der-color: rgb(227, 227, 227) currentcolor currentcolor; -moz-border-top-co=
lors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none=
; -moz-border-left-colors: none; border-image: none; display: block; margin=
: 0px 5px; outline: medium none; padding: 0px 5px; height: 30px; width: 450=
px;}
..gb_Ig {border-color: rgb(227, 227, 227); display: block; font: inherit; ma=
rgin: 0px 5px; outline: medium none; padding: 5px; text-align: left; height=
: 320px; width: 450px;}
..gb_Jg ,.gb_Kg {border: 1px solid rgb(227, 227, 227); border-radius: 2px; c=
ursor: pointer; line-height: 27px; margin: 5px; padding: 0px 8px; width: 54=
px;}
..gb_Jg {float: left;}
..gb_Kg {float: right;}
..gb_Vg {color: rgb(0, 0, 0); font: 13px/27px Arial,sans-serif; left: 0px; m=
in-width: 1117px; position: absolute; top: 0px; -moz-user-select: none; wid=
th: 100%;}
..gb_3f {font: 13px/27px Arial,sans-serif; position: relative; height: 60px;=
width: 100%;}
..gb_cb .gb_3f {height: 28px;}
#gba {height: 60px;}
#gba.gb_cb {height: 28px;}
#gba.gb_Wg {height: 90px;}
#gba.gb_Xg {height: 132px;}
#gba.gb_Wg.gb_cb {height: 58px;}
..gb_3f > .gb_R {height: 60px; line-height: 58px; vertical-align: middle;}
..gb_cb .gb_3f > .gb_R {height: 28px; line-height: 26px;}
..gb_3f::before {background: rgb(229, 229, 229) none repeat scroll 0% 0%; bo=
ttom: 0px; content: ""; display: none; height: 1px; left: 0px; position: ab=
solute; right: 0px;}
..gb_3f {background: rgb(241, 241, 241) none repeat scroll 0% 0%;}
..gb_Zg .gb_3f {background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..gb_Zg .gb_3f::before ,.gb_cb .gb_3f::before {display: none;}
..gb_9 .gb_3f ,.gb_S .gb_3f ,.gb_cb .gb_3f {background: transparent none rep=
eat scroll 0% 0%;}
..gb_9 .gb_3f::before {background: rgba(0, 0, 0, 0.12) none repeat scroll 0%=
0%;}
..gb_S .gb_3f::before {background: rgba(255, 255, 255, 0.2) none repeat scro=
ll 0% 0%;}
..gb_R {display: inline-block; flex: 0 0 auto;}
..gb_R.gb_0g {float: right; order: 1;}
..gb_1g {white-space: nowrap;}
..gb_Xf .gb_1g {display: flex;}
..gb_1g ,.gb_R {margin-left: 0px !important; margin-right: 0px !important;}
..gb_gc {background-image: url("https://ssl.gstatic.com/gb/images/v1_00f2d72=
6.png"); background-size: 92px 2835px;}
..gb_kb {min-width: 255px; padding-left: 30px; padding-right: 30px; position=
: relative; text-align: right; z-index: 986; align-items: center; justify-c=
ontent: flex-end; -moz-user-select: none;}
..gb_cb .gb_kb {min-width: 0px;}
..gb_kb.gb_R {flex: 1 1 auto;}
..gb_Fc {line-height: normal; position: relative; text-align: left;}
..gb_Fc.gb_R ,.gb_xe.gb_R ,.gb_db.gb_R {flex: 0 1 auto;}
..gb_Lg ,.gb_Mg {display: inline-block; padding: 0px 0px 0px 15px; position:=
relative; vertical-align: middle;}
..gb_xe {line-height: normal; padding-right: 15px;}
..gb_kb .gb_xe {padding-right: 0px;}
..gb_db {color: rgb(64, 64, 64); line-height: 30px; min-width: 30px; overflo=
w: hidden; vertical-align: middle; text-overflow: ellipsis;}
#gb.gb_cb.gb_cb .gb_De ,#gb.gb_cb.gb_cb .gb_Fc > .gb_Mg .gb_jg {background:=
rgba(0, 0, 0, 0) none repeat scroll 0% 0%; border: medium none; color: rgb=
(51, 102, 204); cursor: pointer; filter: none; font-size: 11px; line-height=
: 26px; padding: 0px; box-shadow: none;}
#gb.gb_cb.gb_S .gb_De ,#gb.gb_cb.gb_S .gb_Fc > .gb_Mg .gb_jg {color: rgb(25=
5, 255, 255);}
..gb_cb .gb_De {text-transform: uppercase;}
..gb_kb.gb_Zf {padding-left: 0px; padding-right: 29px;}
..gb_kb.gb_Ng {max-width: 400px;}
..gb_Og {background-clip: content-box; background-origin: content-box; opaci=
ty: 0.27; padding: 22px; height: 16px; width: 16px;}
..gb_Og.gb_R {display: none;}
..gb_Og:hover ,.gb_Og:focus {opacity: 0.55;}
..gb_Pg {background-position: 0px -1313px;}
..gb_Qg {background-position: 0px -1731px; padding-left: 30px; padding-right=
: 14px; position: absolute; right: 0px; top: 0px; z-index: 990;}
..gb_hb:not(.gb_ib) .gb_Qg ,.gb_Zf .gb_Pg {display: inline-block;}
..gb_hb .gb_Pg {padding-left: 30px; padding-right: 0px; width: 0px;}
..gb_hb:not(.gb_ib) .gb_Rg {display: none;}
..gb_kb.gb_R.gb_Zf ,.gb_Zf:not(.gb_ib) .gb_Fc {flex: 0 0 auto;}
..gb_Og ,.gb_Zf .gb_xe ,.gb_ib .gb_Fc {overflow: hidden;}
..gb_hb .gb_xe {padding-right: 0px;}
..gb_Zf .gb_Fc {padding: 1px 1px 1px 0px;}
..gb_hb .gb_Fc {width: 75px;}
..gb_kb.gb_Sg ,.gb_kb.gb_Sg .gb_Pg ,.gb_kb.gb_Sg .gb_Pg::before ,.gb_kb.gb_S=
g .gb_xe ,.gb_kb.gb_Sg .gb_Fc {transition: width 0.5s ease-in-out 0s, min-w=
idth 0.5s ease-in-out 0s, max-width 0.5s ease-in-out 0s, padding 0.5s ease-=
in-out 0s, left 0.5s ease-in-out 0s;}
..gb_Xf .gb_kb {min-width: 0px;}
..gb_kb.gb_lb ,.gb_kb.gb_lb .gb_Fc ,.gb_kb.gb_Tg ,.gb_kb.gb_Tg .gb_Fc {min-w=
idth: 0px !important;}
..gb_kb.gb_lb ,.gb_kb.gb_lb .gb_R {flex: 0 0 auto !important;}
..gb_kb.gb_lb .gb_db {width: 30px !important;}
..gb_Ug {margin-right: 32px;}
..gb_9a {display: none;}
..gb_N .gb_Pg::before {clip: rect(1313px, 16px, 1329px, 0px); left: 22px; to=
p: -1291px;}
..gb_N .gb_gc.gb_Qg {position: absolute;}
..gb_N .gb_Qg::before {clip: rect(1731px, 16px, 1747px, 0px); left: 30px; to=
p: -1709px;}
..gb_N .gb_hb .gb_Pg::before {left: 30px;}
..gb_N .gb_gc ,.gb_N .gbii ,.gb_N .gbip {background-image: none; overflow: h=
idden; position: relative;}
..gb_N .gb_gc::before {content: url("https://ssl.gstatic.com/gb/images/v1_00=
f2d726.png"); position: absolute;}
..gb_Rb a:focus {outline: 1px dotted rgb(255, 255, 255) !important;}
sentinel { }
#gbq .gbgt-hvr ,#gbq .gbgt:focus {background-color: transparent; background=
-image: none;}
#gbq1.gbqfh {display: none;}
..gbxx {display: none !important;}
#gbq {line-height: normal; position: relative; top: 0px; white-space: nowra=
p;}
#gbq {left: 0px; width: 100%;}
#gbq2 {top: 0px; z-index: 986;}
#gbq4 {display: inline-block; max-height: 29px; overflow: hidden; position:=
relative;}
#gbq2.gbqfh {z-index: 985;}
#gbq2.gbqfh {margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin=
-left: 0px !important; padding-top: 0px; position: relative; top: 310px;}
..gbqfh #gbqf {margin: auto; min-width: 534px; padding: 0px !important;}
..gbqfh #gbqfbw {display: none;}
..gbqfh #gbqfbwa {display: block;}
..gbqfh #gbqf {max-width: 512px; min-width: 200px;}
..gbqfh .gbqfqw {border-right-width: 1px;}
..gbii::before {content: url("https://lh3.googleusercontent.com/-bszPblAZgGA=
/AAAAAAAAAAI/AAAAAAAAAAA/AGDgw-hiCl5FDyY9aPJVrX9fV8ZktgadEw/s32-c-mo/photo.=
jpg");}
..gbip::before {content: url("https://lh3.googleusercontent.com/-bszPblAZgGA=
/AAAAAAAAAAI/AAAAAAAAAAA/AGDgw-hiCl5FDyY9aPJVrX9fV8ZktgadEw/s96-c-mo/photo.=
jpg");}
..gbii {background-image: url("https://lh3.googleusercontent.com/-bszPblAZgG=
A/AAAAAAAAAAI/AAAAAAAAAAA/AGDgw-hiCl5FDyY9aPJVrX9fV8ZktgadEw/s32-c-mo/photo=
..jpg");}
..gbip {background-image: url("https://lh3.googleusercontent.com/-bszPblAZgG=
A/AAAAAAAAAAI/AAAAAAAAAAA/AGDgw-hiCl5FDyY9aPJVrX9fV8ZktgadEw/s96-c-mo/photo=
..jpg");}
..gb_qa .gb_W::before {left: 0px; top: -2598px;}
#gb192 .gb_W::before {left: 0px; top: -1593px;}
#gb1 .gb_W::before {left: 0px; top: -2491px;}
#gb8 .gb_W::before {left: 0px; top: -2667px;}
#gb36 .gb_W::before {left: -25px; top: -652px;}
#gb78 .gb_W::before {left: 0px; top: -2353px;}
#gb23 .gb_W::before {left: 0px; top: -272px;}
#gb53 .gb_W::before {left: 0px; top: -1067px;}
#gb49 .gb_W::before {left: 0px; top: -998px;}
#gb24 .gb_W::before {left: 0px; top: -410px;}
#gb119 .gb_W::before {left: 0px; top: -1244px;}
#gb51 .gb_W::before {left: 0px; top: -341px;}
#gb31 .gb_W::before {left: 0px; top: -2284px;}
#gb25 .gb_W::before {left: 0px; top: -69px;}
#gb30 .gb_W::before {left: 0px; top: -138px;}
#gb300 .gb_W::before {left: 0px; top: -929px;}
#gb265 .gb_W::before {left: 0px; top: -2215px;}
#gb338 .gb_W::before {left: 0px; top: -2042px;}
..F0XO1GC-e-b {bottom: 24px; left: 24px; position: fixed; z-index: 2000;}
..F0XO1GC-e-b .F0XO1GC-e-a {background: rgb(50, 50, 50) none repeat scroll 0=
% 0%; border-radius: 2px; color: white; display: inline-block; font-size: 1=
4px; max-width: 568px; min-width: 288px; padding: 16px 24px 12px; will-chan=
ge: transform;}
..F0XO1GC-e-b .F0XO1GC-e-a > div {vertical-align: middle; display: inline-bl=
ock; max-width: 450px;}
..F0XO1GC-e-b .F0XO1GC-e-a > div > div {overflow: hidden; text-overflow: ell=
ipsis;}
..F0XO1GC-e-b .F0XO1GC-e-a .F0XO1GC-e-i {color: rgb(161, 194, 250); text-tra=
nsform: uppercase;}
..F0XO1GC-e-b.F0XO1GC-e-d .F0XO1GC-e-c {float: right; opacity: 0.8; padding-=
left: 10px;}
..F0XO1GC-e-b.F0XO1GC-e-d .F0XO1GC-e-c:hover {opacity: 1;}
..F0XO1GC-e-g {transition: opacity 4s ease 0s;}
..F0XO1GC-e-j {transition: opacity 6s ease 0s;}
..F0XO1GC-e-e {opacity: 0;}
body.F0XO1GC-e-m .F0XO1GC-e-b.F0XO1GC-e-f {display: none;}
..F0XO1GC-g-b {background-color: rgb(235, 238, 248); padding: 4px; color: rg=
b(34, 34, 34); box-shadow: 0px 4px 10px rgb(139, 139, 139);}
..F0XO1GC-g-a {height: 14px; width: 6px; overflow: hidden; background: rgba(=
0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAOCAYA=
AAAMn20lAAAAH0lEQVR4XmNYsGDBahBmgAI4H6cE6QBd63C0Yyc2CQCkTVFv9KQgxwAAAABJRU5=
ErkJggg=3D=3D") no-repeat scroll 0px 0px; display: inline-block;}
..gux-dropdown-c {background-color: rgb(249, 249, 249); border-width: 1px; b=
order-style: solid; border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb=
(179, 179, 179);}
..gux-dropdown-b {border-bottom: 1px solid rgb(229, 229, 229); margin-left: =
2px;}
..gux-combo-item {color: rgb(51, 51, 51); cursor: pointer; padding: 3px 8px;=
}
..gux-combo-item-disabled {color: rgb(102, 102, 102);}
..gux-combo-item-selected ,.gux-combo-item-selection {background-color: rgb(=
221, 221, 221);}
..gux-combo-item-current {background-color: rgb(238, 238, 238); font-weight:=
bold;}
..gux-combo-item-has-child {background-image: url("data:image/png;base64,iVB=
ORw0KGgoAAAANSUhEUgAAAAcAAAAHAQMAAAD+nMWQAAAABlBMVEX///9mZmaO7mygAAAAAXRSTl=
MAQObYZgAAABxJREFUeF4FwTEBAAAMAiCiGMHTY/1zDUTNmcoDCSIBTWrzi7sAAAAASUVORK5CY=
II=3D");}
..gux-combo-item-has-child {background-repeat: no-repeat; background-positio=
n: 97% 50%; padding-right: 20px;}
..gux-combo-item-separator {margin: 3px 0px; border-top: 1px solid rgb(207, =
207, 207);}
..F0XO1GC-l-a {overflow: auto; max-height: 400px; min-width: 150px;}
html ,body ,div ,span ,applet ,object ,body {margin: 0px; padding: 0px; bor=
der: 0px none;}
iframe {margin: 0px; padding: 0px;}
h1 ,h2 ,h3 ,h4 ,h5 ,h6 ,p ,pre ,a ,abbr ,acronym ,address ,big ,cite ,code =
,del ,dfn ,em ,font ,img ,ins ,kbd ,q ,s ,samp ,small ,strike ,strong ,sub =
,sup ,tt ,var ,dl ,dt ,dd ,fieldset ,form ,label ,legend ,table ,caption ,t=
body ,tfoot ,thead ,tr ,th ,td {margin: 0px; padding: 0px; border: 0px none=
;}
body {background: white none repeat scroll 0% 0%;}
table {border-collapse: separate; border-spacing: 0px;}
caption ,th ,td {font-weight: normal;}
input::-moz-focus-inner {border: 0px none;}
body {font-family: "Arial","Helvetica",sans-serif; color: rgb(34, 34, 34); =
font-size: 13px; height: 100%; background-color: rgb(255, 255, 255);}
html {height: 100%; background-color: rgb(255, 255, 255);}
body {overflow-y: hidden; overflow-x: auto;}
..F0XO1GC-b-q {position: fixed; overflow: hidden; width: 100%; height: 100%;=
}
h1 ,h2 ,h3 ,h4 ,h5 {font-size: 16px; line-height: 24px; font-weight: normal=
; color: rgb(34, 34, 34);}
li {line-height: 17px;}
a {text-decoration: none; color: rgb(17, 85, 204); cursor: pointer;}
a:visited {color: rgb(102, 17, 204);}
a:active {color: rgb(209, 72, 54);}
iframe {border: 0px none;}
strong {font-weight: bold; color: rgb(34, 34, 34);}
em {font-style: italic;}
input[type=3D"text"] ,input[type=3D"password"] ,textarea ,.editable ,body {=
border-width: 1px; border-style: solid; border-color: rgb(192, 192, 192) rg=
b(217, 217, 217) rgb(217, 217, 217); -moz-border-top-colors: none; -moz-bor=
der-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-c=
olors: none; border-image: none; vertical-align: top; box-sizing: border-bo=
x; border-radius: 1px;}
input[type=3D"text"] ,input[type=3D"password"] {background-color: rgb(255, =
255, 255); color: rgb(34, 34, 34); display: inline-block; height: 29px; lin=
e-height: 27px; padding-left: 8px;}
textarea ,.editable ,body {padding: 5px;}
input[type=3D"text"]:hover ,input[type=3D"password"]:hover ,textarea:hover =
,.editable:hover {border-width: 1px; border-style: solid; border-color: rgb=
(160, 160, 160) rgb(185, 185, 185) rgb(185, 185, 185); -moz-border-top-colo=
rs: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; =
-moz-border-left-colors: none; border-image: none; box-shadow: 0px 1px 2px =
rgba(0, 0, 0, 0.1) inset;}
input[type=3D"text"]:focus ,input[type=3D"password"]:focus ,textarea:focus =
,.editable:focus {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset; outline=
: medium none; border: 1px solid rgb(77, 144, 254);}
input[disabled] ,input[disabled]:hover ,textarea[disabled] ,textarea[disabl=
ed]:hover {border-width: 1px; border-style: solid; border-color: rgb(192, 1=
92, 192) rgb(217, 217, 217) rgb(217, 217, 217); -moz-border-top-colors: non=
e; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-bo=
rder-left-colors: none; border-image: none; box-shadow: none;}
..F0XO1GC-b-V ,.F0XO1GC-b-V:hover ,.F0XO1GC-b-V:focus {border: 1px solid rgb=
(221, 75, 57) !important;}
..F0XO1GC-b-R {color: rgb(221, 75, 57);}
..F0XO1GC-b-Hb textarea ,.F0XO1GC-b-Hb input[type=3D"text"] {width: 100%; ma=
x-width: 600px;}
..F0XO1GC-b-Hb textarea {height: 100px;}
..F0XO1GC-b-Jb:first-child {border-top: medium none;}
..F0XO1GC-b-Jb:last-child {border-bottom: 1px solid rgb(235, 235, 235);}
..F0XO1GC-b-Jb {border-top: 1px solid rgb(235, 235, 235); padding: 20px 0px;=
clear: both;}
..F0XO1GC-b-N .F0XO1GC-b-Jb ,body .F0XO1GC-b-Jb {padding: 12px 0px;}
..F0XO1GC-b-O .F0XO1GC-b-Jb {padding: 7px 0px;}
..F0XO1GC-b-Jb p {line-height: 13px;}
..F0XO1GC-b-Ib {padding-bottom: 0px; border: medium none;}
..F0XO1GC-b-Fb {display: block; float: left; width: 185px; font-weight: bold=
;}
..F0XO1GC-b-Fb a {font-size: 11px;}
..F0XO1GC-b-Gb {font-size: 11px; color: rgb(102, 102, 102); font-weight: nor=
mal;}
..F0XO1GC-b-Eb {margin-left: 210px;}
#gbqfq {border: medium none !important; box-shadow: none !important; line-h=
eight: normal !important;}
..F0XO1GC-b-w {position: absolute; width: 100%; text-align: center; height: =
0px;}
..F0XO1GC-b-w .gux-confirm-panel-c {display: inline-block; box-shadow: 0px 2=
px 4px rgba(0, 0, 0, 0.2);}
..gux-confirm-panel-r1 ,.gux-confirm-panel-r2 ,.gux-confirm-panel-r3 ,.gux-c=
onfirm-panel-r4 {display: none;}
..gux-confirm-panel-c {padding: 7px 16px !important; background: rgb(249, 23=
7, 190) none repeat scroll 0% 0% !important; border: 1px solid rgb(240, 195=
, 109); border-radius: 2px; line-height: 16px; font-size: 11px; position: r=
elative;}
..gux-confirm-panel-c a ,.gux-confirm-panel-c a:visited {color: rgb(51, 51, =
51); text-decoration: underline;}
..gux-confirm-panel-c a:hover {color: rgb(32, 32, 32);}
..gux-confirm-panel-message {color: inherit !important; font-weight: inherit=
!important;}
..F0XO1GC-b-y {text-align: center; padding: 16px;}
..F0XO1GC-b-y .gux-confirm-panel-c {display: inline-block;}
..F0XO1GC-b-o {position: relative; overflow: hidden; height: 58px; border-bo=
ttom: 1px solid rgb(235, 235, 235);}
..F0XO1GC-b-O .F0XO1GC-b-o {min-height: 44px; height: 44px;}
..F0XO1GC-b-p {font-size: 20px; position: absolute; left: 44px; top: 18px;}
..F0XO1GC-b-N .F0XO1GC-b-p ,body .F0XO1GC-b-p {left: 28px;}
..F0XO1GC-b-O .F0XO1GC-b-p {font-size: 16px; left: 16px; top: 11px;}
..F0XO1GC-b-dc .F0XO1GC-b-p ,body .F0XO1GC-b-p {left: 30px;}
..F0XO1GC-b-p ,.F0XO1GC-b-p a ,.F0XO1GC-b-p a:hover ,.F0XO1GC-b-p a:visited =
{color: rgb(221, 75, 57);}
..F0XO1GC-b-n {position: relative; font-size: 20px; font-weight: normal; col=
or: rgb(34, 34, 34); white-space: nowrap; overflow: hidden; margin-top: 14p=
x; min-height: 30px; margin-right: 44px;}
..F0XO1GC-b-N .F0XO1GC-b-n ,body .F0XO1GC-b-n {margin-right: 28px;}
..F0XO1GC-b-O .F0XO1GC-b-n {margin-top: 8px; margin-right: 16px;}
..F0XO1GC-b-dc .F0XO1GC-b-n ,body .F0XO1GC-b-n {margin-right: 30px;}
..F0XO1GC-b-m {position: absolute; left: 50px; top: 40px; font-size: 10px; p=
adding: 1px;}
..F0XO1GC-b-X {color: rgb(102, 102, 102);}
..F0XO1GC-b-W {background-color: rgb(249, 237, 190); border-radius: 6px;}
..F0XO1GC-b-W a {color: rgb(34, 34, 34); padding: 7px;}
..F0XO1GC-b-N .F0XO1GC-b-m ,body .F0XO1GC-b-m {left: 34px;}
..F0XO1GC-b-O .F0XO1GC-b-m {font-size: 8px; left: 21px; top: 31px;}
..F0XO1GC-b-dc .F0XO1GC-b-m ,body .F0XO1GC-b-m {left: 36px;}
..F0XO1GC-b-Yb {display: inline-block; font-size: 16px; line-height: 24px; f=
ont-weight: normal; color: rgb(34, 34, 34);}
..F0XO1GC-b-Yb:focus {outline: medium none;}
..F0XO1GC-b-xb {height: 16px; margin-top: 4px;}
..F0XO1GC-b-yb {margin-right: 10px;}
..F0XO1GC-b-Rb {height: 32px; position: relative;}
..F0XO1GC-b-E {padding: 16px 44px 16px 0px;}
..F0XO1GC-b-N .F0XO1GC-b-E ,body .F0XO1GC-b-E {padding: 16px 28px 16px 0px;}
..F0XO1GC-b-O .F0XO1GC-b-E {padding: 7px 16px 7px 0px;}
..F0XO1GC-b-dc .F0XO1GC-b-E ,body .F0XO1GC-b-E {padding-right: 30px;}
..F0XO1GC-b-t {font-weight: bold; white-space: nowrap; margin-right: 4px; ve=
rtical-align: middle;}
..F0XO1GC-b-Zb {display: inline-block; width: 17px; z-index: 10; cursor: poi=
nter; text-align: center; position: relative;}
..F0XO1GC-b-j {display: inline-block;}
..F0XO1GC-b-Y {cursor: pointer; position: absolute; right: 5px; top: 5px;}
..F0XO1GC-b-Bb {font-size: 11px; color: rgb(102, 102, 102);}
..F0XO1GC-b-Cb {color: rgb(102, 102, 102);}
..F0XO1GC-b-jb ,.F0XO1GC-b-Mb ,.F0XO1GC-b-sb {color: rgb(17, 85, 204); text-=
decoration: none; cursor: pointer; white-space: nowrap;}
..F0XO1GC-b-Mb {font-size: 11px;}
..F0XO1GC-b-sb {padding-left: 8px;}
..F0XO1GC-b-wb[role=3D"listbox"] {z-index: 10000;}
..F0XO1GC-b-k {padding-right: 18px;}
..F0XO1GC-b-nb {font-weight: bold; cursor: pointer;}
#gbar ,#guser {padding-top: 4px !important;}
#gbar {padding-left: 8px;}
#guser {padding-right: 5px;}
..gwt-PopupGlass ,.gwt-PopupPanelGlass ,.modal-dialog-bg {background-color: =
rgb(255, 255, 255); opacity: 0.75; z-index: 1020; position: absolute; top: =
0px; bottom: 0px; left: 0px; right: 0px;}
..gwt-PopupPanel ,.gwt-SuggestBoxPopup ,.modal-dialog ,.F0XO1GC-b-i {z-index=
: 1021;}
..gwt-SuggestBoxPopup ,.gwt-PopupPanel ,.modal-dialog {background: rgb(255, =
255, 255) none repeat scroll 0% 0%; transition: opacity 0.218s ease 0s;}
..gwt-SuggestBoxPopup ,.F0XO1GC-b-i {min-width: 384px; padding: 0px; box-sha=
dow: 0px 2px 4px rgba(0, 0, 0, 0.2);}
..gwt-PopupPanel ,.modal-dialog {box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2)=
;}
..gwt-SuggestBoxPopup ,.gwt-PopupPanel ,.modal-dialog ,.F0XO1GC-b-i {outline=
: medium none; border: 1px solid rgb(204, 204, 204);}
..gwt-SuggestBoxPopup table {width: 100%;}
..gwt-SuggestBoxPopup .item {font-size: 13px; line-height: 30px; color: rgb(=
51, 51, 51); padding: 2px 44px 2px 16px;}
..gwt-SuggestBoxPopup .item-selected {background-color: rgb(238, 238, 238);}
..gwt-SuggestBoxPopup .menuSeparatorInner {height: 1px; background-color: rg=
b(235, 235, 235);}
..gux-comboPopup {z-index: 1022;}
..F0XO1GC-b-a {margin-right: 1em; cursor: pointer; padding: 4px 5px 4px 0px;=
display: inline-block; vertical-align: middle; color: rgb(102, 102, 102);}
..F0XO1GC-b-e {cursor: pointer; padding: 4px 5px 4px 0px; display: inline-bl=
ock; vertical-align: middle; color: rgb(102, 102, 102);}
..F0XO1GC-b-a:hover ,.F0XO1GC-b-e:hover {color: rgb(51, 51, 51);}
..F0XO1GC-b-a span ,.F0XO1GC-b-e span {white-space: nowrap; vertical-align: =
middle;}
..F0XO1GC-b-c {vertical-align: middle; margin-right: 2px; float: left; posit=
ion: relative; top: -2px; opacity: 0.667;}
..F0XO1GC-b-a:hover .F0XO1GC-b-c ,.F0XO1GC-b-e:hover .F0XO1GC-b-c {opacity: =
1;}
..F0XO1GC-b-d {padding-right: 1em;}
..F0XO1GC-b-b ,.F0XO1GC-b-b span {text-decoration: none; color: rgb(119, 119=
, 119);}
..F0XO1GC-b-Lb {height: 16px; width: 14px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCA=
YAAAAmlE46AAAAnklEQVR4XmNQVFRcoKik+J8kDNTDgCFIJKaaxgtKSkoNIAxkfwBhJP4FnBpBC=
higAKYBmU99jcDQ2qCgouCgoKBgAHMeGh+HRgj+AFIIMgSNjxJtGBoVlBUCFJQUClD4ygoJ6Oow=
NBKLydcIdoay4gFFSLyhKgCJY8EgPbDQZoBqhmtCkcQHkDR+AAUIujxOAHMuKOjR5fACcOSToAk=
Alg7ZcpKQZvMAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-b-Db > a .F0XO1GC-b-Lb ,body > a .F0XO1GC-b-Lb {height: 16px; widt=
h: 14px; overflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAmUlEQVR4XmO4722xAIj=
/k4gXMGARJApTTeOF+z4WDWDsbfEBjBH8C7g1AhUwQAFMAwqf+hq9LTcAFTjc97IygDsPlY9LIx=
h/ACsEGYLCR402TI2+lgFATQUofC+LBHR1mBqJxBRoBDnDy+LAfUi8oSoAiWPHCbDQBhkA0oysC=
SGJDyBp/AAKEHR5nADuXGDQo8vhBeB4I0ETADumhjt9vOGeAAAAAElFTkSuQmCC") no-repeat=
scroll 0px 0px;}
..F0XO1GC-b-T {height: 13px; width: 13px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/gif;base64,R0lGODlhDQANAKIAAP///+/v7+vr68rKyr6=
+vpqammVlZQAAACH5BAEHAAMALAAAAAANAA0AAAM2ODpU/oWsUQK4N5RZrvkGsC0d9onNYwKhY4=
le7GBdiIml+GLCfKWQSO42UgxpnN2lNwFCJIsEADs=3D") no-repeat scroll 0px 0px; di=
splay: inline-block; margin-left: 4px;}
..gwt-HintingTextBox-hinting {color: rgb(136, 136, 136);}
..F0XO1GC-b-ab {color: rgb(170, 170, 170) !important;}
..F0XO1GC-b-tb {white-space: nowrap; display: inline;}
..F0XO1GC-b-U {color: red; vertical-align: baseline; font-size: 0.83em; posi=
tion: relative; top: -0.4em;}
..F0XO1GC-b-Kb {border: 0px none; overflow: hidden;}
..F0XO1GC-b-K {position: relative; top: -1px; border-style: solid dashed das=
hed; border-color: rgb(51, 102, 204) transparent transparent; display: inli=
ne-block; font-size: 0px; height: 0px; line-height: 0; width: 0px; border-w=
idth: 3px 3px 0px; padding-top: 1px; left: 4px;}
..F0XO1GC-b-x {text-align: center;}
..F0XO1GC-b-bc {width: 90%; left: 5% !important; z-index: 1020;}
..F0XO1GC-b-cc {color: rgb(255, 255, 255); background-color: rgb(0, 0, 0); o=
pacity: 0.9; border-radius: 10px; padding: 1em; width: 100%;}
..F0XO1GC-b-Qb {white-space: nowrap; padding: 0px 2px; font-size: 11px;}
..F0XO1GC-b-Qb img {position: relative; top: 1px; right: 2px; vertical-align=
: bottom;}
..F0XO1GC-b-l ,.F0XO1GC-b-qb {color: rgb(64, 178, 91);}
..F0XO1GC-b-L {color: rgb(238, 68, 68);}
..F0XO1GC-b-r {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-b-s {font-size: 13px; padding-left: 2em;}
..F0XO1GC-b-S ,.F0XO1GC-b-fb ,.F0XO1GC-b-mb {color: rgb(238, 68, 68);}
..F0XO1GC-b-lb {display: inline-block;}
..F0XO1GC-b-lb img {vertical-align: bottom;}
..F0XO1GC-b-eb {border-top: 1px solid rgb(235, 235, 235); margin-top: 9px; m=
argin-bottom: 10px;}
..gux-comboPopup ,.ac-renderer {transition: opacity 0.218s ease 0s; box-shad=
ow: 0px 2px 4px rgba(0, 0, 0, 0.2);}
..gux-dropdown-c ,.ac-renderer {background-color: rgb(255, 255, 255); outlin=
e: 1px solid rgba(0, 0, 0, 0.2); padding: 6px 0px; white-space: nowrap;}
..gux-dropdown-c {box-shadow: none;}
..ac-renderer {position: absolute;}
..F0XO1GC-b-gb {padding-left: 32px !important;}
..gux-dropdown-c ,.ac-renderer {border: 1px solid rgb(204, 204, 204);}
..gux-combo-item ,.ac-renderer > div {display: block; padding: 6px 44px 6px =
16px; position: relative; color: rgb(51, 51, 51); font-size: 13px; font-wei=
ght: normal; cursor: pointer; line-height: 17px; transition: background 0.1=
3s ease 0s;}
..F0XO1GC-b-N .gux-combo-item ,.F0XO1GC-b-N .ac-renderer > div ,body .gux-co=
mbo-item ,body .ac-renderer > div {padding: 4px 28px 4px 16px;}
..F0XO1GC-b-O .gux-combo-item ,.F0XO1GC-b-O .ac-renderer > div {padding: 2px=
16px;}
..F0XO1GC-b-dc .gux-combo-item ,.F0XO1GC-b-dc .ac-render > div ,body .gux-co=
mbo-item ,body .ac-render > div {padding-right: 30px;}
..gux-combo-item:focus {outline: medium none !important;}
..gux-combo-item img {opacity: 0.667;}
..gux-combo-item:hover img {opacity: 1;}
..gux-combo-item-selected ,.gux-combo-item-selection ,.ac-active {background=
-color: rgb(241, 241, 241); color: rgb(34, 34, 34); outline: medium none !i=
mportant;}
..gux-combo-item-separator {border-top: 1px solid rgb(235, 235, 235); margin=
-top: 6px; margin-bottom: 6px;}
..gux-combo-item-disabled {color: rgb(153, 153, 153);}
..gux-combo-item-disabled img {opacity: 0.667;}
..F0XO1GC-b-J {overflow: hidden; background: rgba(0, 0, 0, 0) url("data:imag=
e/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAI0lEQVR4XmOIjI=
z8z4AMQAIogjABuCCyAFgQpwoUM+AcIAAA2BAgobr+lh4AAAAASUVORK5CYII=3D") no-repea=
t scroll 0px 0px; display: inline-block; width: 5px; height: 7px; transitio=
n: all 0.218s ease 0s; transform: rotate(90deg); opacity: 0.8;}
..F0XO1GC-b-Db .F0XO1GC-b-J ,body .F0XO1GC-b-J {height: 7px; width: 4px; ove=
rflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iVBO=
Rw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAI0lEQVR4XmO46235nwEZgARQBGECcEF=
kAbAgThUoZsA5QAAAMl4mARgGem4AAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;=
}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J { }
..F0XO1GC-b-F {overflow-y: scroll !important;}
..F0XO1GC-b-G {padding-right: 28px;}
..F0XO1GC-b-N .F0XO1GC-b-G ,body .F0XO1GC-b-G {padding-right: 12px;}
..F0XO1GC-b-O .F0XO1GC-b-G {padding-right: 0px;}
..F0XO1GC-b-dc .F0XO1GC-b-G ,body .F0XO1GC-b-G {padding-right: 14px;}
..F0XO1GC-b-ob {padding: 16px 28px 16px 0px;}
..F0XO1GC-b-N .F0XO1GC-b-ob ,body .F0XO1GC-b-ob {padding: 16px 12px 16px 0px=
;}
..F0XO1GC-b-O .F0XO1GC-b-ob {padding: 7px 0px;}
..F0XO1GC-b-v {position: absolute; right: 44px; top: 3px; font-size: 11px; c=
olor: rgb(136, 136, 136);}
..F0XO1GC-b-v a ,.F0XO1GC-b-v a:visited {color: rgb(136, 170, 238);}
..F0XO1GC-b-v a:hover {color: rgb(17, 85, 204);}
..F0XO1GC-b-Ab {position: relative;}
..F0XO1GC-b-Nb ,.F0XO1GC-b-Nb .F0XO1GC-b-q {background-color: rgb(245, 245, =
245);}
..gwt-TabBar {border-bottom: 1px solid rgb(204, 204, 204);}
..gwt-TabBarItem {min-width: 54px; text-align: center; color: rgb(102, 102, =
102); font-size: 11px; font-weight: bold; height: 27px; padding: 0px 8px; l=
ine-height: 27px; margin-bottom: -1px; border: 1px solid transparent; curso=
r: default; border-top-left-radius: 2px; border-top-right-radius: 2px;}
..gwt-TabBarItem:hover {color: rgb(34, 34, 34);}
..gwt-TabBarItem:focus {outline: medium none; color: rgb(51, 51, 51);}
..gwt-TabBarItem:active {color: rgb(51, 51, 51);}
..gwt-TabBarItem-selected {color: rgb(32, 32, 32); background-color: rgb(255=
, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(204,=
204, 204) rgb(204, 204, 204) rgb(255, 255, 255); -moz-border-top-colors: n=
one; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-=
border-left-colors: none; border-image: none;}
..gwt-TabBarFirst-wrapper {display: none;}
..gwt-ScrollTable td {height: 40px; line-height: 40px; padding: 0px 8px; bor=
der-bottom: 1px solid rgb(235, 235, 234); overflow: hidden; text-overflow: =
ellipsis; white-space: nowrap;}
..F0XO1GC-b-N .gwt-ScrollTable td ,body .gwt-ScrollTable td {height: 34px; l=
ine-height: 34px;}
..F0XO1GC-b-O .gwt-ScrollTable td {height: 30px; line-height: 30px;}
..gwt-ScrollTable .headerTable td {color: rgb(102, 102, 102); cursor: defaul=
t; border-bottom: 1px solid rgb(204, 204, 204);}
..gwt-ScrollTable .headerTable td:hover {color: rgb(34, 34, 34);}
..gwt-ScrollTable .headerTable td:active {color: rgb(51, 51, 51);}
..F0XO1GC-b-P {padding: 12px;}
..F0XO1GC-b-zb {position: absolute; left: -10000px;}
..F0XO1GC-b-u {display: block;}
..F0XO1GC-b-kb {height: 16px; width: 16px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/gif;base64,R0lGODlhEAAQAPeQANHR0fX19aampvDw8O=
/v7+zs7CgoKGBgYPf395iYmMPDw4CAgDMzM8LCwtbW1vv7+4SEhIWFhbe3t6Ojo25ubltbW+vr6=
+fn51paWjs7O0VFRXx8fKKiopubm7m5uUNDQ97e3pKSkqqqqvHx8W1tbc3NzTk5OYyMjEtLS4+P=
jzAwMKSkpO3t7ebm5ri4uG9vb5qamlhYWAkJCcjIyMzMzBgYGAUFBUpKStPT0zExMWRkZLq6ur6=
+vq+vr09PTzY2NgEBAfr6+vT09BkZGR0dHUdHR1ZWVmdnZ8/Pz9nZ2RYWFlNTU7a2tpmZma2trZ=
GRkUZGRsTExOPj4729vaioqAICAk1NTeDg4KmpqaGhoenp6SkpKcXFxR4eHtzc3EhISKCgoO7u7=
rKysl5eXp6eni8vL7W1tSMjI1JSUsfHx3p6eioqKiEhIeHh4T09PVBQUOXl5bOzs0lJSc7OzsrK=
ymZmZvPz88vLy2hoaEFBQT8/P3t7e9/f3z4+PpeXlx8fHxAQEAgICMbGxqysrOrq6jo6OvLy8tv=
b20BAQFVVVdTU1OLi4qurq8HBwf39/QAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAACQACwAAAAA=
EAAQAAAIfgAhCRzogYGJBgMTQoqy4A4kA48eZVAoUFCZR3kOqYioAZKjAY4GRogoI4GCDyhKQAo=
ggMBABz6GjGlBMUDIgYR6FKCoEEGHCQ94KkwRkYNQSAAaQRr5KMHRpJAKnAgx4qjVq44CCLWZkI=
AArQpZuhz48SYAAALLHm2k9OrVgAAh+QQJAACQACwAAAAAEAAQAAAIfgAhCRzoAMMBEAMTKqzw6=
BGFIGCWCAgyMA0FGoZINNzwRMkjJVgGxnj0RsKFBRAsGGj46MBAMVDMWEiYZQ2QLRIGXsBSQCEk=
EVZ2+BzqsxEAogIBNBJoFCkkpU6jShXoKADRAI4SEhBgVWEAAQQSOhqQ9elRSGPLDm20dCrSgAA=
h+QQJAACQACwAAAAAEAAQAAAIfQAhCRyIoMOEBwMTKkzx6BEHSA0WzEnoaIAjSBEaJqDz41EhRQ=
MJCAgAqcCJECP2VGkIY6Ajkgq9GKmBgY/Cm5C09GCBE6cHBiYaQGoEoCckAw0zDC3aU0VDDUYHK=
viAokTUni97BrgYcuTNAAIIULQoEADTilxxNmp0tW1AACH5BAkAAJAALAAAAAAQABAAAAh+ACEJ=
HEiwoEGBjRodFOhogCOBAABAYqHgBRKCBAQEKLiizyM8BB1tLCiFSpEpCwu2EFEgZUEHGA6AgNR=
I4sIKjx5RoGnzIImcG1wKvLAAggWhMHKsCDmS4BM2j7qIGJixqUADOR8dGNjwIaSIkLIQeXRGws=
KEAgcdceFVKMGAACH5BAkAAJAALAAAAAAQABAAAAh9ACEJHEiwoEGBjRodFOhogCOBAAAwdEiQg=
IAABgMIIEDQEcaDAR4uHElSIIIOEx5AaiRxYYpHjzisbHkwAswEJSEVOBFiRMkoL3B0/Ehwhp5A=
iIQKtIjRAwMTDdRUgdlkYMOHBmBmuILGRqJFB1XA1ADpihM4CxV8QFHCYEAAIfkECQAAkAAsAAA=
AABAAEAAACHsAIQkcSLCgQYGNGh0U6GiAI4EAADB0SJCAgAAGAwggQNARxoMBHi4cSfJgI4kjAS=
iEdJKkypILE+RYYdDODiEDYQx5ZEAAwTA8YtAYeOORUSgOMBwAMcHNozoDBdR4tEVCBaMUWsTRo=
WDgA0ZHJEAiYXQDzAsLIFgwGBAAIfkECQAAkAAsAAAAABAAEAAACH0AIQkcSLCgQYGNGh0U6GiA=
I4EAADB0SJCAgAAGAwggQNARxoMBHi4c6YGBiQYjBxp49CjDSAAKVbDU8FKhgg8oSqQkOOMFkp2=
QuPyQ8SVJRpGQILCU4QdBhwkPIGnkKDCJHBsVtKRgyQFSQ6SQ2jiRAikCywRAC5wIMcJgQAAh+Q=
QFAACQACwAAAAAEAAQAAAIfAAhCRxIsKBABGSWUHEEqVEjgwKbAHpERAAkAAAEOhrAUOCNRyCLF=
AwggMBAAX+AMHBhMEBHgSKsMIFI0AGGAyBoEqwAkoJOAA9JgNzw8+GFBRAs6Cw4wAWCpQMbGZkh=
pOVLSDEe+ZhJkKTJgVN08GBxMSOkjVcLOoTKNiAAOw=3D=3D") no-repeat scroll 0px 0px=
;}
..F0XO1GC-b-A {padding-left: 8px;}
..gux-combo-item .F0XO1GC-b-A {padding-left: 21px;}
..F0XO1GC-b-z {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAAoUlEQVR4XmNgGAWDFUgCMTu6ICXAHIgnAbEzugS5wB6IlwBxFLoEuSAQiGcCcR=
kQM6HJkQxYgTidAWJgDpocWYAbiCsZIAaWMkAsIAlMAWJ/IGaB8sWAuJkBYmAdEHNCxUkCjgwQA=
6qA2AKI+6B8kMG8SOpIBqkMEINguBOIhVBUkAFAXmxigBjYA8TSqNLkA1kGiIEKaOIUA7IiZRQM=
cgAAWowSHyS3HFUAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px; position: re=
lative; display: inline-block; top: 5px; left: 3px;}
..gux-combo-item .F0XO1GC-b-z {top: -4px; left: -8px; vertical-align: bottom=
; height: 15px;}
..F0XO1GC-b-B {overflow-y: hidden !important;}
..F0XO1GC-b-B:hover {overflow-y: auto;}
input.F0XO1GC-b-hb {border: 1px solid rgb(221, 75, 57) !important; color: r=
gb(221, 75, 57) !important;}
..F0XO1GC-b-Q ,.F0XO1GC-b-Q strong {color: rgb(221, 75, 57);}
..F0XO1GC-b-f {cursor: pointer;}
..F0XO1GC-b-f img {opacity: 0.667; margin: 12px 6px 11px;}
..F0XO1GC-b-f:hover img {opacity: 1;}
..F0XO1GC-b-i .popupContent {margin: 12px;}
..F0XO1GC-b-i label {display: block; margin-bottom: 4px; color: rgb(102, 102=
, 102);}
..F0XO1GC-b-i input[type=3D"text"] {height: 24px; line-height: 24px; width: =
99%;}
..F0XO1GC-b-g {position: absolute; right: 14px; bottom: 18px;}
..F0XO1GC-b-h {margin-bottom: 8px;}
..datePicker {padding: 16px; outline: 1px solid rgba(0, 0, 0, 0.2); opacity:=
0; width: 144px; position: absolute; left: -9999px; top: 6px; z-index: 3; =
background: rgb(255, 255, 255) none repeat scroll 0% 0%; box-shadow: 0px 2p=
x 4px rgba(0, 0, 0, 0.2); border-radius: 2px; transition: all 0.13s linear =
0s;}
..dateBoxPopup {background-color: white; z-index: 1023;}
..gwt-DatePicker {border: 1px solid rgb(162, 187, 221); cursor: default;}
..gwt-DatePicker td ,.datePickerMonthSelector td:focus {outline: medium none=
;}
..datePickerDays {width: 100%; background: white none repeat scroll 0% 0%;}
..datePickerWeekendLabel ,.datePickerWeekdayLabel {min-width: 20px; width: 2=
0px; height: 20px; line-height: 20px; padding-left: 3px; padding-right: 3px=
; font-size: 11px; text-align: center; color: rgb(102, 102, 102); cursor: d=
efault;}
..datePickerDay {min-width: 20px; width: 20px; height: 20px; line-height: 20=
px; padding-left: 3px; padding-right: 3px; font-size: 11px; text-align: cen=
ter; color: rgb(102, 102, 102); cursor: pointer;}
..datePickerDayIsToday {border: 1px solid black;}
..datePickerDayIsFiller {color: rgb(204, 204, 204);}
..datePickerDayIsValue {background: rgb(170, 204, 238) none repeat scroll 0%=
0%;}
..datePickerDayIsDisabled {color: rgb(170, 170, 170); font-style: italic;}
..datePickerDayIsHighlighted ,.datePickerPreviousButton-up-hovering ,.datePi=
ckerNextButton-up-hovering {background: rgb(238, 238, 238) none repeat scro=
ll 0% 0%; color: rgb(51, 51, 51);}
..datePickerDayIsValueAndHighlighted {background: rgb(187, 221, 217) none re=
peat scroll 0% 0%;}
..datePickerMonthSelector {width: 100%;}
td.datePickerMonth {text-align: center; white-space: nowrap; font-size: 13p=
x; color: rgb(102, 102, 102); padding-left: 4px;}
..datePickerPreviousButton ,.datePickerNextButton {font-size: 120%; line-hei=
ght: 1em; cursor: pointer; padding: 0px 4px;}
..F0XO1GC-b-pb { }
..F0XO1GC-b-rb {position: absolute; left: -10000px; top: auto; width: 1px; h=
eight: 1px; overflow: hidden;}
..iph-dialog {z-index: 1010 !important;}
..F0XO1GC-b-H {background-color: rgb(255, 255, 255);}
..F0XO1GC-b-Vb {z-index: 1999;}
..F0XO1GC-b-Vb > div {background-color: rgb(125, 164, 253) !important; borde=
r: 1px solid rgb(125, 164, 253) !important;}
..F0XO1GC-b-bb {height: 16px; width: 16px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCA=
IAAACQkWg2AAAAqklEQVQoz2P4TyJgoIKGCZu2IyN8GiAqfqICNG0MyKohKp5+Q0FAcPXlW7ged=
A1AFXuuPU2YsB2Cbr37AhQ5+fAxuga4aiACqlt+/BaQUb/8GJANETx46w5ED0LDvbfvkV0CNBtZ=
w6azF9E13HjxElk1xElwESwaTtx/BJdGU41dw56rN9HCB58GqKvevMNqA1w1ugagBBBhmo1dAzy=
mISrgCGdMk5OWiAEA3zqvClm2uDoAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;=
display: inline-block; position: relative; top: 3px; left: 3px;}
..F0XO1GC-b-db {background-color: rgba(255, 255, 255, 0); outline-style: non=
e; box-shadow: 0px 0px rgba(255, 255, 255, 0);}
..F0XO1GC-b-cb {overflow: hidden; padding: 10px; background-color: rgb(249, =
237, 190); border: 1px solid rgb(240, 195, 109); border-radius: 10px;}
..F0XO1GC-b-vb {margin-right: 15px;}
..F0XO1GC-b-Ub {font-weight: bold; color: rgb(119, 119, 119); margin: 10px;}
..F0XO1GC-b-ub {font-style: italic;}
..F0XO1GC-d-C {cursor: pointer; font-size: 13px; display: block;}
..F0XO1GC-d-x {position: relative; margin: 0px;}
..F0XO1GC-d-y {padding: 16px 0px 16px 28px;}
..F0XO1GC-b-N .F0XO1GC-d-y ,body .F0XO1GC-d-y {padding: 16px 0px 16px 12px;}
..F0XO1GC-b-O .F0XO1GC-d-y {padding: 7px 0px;}
..F0XO1GC-b-dc .F0XO1GC-d-y ,body .F0XO1GC-d-y {padding-left: 14px;}
..F0XO1GC-d-w {font-size: 13px; padding: 0px; margin: 0px; position: relativ=
e;}
..F0XO1GC-d-b {padding-bottom: 5px;}
..F0XO1GC-d-w div a {display: block; overflow: hidden; white-space: nowrap; =
text-decoration: none; color: rgb(51, 51, 51); cursor: pointer; font-size: =
13px; line-height: 30px; padding-left: 16px;}
..F0XO1GC-d-C a ,.F0XO1GC-d-C a:visited {display: block; overflow: hidden; p=
osition: relative; white-space: nowrap; text-decoration: none; color: rgb(5=
1, 51, 51); cursor: pointer; font-size: 13px; line-height: 30px; padding-le=
ft: 16px;}
..F0XO1GC-b-N .F0XO1GC-d-w div a ,.F0XO1GC-b-N .F0XO1GC-d-C a ,body .F0XO1GC=
-d-w div a ,body .F0XO1GC-d-C a {line-height: 24px;}
..F0XO1GC-b-O .F0XO1GC-d-w div a ,.F0XO1GC-b-O .F0XO1GC-d-C a {line-height: =
20px;}
..F0XO1GC-d-B ,.F0XO1GC-d-B .F0XO1GC-d-B {margin-left: 12px;}
..F0XO1GC-d-B .F0XO1GC-d-m a {padding-left: 4px;}
..F0XO1GC-d-w div a {position: relative;}
..F0XO1GC-d-d {position: absolute; top: 5px; bottom: 5px; left: 0px; right: =
0px;}
..F0XO1GC-d-w div.F0XO1GC-d-m a:hover ,.F0XO1GC-d-w div.F0XO1GC-d-c a:hover =
{color: rgb(34, 34, 34); background-color: rgb(238, 238, 238);}
..F0XO1GC-b-Db > div > a span ,.F0XO1GC-b-Db > a span ,body > div > a span ,=
body > a span {color: rgb(209, 72, 54);}
..F0XO1GC-b-Z {background-color: rgb(238, 238, 238);}
..F0XO1GC-d-w div.F0XO1GC-d-c {cursor: default;}
..F0XO1GC-b-C .F0XO1GC-d-B {display: none;}
..F0XO1GC-d-p {display: block; overflow: hidden; text-overflow: ellipsis; pa=
dding-left: 12px;}
..F0XO1GC-d-p > h3 {display: inline;}
..F0XO1GC-d-p > * {font-size: 13px;}
..F0XO1GC-d-c > a .F0XO1GC-d-p {cursor: default;}
..F0XO1GC-d-w div.F0XO1GC-d-t > a .F0XO1GC-d-p {padding-left: 0px;}
..F0XO1GC-d-B div.F0XO1GC-d-t > a .F0XO1GC-d-p {padding-left: 4px;}
..F0XO1GC-d-g {vertical-align: middle; line-height: 1px; cursor: default;}
..F0XO1GC-d-g span {cursor: default;}
..F0XO1GC-d-D {display: inline-block; width: 17px; height: 20px; position: a=
bsolute; top: 4px; left: 0px; margin-left: -1px; z-index: 10; cursor: point=
er; text-align: center;}
..F0XO1GC-d-D:hover {background-color: rgb(238, 238, 238);}
..F0XO1GC-b-N .F0XO1GC-d-D ,body .F0XO1GC-d-D {top: 2px;}
..F0XO1GC-b-O .F0XO1GC-d-D {top: 0px;}
..F0XO1GC-d-e {height: 16px; width: 16px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAY=
AAAAf8/9hAAAALElEQVR4XmNgoBQoKin+x4HfKygoGKCrxwBYNJJmCBZNJOFRA0YNGC4GUAoAAJ=
wgHbDiRLwAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-b-Db .F0XO1GC-d-e ,body .F0XO1GC-d-e {height: 16px; width: 16px; o=
verflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iV=
BORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAALUlEQVR4XmNgoBTc97b4jx2bv7/vZ=
WWArh4DYGok0RBMTaThUQNGDRguBlAKAIrl74P/KoO/AAAAAElFTkSuQmCC") no-repeat scr=
oll 0px 0px;}
..F0XO1GC-d-t .F0XO1GC-d-e {display: none;}
..F0XO1GC-d-t > div > a .F0XO1GC-d-p {padding-left: 0px;}
..F0XO1GC-d-z {height: 15px; width: 15px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAY=
AAAA71pVKAAAAtklEQVR4Xq1RURXDIAxEwiQkdEImoRImZRImYRIqYRIqAQk4oBxLHjSvlI/u3s=
srJNzlmjh3ACK62dwpvPcv9hxzJImI3FAoP1yVwMyfEp6D5NaugHRMPPG3fYSziCR8G0qFWI09d=
XVg8wWnyq46ozs9bO0yGbbDyPZhPSu/e92HAytTrasKsClWdVUgLzTRbLkFu7W08dv5ovcs8LTc=
HTCYEvKP6NgKDgUsQPirgK0PoQLYEO4bRktk6roSAYoAAAAASUVORK5CYII=3D") no-repeat =
scroll 0px 0px;}
..F0XO1GC-b-Db .F0XO1GC-d-z ,body .F0XO1GC-d-z {height: 15px; width: 15px; o=
verflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iV=
BORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAuElEQVR4Xq1RwQ2DMAzMCIzj/HgHK=
jFCR2GEjpARGKEjsIEzQjagsetAsAh5tCedROzc+YiNuQBOfadrt8ARZhwgJm7CyLWWUbq47oIB=
vDBIba0ayMQNHbzLS/QtJmTgC8kBmRZr7jmBrjNunU2RbIRe934WU+zQin3ZR2dftelUq/UY8qp=
5VYFjfqPmVSXaBR920lqGWktJz8J8dvDU2hPoYZjyjzTxZNgy0CDBXw10v4ndIG2Izh+5ScL343=
KOmQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-d-i {position: absolute; top: 7px; opacity: 0.7; left: 4px;}
..F0XO1GC-b-N .F0XO1GC-d-i ,body .F0XO1GC-d-i {top: 4px;}
..F0XO1GC-b-O .F0XO1GC-d-i {top: 2px;}
..F0XO1GC-d-w div.F0XO1GC-d-m a:hover .F0XO1GC-d-i ,.F0XO1GC-d-f:hover .F0XO=
1GC-d-i ,.F0XO1GC-b-Db .F0XO1GC-d-i ,body .F0XO1GC-d-i {opacity: 1;}
..F0XO1GC-d-f .F0XO1GC-d-i {left: 16px;}
..F0XO1GC-d-m ,.F0XO1GC-d-c {position: relative;}
..F0XO1GC-d-q {padding-right: 20px;}
..F0XO1GC-d-n {display: block; float: right; position: relative; top: 7px; m=
argin-left: 3px; font-size: 11px; color: rgb(102, 102, 102) !important; bac=
kground-color: rgb(238, 238, 238); padding: 2px 3px; line-height: 12px; fon=
t-weight: normal;}
..F0XO1GC-b-N .F0XO1GC-d-n ,body .F0XO1GC-d-n {top: 5px;}
..F0XO1GC-b-O .F0XO1GC-d-n {top: 2px;}
..F0XO1GC-d-m a:hover .F0XO1GC-d-n ,.F0XO1GC-d-c a:hover .F0XO1GC-d-n {backg=
round-color: rgb(204, 204, 204); color: rgb(51, 51, 51) !important;}
..F0XO1GC-d-j {display: none;}
..F0XO1GC-d-m:hover .F0XO1GC-d-j ,.F0XO1GC-d-f:hover .F0XO1GC-d-j ,.F0XO1GC-=
d-a {display: inline;}
..F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-d-c .F0XO1GC-d-v {top: 8px; right: 3px;=
z-index: 2; position: absolute; height: 13px; width: 13px; overflow: hidde=
n;}
..F0XO1GC-b-N .F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-b-N .F0XO1GC-d-c .F0XO1GC-=
d-v ,body .F0XO1GC-d-m .F0XO1GC-d-v ,body .F0XO1GC-d-c .F0XO1GC-d-v {top: 6=
px;}
..F0XO1GC-b-O .F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-b-O .F0XO1GC-d-c .F0XO1GC-=
d-v {top: 4px;}
..F0XO1GC-d-v input {border: 0px none; padding: 0px; outline: medium none;}
a.F0XO1GC-d-u {height: 13px; width: 13px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCA=
YAAABy6+R8AAAARUlEQVR4XmN49+7d/6dPnxKNQeoZQAxSAEj9UNJ05swZnBinJhBAV4ysAQSwa=
gIBXBpAAKcmEMCmAQTwasIF6KyJnLQHABO3ibexFooiAAAAAElFTkSuQmCC") no-repeat scr=
oll 0px 0px;}
a.F0XO1GC-d-u:hover ,.F0XO1GC-d-a a.F0XO1GC-d-u {height: 13px; width: 13px;=
overflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,=
iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAQUlEQVR4XmO4fv36/2PHjhGNQeo=
ZQIx3794RjUHqh5KmyMhInBinJlwa8dqETSO6HE5NMI3oYgQ14cJ01kRO2gMAVulOLFDgg5kAAA=
AASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
a.F0XO1GC-d-u {display: inline-block; padding: 0px !important;}
..F0XO1GC-d-E {font-weight: bold;}
..F0XO1GC-d-r {padding: 4px 8px;}
..F0XO1GC-d-r div {background-color: rgb(249, 237, 190); border: 2px solid r=
gb(249, 237, 190); color: rgb(34, 34, 34); padding: 4px; line-height: 16px;=
border-radius: 6px; text-align: center;}
div.dragdrop-dropTarget-engage .F0XO1GC-d-g {border: 1px solid red;}
..dragdrop-flow-panel-positioner {display: block; height: 2px; background-co=
lor: rgb(34, 34, 34); vertical-align: baseline !important;}
..F0XO1GC-d-f {position: relative; outline-style: none;}
..dragdrop-dropTarget-engage > .F0XO1GC-d-f a {background-color: rgb(136, 13=
6, 136);}
..F0XO1GC-d-s div.dragdrop-dropTarget-engage {border: 2px solid rgb(34, 34, =
34);}
..F0XO1GC-d-l {outline-style: none; margin-bottom: 9px;}
..F0XO1GC-d-h {font-size: 11px; color: rgb(68, 68, 68); text-align: center; =
padding: 16px 0px 20px 16px;}
..F0XO1GC-d-h a {white-space: nowrap;}
..F0XO1GC-d-h a:visited {color: rgb(17, 85, 204);}
..F0XO1GC-d-F {background-color: rgb(250, 250, 210) !important;}
..F0XO1GC-d-k {border-top: 1px solid rgb(235, 235, 235); margin-top: 4px; ma=
rgin-bottom: 10px;}
..F0XO1GC-c-d {color: rgb(184, 184, 184);}
..F0XO1GC-c-a {color: rgb(17, 85, 204); text-decoration: none; cursor: point=
er; white-space: nowrap;}
..F0XO1GC-c-b ,.F0XO1GC-c-b:visited ,.F0XO1GC-c-b:focus {color: rgb(184, 184=
, 184); text-decoration: none; cursor: text; outline: medium none;}
..F0XO1GC-A-a {position: relative; top: 3px; height: 15px; width: 15px;}
..F0XO1GC-w-a {width: 100%; margin-right: 0px; height: 8px; position: absolu=
te; top: 0px; left: 0px; opacity: 0; border-top: 1px solid rgb(235, 235, 23=
5);}
..F0XO1GC-m-c {text-align: left; border-bottom: 1px solid rgb(153, 153, 153)=
; font-size: 150%; padding-bottom: 4px;}
..F0XO1GC-m-g .F0XO1GC-m-d {width: 100%;}
..F0XO1GC-m-d th {text-align: left; padding-top: 16px;}
..F0XO1GC-m-d .F0XO1GC-m-a {vertical-align: top;}
..F0XO1GC-m-d .F0XO1GC-m-e {text-align: right; font-weight: bold; white-spac=
e: nowrap; padding-right: 0.3em;}
..F0XO1GC-m-d .F0XO1GC-m-b {font-size: 70%;}
..F0XO1GC-m-d .F0XO1GC-m-f {text-align: left;}
..F0XO1GC-m-g .F0XO1GC-m-a {width: 50%;}
..F0XO1GC-m-g .F0XO1GC-m-e ,.F0XO1GC-m-g th {color: rgb(221, 221, 0);}
..F0XO1GC-m-g .F0XO1GC-m-b ,.F0XO1GC-m-g td {color: rgb(255, 255, 255);}
..F0XO1GC-m-g th {font-weight: bold; padding: 16px 4px 4px;}
..F0XO1GC-m-g td {padding: 4px;}
..F0XO1GC-n-a {cursor: pointer; font-size: 11px; font-weight: bold; text-ali=
gn: center; margin-right: 16px; white-space: nowrap; height: 27px; line-hei=
ght: 27px; min-width: 54px; outline: 0px none; padding: 0px 8px; border-rad=
ius: 2px; display: inline-block;}
..F0XO1GC-c-c .F0XO1GC-n-a {min-width: 26px !important; margin-right: 10px;}
..chrome-theme .F0XO1GC-n-a {border-radius: 3px; font-size: 12px; font-weigh=
t: 700; padding: 0px 17px; text-align: center; text-decoration: none !impor=
tant;}
..F0XO1GC-n-a:hover {border: 1px solid rgb(198, 198, 198); box-shadow: 0px 1=
px 1px rgba(0, 0, 0, 0.1);}
..chrome-theme .F0XO1GC-n-a:hover {box-shadow: none;}
..F0XO1GC-n-j {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..F0XO1GC-n-a img.F0XO1GC-n-d {vertical-align: middle; margin-top: -2px; opa=
city: 0.667;}
..F0XO1GC-n-j img.F0XO1GC-n-d ,.F0XO1GC-n-c img.F0XO1GC-n-d ,.F0XO1GC-n-a:ho=
ver img.F0XO1GC-n-d {opacity: 1;}
..F0XO1GC-n-h {min-width: 34px; padding: 0px 4px;}
..F0XO1GC-n-b {cursor: default; opacity: 0.5; pointer-events: none;}
..F0XO1GC-n-f {border-right-color: transparent; margin-right: 0px;}
..F0XO1GC-n-g {border-radius: 0px; margin-left: -1px; margin-right: -1px;}
..F0XO1GC-n-i {border-left-color: transparent; margin-left: 0px;}
..F0XO1GC-n-f {border-radius: 2px 0px 0px 2px;}
..F0XO1GC-n-f { }
..F0XO1GC-n-f {border-radius: 2px 0px 0px 2px;}
..F0XO1GC-n-i {border-radius: 0px 2px 2px 0px;}
..F0XO1GC-n-i { }
..F0XO1GC-n-i {border-radius: 0px 2px 2px 0px;}
..F0XO1GC-n-i {margin-left: -1px;}
..chrome-theme .F0XO1GC-n-f {border-radius: 3px 0px 0px 3px;}
..chrome-theme .F0XO1GC-n-f { }
..chrome-theme .F0XO1GC-n-f {border-radius: 3px 0px 0px 3px;}
..chrome-theme .F0XO1GC-n-i {border-radius: 0px 3px 3px 0px;}
..chrome-theme .F0XO1GC-n-i { }
..chrome-theme .F0XO1GC-n-i {border-radius: 0px 3px 3px 0px;}
..chrome-theme .F0XO1GC-n-i {margin-left: -1px;}
..jfk-button-standard {color: rgb(102, 102, 102); border: 1px solid rgba(0, =
0, 0, 0.1); background-color: rgb(245, 245, 245); background-image: -moz-li=
near-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241));}
..jfk-button-standard:hover {border: 1px solid rgb(198, 198, 198); color: rg=
b(51, 51, 51); background-color: rgb(248, 248, 248); background-image: -moz=
-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));}
..jfk-button-standard:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) ins=
et;}
..jfk-button-standard:focus {outline: medium none; border: 1px solid rgb(77,=
144, 254); z-index: 4;}
..chrome-theme .jfk-button-standard:focus {border: 1px solid rgb(170, 170, 1=
70);}
..jfk-button-standard.F0XO1GC-n-j {background-color: rgb(238, 238, 238); bor=
der: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51); background-image=
: -moz-linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224))=
;}
..jfk-button-standard.F0XO1GC-n-b {background: rgb(255, 255, 255) none repea=
t scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(184, 184,=
184);}
..F0XO1GC-k-b {height: 4px; width: 7px; overflow: hidden; background: rgba(0=
, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAA=
ABCxiV9AAAAHElEQVR4XmOIjIz8jwszgAC6IFwCBnBKwAC6BACk/yChPTGdaAAAAABJRU5ErkJg=
gg=3D=3D") no-repeat scroll 0px 0px; display: inline-block; margin-left: 7p=
x; margin-bottom: 1px; opacity: 0.8;}
..F0XO1GC-k-c:hover .F0XO1GC-k-b {opacity: 1;}
..F0XO1GC-f-F ,.F0XO1GC-f-x {position: relative;}
..F0XO1GC-f-q {height: 68px; background-color: rgb(245, 245, 245); padding: =
0px 44px; vertical-align: middle; border-top: 1px solid rgb(229, 229, 229);=
border-bottom: 1px solid rgb(229, 229, 229); position: relative;}
..F0XO1GC-b-N .F0XO1GC-f-q ,body .F0XO1GC-f-q {padding: 0px 28px;}
..F0XO1GC-b-O .F0XO1GC-f-q {height: 44px; padding: 0px 16px;}
..F0XO1GC-b-dc .F0XO1GC-f-q ,body .F0XO1GC-f-q {padding-right: 30px; padding=
-left: 30px;}
..F0XO1GC-f-p {position: absolute; left: 44px;}
..F0XO1GC-b-N .F0XO1GC-f-p ,body .F0XO1GC-f-p {left: 28px;}
..F0XO1GC-b-O .F0XO1GC-f-p {left: 16px; height: 60px; top: -7px;}
..F0XO1GC-b-dc .F0XO1GC-f-p ,body .F0XO1GC-f-p {left: 30px;}
..F0XO1GC-f-D {height: 68px; position: absolute; left: 220px; right: 0px;}
..F0XO1GC-b-N .F0XO1GC-f-D ,body .F0XO1GC-f-D {left: 204px;}
..F0XO1GC-b-O .F0XO1GC-f-D {left: 176px; height: 44px;}
..F0XO1GC-b-dc .F0XO1GC-f-D ,body .F0XO1GC-f-D {left: 204px;}
..F0XO1GC-f-E {padding: 12px 8px;}
..F0XO1GC-f-G ,.F0XO1GC-f-G > * ,body > * {outline: medium none !important;}
..F0XO1GC-f-v {width: 198px; position: absolute; left: 0px;}
..F0XO1GC-f-l {margin-left: 220px;}
..F0XO1GC-f-l:focus {outline: medium none;}
..F0XO1GC-f-f {position: absolute; top: 7px; left: 244px; cursor: pointer; z=
-index: 2;}
..F0XO1GC-f-j .F0XO1GC-f-v {display: none;}
..F0XO1GC-f-j .F0XO1GC-f-e {margin-left: 24px !important;}
..F0XO1GC-f-j .F0XO1GC-f-d {margin-left: 220px !important;}
..F0XO1GC-f-j .F0XO1GC-f-f {left: 0px;}
..F0XO1GC-f-o .F0XO1GC-f-q ,.F0XO1GC-f-o .F0XO1GC-f-v ,.F0XO1GC-f-o .F0XO1GC=
-b-p {display: none;}
..F0XO1GC-f-o .F0XO1GC-f-l {margin-left: 24px !important;}
..F0XO1GC-f-o .F0XO1GC-b-o ,.F0XO1GC-f-o .F0XO1GC-b-G {padding-right: 8px;}
..F0XO1GC-f-o .F0XO1GC-f-x {position: relative;}
..F0XO1GC-f-o .F0XO1GC-f-x .F0XO1GC-f-l {margin-left: 0px !important; positi=
on: absolute; top: 0px; bottom: 0px; right: 0px; left: 24px !important;}
..F0XO1GC-f-o .F0XO1GC-b-D {position: relative;}
..F0XO1GC-f-o .F0XO1GC-f-n {display: none !important;}
#gb.F0XO1GC-f-o ,#gba.F0XO1GC-f-o {display: none;}
..F0XO1GC-f-y {padding: 5px;}
..F0XO1GC-f-z {outline: medium none; border: medium none;}
..F0XO1GC-f-z img {outline: medium none; border: medium none; margin-top: 8p=
x;}
..F0XO1GC-f-A {position: absolute; width: 8px; top: 0px; bottom: 0px; right:=
-20px; cursor: col-resize;}
..F0XO1GC-f-A .F0XO1GC-f-C {display: block; position: absolute; left: 5px; t=
op: 0px; bottom: 0px; border-left: 1px solid rgb(235, 235, 235);}
..F0XO1GC-f-B .F0XO1GC-f-C {border-left: 1px solid rgb(235, 235, 235);}
..F0XO1GC-f-A .F0XO1GC-f-i {visibility: visible !important;}
..F0XO1GC-b-w {top: -15px;}
..F0XO1GC-f-q .F0XO1GC-b-w {top: 54px;}
html ,body ,#gb ,#gbx1 {min-width: 700px;}
html {overflow-x: auto; overflow-y: hidden;}
body {overflow: visible;}
..F0XO1GC-f-b {overflow: hidden; min-height: 30px;}
..F0XO1GC-f-w {position: absolute; right: 0px; top: 0px; padding-left: 16px;=
}
..F0XO1GC-f-w > div > div {display: inline-block; margin-right: 0px; margin-=
left: 16px;}
..F0XO1GC-c-c .F0XO1GC-f-w > div > div {margin-left: 10px; margin-right: 0px=
;}
..F0XO1GC-f-w > div > div:first-child {margin-left: 0px;}
..F0XO1GC-f-g {transform: rotate(180deg); vertical-align: middle;}
..F0XO1GC-f-m {transform: rotate(0deg); vertical-align: middle;}
..F0XO1GC-f-h {border: 1px solid rgb(235, 235, 235); padding: 4px; cursor: p=
ointer !important;}
..F0XO1GC-b-O .F0XO1GC-f-h {padding: 3px 3px 4px;}
..F0XO1GC-f-h:hover {background-color: rgb(238, 238, 238);}
..F0XO1GC-f-i:hover {visibility: visible;}
..F0XO1GC-f-i {visibility: hidden; position: absolute; right: 2px; top: 0px;=
bottom: 0px; padding: 8px 0px 8px 8px;}
..F0XO1GC-f-n {display: none; position: absolute; padding: 8px 0px;}
..F0XO1GC-f-j .F0XO1GC-f-n {display: block;}
..F0XO1GC-b-N .F0XO1GC-f-i ,body .F0XO1GC-f-i {padding: 7px 0px 7px 7px;}
..F0XO1GC-b-O .F0XO1GC-f-i {padding: 6px 0px 6px 6px;}
..F0XO1GC-b-N .F0XO1GC-f-n ,body .F0XO1GC-f-n {padding: 7px 0px;}
..F0XO1GC-b-O .F0XO1GC-f-n {padding: 6px 0px;}
..F0XO1GC-v-a {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAAoUlEQVR4XmNgGAWDFUgCMTu6ICXAHIgnAbEzugS5wB6IlwBxFLoEuSAQiGcCcR=
kQM6HJkQxYgTidAWJgDpocWYAbiCsZIAaWMkAsIAlMAWJ/IGaB8sWAuJkBYmAdEHNCxUkCjgwQA=
6qA2AKI+6B8kMG8SOpIBqkMEINguBOIhVBUkAFAXmxigBjYA8TSqNLkA1kGiIEKaOIUA7IiZRQM=
cgAAWowSHyS3HFUAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px; position: ab=
solute; left: 3px;}
..gux-combo-item.F0XO1GC-v-b {padding-left: 28px;}
..goog-button-base {cursor: default; font: 0.846em/1 Arial,sans-serif; lette=
r-spacing: normal; margin: 0px 1px; outline: medium none; text-align: cente=
r; text-indent: 0px; text-transform: none; vertical-align: baseline; white-=
space: nowrap; word-spacing: normal;}
..goog-button-base-outer-box {border-top: 1px solid rgb(187, 187, 187); bord=
er-bottom: 1px solid rgb(170, 170, 170);}
..goog-button-base-inner-box {background: rgb(227, 227, 227) none repeat scr=
oll 0% 0%; border-left: 1px solid rgb(187, 187, 187); border-right: 1px sol=
id rgb(170, 170, 170); margin: 0px -1px;}
..goog-button-base-pos {height: 100%; position: relative;}
..goog-button-base-top-shadow {background: rgb(249, 249, 249) none repeat sc=
roll 0% 0%; border-bottom: 0.23em solid rgb(238, 238, 238); height: 0.692em=
; left: 0px; overflow: hidden; position: absolute; right: 0px; top: 0px;}
..goog-button-base-content {color: rgb(51, 51, 51); line-height: 1.7em; posi=
tion: relative; padding: 0px 0.545em; text-align: center;}
..goog-button-base-hover .goog-button-base-content ,.goog-button-base-focuse=
d .goog-button-base-content {color: rgb(0, 0, 0);}
..goog-button-base-hover .goog-button-base-outer-box ,.goog-button-base-hove=
r .goog-button-base-inner-box ,.goog-button-base-focused .goog-button-base-=
outer-box ,.goog-button-base-focused .goog-button-base-inner-box {border-co=
lor: rgb(136, 136, 136);}
..goog-button-base-active .goog-button-base-inner-box ,.goog-button-base-ope=
n .goog-button-base-inner-box {background: rgb(249, 249, 249) none repeat s=
croll 0% 0%;}
..goog-button-base-active .goog-button-base-top-shadow ,.goog-button-base-op=
en .goog-button-base-top-shadow {background: rgb(227, 227, 227) none repeat=
scroll 0% 0%;}
..goog-button-base-active .goog-button-base-content ,.goog-button-base-open =
..goog-button-base-content {color: rgb(0, 0, 0);}
..goog-button-base-primary .goog-button-base-content {font-weight: bold; col=
or: rgb(0, 0, 0);}
..goog-button-base-disabled {cursor: default;}
..goog-button-base-disabled .goog-button-base-inner-box {background: rgb(238=
, 238, 238) none repeat scroll 0% 0%;}
..goog-button-base-disabled .goog-button-base-top-shadow {background: rgb(23=
8, 238, 238) none repeat scroll 0% 0%; border-color: rgb(238, 238, 238);}
..goog-button-base-disabled .goog-button-base-content {color: rgb(153, 153, =
153);}
..goog-button-base-collapse-right ,.goog-button-base-collapse-right .goog-bu=
tton-base-inner-box {margin-right: 0px;}
..goog-button-base-collapse-left {margin-left: 0px;}
..goog-button-base-collapse-left .goog-button-base-inner-box {margin-left: 0=
px; border-left: 1px solid rgb(255, 255, 255);}
..goog-button-base-hover.goog-button-base-collapse-left ,.goog-button-base-f=
ocused.goog-button-base-collapse-left {border-left: 1px solid rgb(136, 136,=
136); margin-left: -1px; z-index: 1;}
..goog-button-base-selected .goog-button-base-outer-box ,.goog-button-base-s=
elected .goog-button-base-inner-box {background-color: rgb(119, 119, 119); =
border-color: rgb(136, 136, 136);}
..goog-button-base-selected .goog-button-base-top-shadow {border-bottom-colo=
r: rgb(136, 136, 136); background-color: rgb(153, 153, 153);}
..goog-button-base-selected .goog-button-base-content {color: rgb(238, 238, =
238);}
..goog-button-base-collapse-left.goog-button-base-selected .goog-button-base=
-inner-box {border-left: 1px solid rgb(85, 85, 85);}
..F0XO1GC-q-e {background-color: rgb(42, 42, 42); border: 1px solid rgb(255,=
255, 255); color: rgb(255, 255, 255); display: block; position: absolute; =
padding: 5px 7px; z-index: 10; white-space: nowrap;}
..F0XO1GC-q-g {z-index: 1021;}
..F0XO1GC-q-e strong {color: rgb(255, 255, 255);}
..F0XO1GC-q-e::before ,.F0XO1GC-q-e::after {border-style: solid; content: ""=
; display: block; height: 0px; position: absolute; width: 0px;}
..F0XO1GC-q-e.F0XO1GC-q-f::before ,.F0XO1GC-q-e.F0XO1GC-q-h::before ,.F0XO1G=
C-q-e.F0XO1GC-q-i::before ,.F0XO1GC-q-e.F0XO1GC-q-d::before {bottom: auto; =
margin-top: -7px; top: 50%;}
..F0XO1GC-q-e.F0XO1GC-q-f::after ,.F0XO1GC-q-e.F0XO1GC-q-h::after ,.F0XO1GC-=
q-e.F0XO1GC-q-i::after ,.F0XO1GC-q-e.F0XO1GC-q-d::after {bottom: auto; marg=
in-top: -6px; top: 50%;}
..F0XO1GC-q-e.F0XO1GC-q-l::before ,.F0XO1GC-q-e.F0XO1GC-q-c::before ,.F0XO1G=
C-q-e.F0XO1GC-q-l::after ,.F0XO1GC-q-e.F0XO1GC-q-c::after {left: 80% !impor=
tant;}
..F0XO1GC-q-e.F0XO1GC-q-k::before ,.F0XO1GC-q-e.F0XO1GC-q-b::before ,.F0XO1G=
C-q-e.F0XO1GC-q-k::after ,.F0XO1GC-q-e.F0XO1GC-q-b::after {left: 20% !impor=
tant;}
..F0XO1GC-q-e.F0XO1GC-q-j::before ,.F0XO1GC-q-e.F0XO1GC-q-a::before {left: 5=
0%; margin-left: -7px; right: auto;}
..F0XO1GC-q-e.F0XO1GC-q-j::after ,.F0XO1GC-q-e.F0XO1GC-q-a::after {left: 50%=
; margin-left: -6px; right: auto;}
..F0XO1GC-q-e.F0XO1GC-q-j::before {border-color: rgb(255, 255, 255) transpar=
ent; border-width: 8px 7px 0px; bottom: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-j::after {border-color: rgb(42, 42, 42) transparent;=
border-width: 7px 6px 0px; bottom: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-a::before {border-color: rgb(255, 255, 255) transpar=
ent; border-width: 0px 7px 8px; top: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-a::after {border-color: rgb(42, 42, 42) transparent;=
border-width: 0px 6px 7px; top: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-f::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 0px 7px 8px; right: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-f::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 0px 6px 7px; right: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-h::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 8px 7px 0px; left: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-h::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 7px 6px 0px; left: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-i::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 0px 7px 8px; right: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-i::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 0px 6px 7px; right: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-d::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 8px 7px 0px; left: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-d::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 7px 6px 0px; left: -7px;}
..F0XO1GC-j-t {background-color: white; border: medium none; outline: medium=
none; padding: 0px;}
..F0XO1GC-j-m {font-size: 16px; line-height: 24px; color: rgb(34, 34, 34); f=
ont-weight: normal; margin-bottom: 8px;}
..F0XO1GC-b-wb .F0XO1GC-j-m ,.F0XO1GC-j-t .F0XO1GC-j-m ,.F0XO1GC-b-O .F0XO1G=
C-b-wb .F0XO1GC-j-m ,.F0XO1GC-b-N .F0XO1GC-b-wb .F0XO1GC-j-m ,.F0XO1GC-b-M =
..F0XO1GC-b-wb .F0XO1GC-j-m ,body .F0XO1GC-b-wb .F0XO1GC-j-m {background-col=
or: rgb(66, 133, 244); color: rgb(255, 255, 255); height: 36px; padding: 0p=
x; margin: 0px;}
..F0XO1GC-b-O .F0XO1GC-j-m {padding: 20px 16px 0px;}
..F0XO1GC-j-e {overflow-y: auto; overflow-x: hidden; position: relative; max=
-width: 600px; min-width: 250px; font-size: 13px; line-height: 17px;}
..F0XO1GC-b-O .F0XO1GC-b-wb .F0XO1GC-j-f ,.F0XO1GC-b-N .F0XO1GC-b-wb .F0XO1G=
C-j-f ,.F0XO1GC-b-M .F0XO1GC-b-wb .F0XO1GC-j-f ,.F0XO1GC-b-wb .F0XO1GC-j-f =
,body .F0XO1GC-b-wb .F0XO1GC-j-f {margin: 0px;}
..F0XO1GC-j-f {margin: 24px;}
..F0XO1GC-b-O .F0XO1GC-j-f {margin: 12px;}
..F0XO1GC-j-f .F0XO1GC-j-q {font-weight: bold;}
..F0XO1GC-j-f .F0XO1GC-j-n {color: rgb(102, 102, 102); margin-bottom: 12px; =
margin-left: 22px;}
..F0XO1GC-j-f .F0XO1GC-j-o {margin-top: 12px;}
..F0XO1GC-j-r {height: 24px; width: 24px;}
..F0XO1GC-j-j ,.F0XO1GC-j-h {display: table-cell;}
..F0XO1GC-j-i {margin: 24px;}
..F0XO1GC-j-g {margin-top: 24px; text-align: left;}
..F0XO1GC-j-h > .F0XO1GC-j-g {margin: 48px 24px 24px;}
..F0XO1GC-j-y.F0XO1GC-j-w .F0XO1GC-j-g {margin-top: 24px;}
..F0XO1GC-j-x .F0XO1GC-j-f {margin-top: 0px;}
..F0XO1GC-j-w .F0XO1GC-j-f {margin-bottom: 0px;}
..F0XO1GC-j-p .F0XO1GC-j-e {overflow: visible; max-width: none; padding: 0px=
;}
..F0XO1GC-j-u .F0XO1GC-j-c {display: none;}
..F0XO1GC-j-c {cursor: pointer; right: 10px; position: absolute; top: 6px;}
..F0XO1GC-b-wb .F0XO1GC-j-c ,.F0XO1GC-j-s .F0XO1GC-j-c {line-height: 36px; t=
op: 8px; vertical-align: text-bottom;}
..F0XO1GC-j-c img:hover {background-color: rgb(123, 170, 247);}
..F0XO1GC-j-s {background-color: rgb(66, 133, 244); bottom: 0px; height: 36p=
x; position: fixed; right: 25px; width: 260px; z-index: 1;}
..F0XO1GC-j-t .F0XO1GC-j-l ,.F0XO1GC-b-wb .F0XO1GC-j-l ,.F0XO1GC-j-s .F0XO1G=
C-j-l {color: rgb(255, 255, 255); font-family: "Roboto",Arial,sans-serif; f=
ont-size: 16px; font-weight: normal; line-height: 36px; padding-left: 15px;=
text-align: left;}
..F0XO1GC-b-i .F0XO1GC-j-c {top: 5px; right: 5px;}
..F0XO1GC-b-i .F0XO1GC-j-c img {display: block;}
..F0XO1GC-j-f .F0XO1GC-k-c ,.F0XO1GC-j-f .F0XO1GC-k-c:focus {background-imag=
e: none; background-repeat: repeat; background-attachment: scroll; backgrou=
nd-clip: border-box; background-origin: padding-box; background-position: 0=
% 0%; background-size: auto auto; background-color: inherit; border: 1px so=
lid rgba(0, 0, 0, 0); box-shadow: none; color: inherit; font-size: 13px; pa=
dding: 0px 3px; opacity: 0.6;}
..F0XO1GC-j-f .F0XO1GC-k-c:hover {background-color: lightgray;}
..gssb_c {border: 0px none; position: absolute; z-index: 989;}
..gssb_e {border-width: 1px; border-style: solid; border-color: rgb(217, 217=
, 217) rgb(204, 204, 204) rgb(204, 204, 204); -moz-border-top-colors: none;=
-moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-bord=
er-left-colors: none; border-image: none; box-shadow: 0px 2px 4px rgba(0, 0=
, 0, 0.2); cursor: default;}
..gssb_f {visibility: hidden; white-space: nowrap;}
..gssb_k {border: 0px none; display: block; position: absolute; top: 0px; z-=
index: 988;}
..gsdd_a {border: medium none !important;}
..gsib_a {width: 100%; vertical-align: top; padding: 4px 5px 0px;}
..gssb_a {padding: 0px 7px;}
..gssb_a ,.gssb_a td {white-space: nowrap; overflow: hidden; line-height: 22=
px;}
#gssb_b {font-size: 11px; color: rgb(51, 102, 204); text-decoration: none;}
#gssb_b:hover {font-size: 11px; color: rgb(51, 102, 204); text-decoration: =
underline;}
..gssb_g {text-align: center; padding: 8px 0px 7px; position: relative;}
..gssb_h {font-size: 15px; height: 28px; margin: 0.2em;}
..gssb_i {background: rgb(213, 226, 255) none repeat scroll 0% 0%;}
..gss_ifl {visibility: hidden; padding-left: 5px;}
..gssb_i .gss_ifl {visibility: visible;}
a.gssb_j {font-size: 13px; color: rgb(51, 102, 204); text-decoration: none;=
line-height: 100%;}
a.gssb_j:hover {text-decoration: underline;}
..gssb_l {height: 1px; background-color: rgb(229, 229, 229);}
..gssb_m {color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat sc=
roll 0% 0%;}
#answer-thumbs-up-id.thumb_unchecked ,#answer-thumbs-down-id.thumb_unchecke=
d {fill: rgb(34, 34, 34); opacity: 0.1;}
#answer-thumbs-up-id.thumb_unchecked:hover ,#answer-thumbs-down-id.thumb_un=
checked:hover {fill: rgb(34, 34, 34); opacity: 0.4;}
#answer-thumbs-up-id.thumb_checked ,#answer-thumbs-down-id.thumb_checked {f=
ill: rgb(34, 34, 34); opacity: 1;}
#answer-thumbs-up-id.thumb_checked:hover ,#answer-thumbs-down-id.thumb_chec=
ked:hover {fill: rgb(34, 34, 34); opacity: 0.7;}
..gsar_a {padding: 0px;}
..gsar_b {overflow: hidden; text-overflow: ellipsis;}
..gsas_a {color: rgb(153, 153, 153); font-size: 12px; margin-left: 6px; whit=
e-space: nowrap;}
..gsas_b {color: rgb(51, 102, 204); font-size: 11px; margin-left: 10px; whit=
e-space: nowrap;}
..gsas_c {padding: 0px;}
..gsas_d {float: left; overflow: hidden; text-overflow: ellipsis; white-spac=
e: nowrap;}
..gsas_e {text-align: right; white-space: normal; height: 22px;}
..gsan_a {color: rgb(119, 119, 119); overflow: hidden; text-overflow: ellips=
is;}
..gstq_a {height: 18px; line-height: normal; overflow: hidden; text-overflow=
: ellipsis; max-width: 700px;}
..gstq_b {margin-top: 5px;}
..gstq_c {color: rgb(119, 119, 119); font-size: 12px; margin-bottom: 2px;}
..gstq_d {margin-bottom: 7px; margin-top: 9px;}
..gstq_e {height: 0px;}
..gsas_c {padding: 0px;}
..gsas_d {float: left; overflow: hidden; text-overflow: ellipsis; white-spac=
e: nowrap;}
..gsfe_a {border-width: 1px; border-style: solid; border-color: rgb(160, 160=
, 160) rgb(185, 185, 185) rgb(185, 185, 185); -moz-border-top-colors: none;=
-moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-bord=
er-left-colors: none; border-image: none; box-shadow: 0px 1px 2px rgba(0, 0=
, 0, 0.1) inset;}
..gsfe_b {border: 1px solid rgb(77, 144, 254); outline: medium none; box-sha=
dow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset;}
..gsaq_a {padding: 0px;}
..gsaq_b {display: none; cursor: pointer; width: 14px; height: 14px; opacity=
: 0.4; background-image: url("//ssl.gstatic.com/ui/v1/icons/common/x_8px.pn=
g"); background-position: center center;}
..gssb_i .gsaq_b {display: block;}
..gsfs {font-size: 14px;}
#gbqfqwb {padding: 0px;}
..gsib_a {padding: 4px 8px 0px;}
#gbqfaa ,#gbqfab {z-index: 7;}
..gstt {width: 100%;}
..gssb_c {z-index: 995;}
..gssb_i > .gssb_a {border-left: 2px solid rgb(77, 144, 254); padding-left: =
5px;}
..gssb_e {background-color: rgb(255, 255, 255); border-width: 1px; border-st=
yle: solid; border-color: rgb(217, 217, 217) rgb(204, 204, 204) rgb(204, 20=
4, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; -moz=
-border-bottom-colors: none; -moz-border-left-colors: none; border-image: n=
one; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);}
..gssb_i {background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..gssb_l {margin: 7px 0px;}
..gssb_m {margin-bottom: 7px;}
..gscs_a {border: 0px none; left: 0px; position: absolute; top: 0px; width: =
100%;}
..gsbv_a {position: fixed; z-index: 997;}
..gsbv_b {border-right: 1px solid rgb(204, 204, 204); overflow: hidden;}
..gsbv_c {height: 26px; position: relative; width: 13px;}
..gsbv_d {border-width: 13px; border-style: solid; border-color: transparent=
rgb(204, 204, 204) transparent transparent; -moz-border-top-colors: none; =
-moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-borde=
r-left-colors: none; border-image: none; width: 0px; position: absolute; ma=
rgin-top: 8px; height: 0px;}
..gsbv_e {border-width: 13px; border-style: outset solid outset outset; bord=
er-color: transparent rgb(255, 255, 255) transparent transparent; -moz-bord=
er-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-col=
ors: none; -moz-border-left-colors: none; border-image: none; height: 0px; =
width: 0px; position: absolute; margin-top: 8px; left: 0px;}
..gsbv_g {text-decoration: none !important; font-size: 11px; font-weight: bo=
ld; text-align: center; white-space: nowrap; margin-right: 16px; height: 27=
px; line-height: 27px; min-width: 54px; outline: 0px none; padding: 8px; bo=
rder-radius: 2px;}
..gsbv_h {background-color: rgb(255, 255, 255); border: 1px solid rgb(204, 2=
04, 204); box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2); position: absolute; l=
eft: 25px;}
..gsbv_i {margin: 16px;}
..gsbv_j {color: rgb(102, 102, 102); margin: 16px; white-space: normal; widt=
h: 260px; font-size: 13px; line-height: 18px;}
a.gsbv_k ,a.gsbv_k:visited {color: rgb(255, 255, 255); background-color: rg=
b(77, 144, 254); border: 1px solid rgb(48, 121, 237);}
..gsbv_k {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb=
(77, 144, 254), rgb(71, 135, 237)) repeat scroll 0% 0%;}
..gsbv_k:hover {background-color: rgb(53, 122, 232); border: 1px solid rgb(4=
7, 91, 183);}
..gsbv_k:hover {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top=
, rgb(77, 144, 254), rgb(53, 122, 232)) repeat scroll 0% 0%;}
a.gsbv_l ,a.gsbv_l:visited {color: rgb(68, 68, 68); background-color: rgb(2=
45, 245, 245); border: 1px solid rgb(220, 220, 220);}
..gsbv_l {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb=
(245, 245, 245), rgb(241, 241, 241)) repeat scroll 0% 0%;}
..gsbv_l:hover {color: rgb(51, 51, 51); background-color: rgb(248, 248, 248)=
; border: 1px solid rgb(198, 198, 198);}
..gsbv_l:hover {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top=
, rgb(248, 248, 248), rgb(241, 241, 241)) repeat scroll 0% 0%;}
..gsom_a {background-color: rgb(249, 237, 190); font-size: 13px; line-height=
: 32px; text-align: center; font-weight: bold; border-bottom: 1px solid rgb=
(229, 229, 229); margin: 0px -7px;}
..F0XO1GC-r-d {padding-right: 144px; white-space: nowrap;}
..F0XO1GC-r-e {margin: 19px 16px 0px 0px; white-space: nowrap; min-width: 38=
4px; max-width: 512px; width: 100%; display: inline-block; position: relati=
ve; height: 29px; line-height: 27px; vertical-align: top;}
..F0XO1GC-b-O .F0XO1GC-r-e {margin-top: 7px;}
..F0XO1GC-r-e input[type=3D"text"] {position: absolute; left: 0px; right: 0p=
x; width: 100%;}
..F0XO1GC-r-b {max-height: 250px; overflow-y: auto; overflow-x: hidden; whit=
e-space: nowrap;}
..F0XO1GC-r-b .F0XO1GC-r-c {padding-left: 20px;}
..suggestPopupContent {cursor: pointer;}
..suggestPopupContent .F0XO1GC-r-g {margin-left: 5px; color: rgb(0, 0, 0);}
..F0XO1GC-r-i {position: relative;}
..F0XO1GC-r-h {position: relative; float: left; margin: 8px 6px 0px 0px;}
..F0XO1GC-r-f {margin-top: 19px; vertical-align: top;}
..F0XO1GC-b-O .F0XO1GC-r-f {margin-top: 7px;}
..F0XO1GC-r-f img {opacity: 1 !important;}
..F0XO1GC-r-a {cursor: pointer; position: absolute; right: 2px; text-align: =
center;}
..F0XO1GC-r-a img {opacity: 0.667; margin: 0px 6px 2px;}
..F0XO1GC-r-a:hover img {opacity: 1;}
..F0XO1GC-p-U {position: relative; margin-left: 12px;}
..F0XO1GC-p-c {width: 100%;}
..F0XO1GC-p-c .goog-button-base {margin-right: 4px;}
..F0XO1GC-p-c .goog-button-base-collapse-right {margin-right: 0px;}
..F0XO1GC-p-c .goog-button-base {vertical-align: middle;}
..F0XO1GC-p-q {padding: 0px 0px 5px;}
..F0XO1GC-p-r {position: relative; border-bottom: 1px solid rgb(235, 235, 23=
5); line-height: 27px;}
..embed .F0XO1GC-p-r.F0XO1GC-p-t {margin: 16px 30px 0px 0px; padding: 0px 0p=
x 4px 12px !important;}
..F0XO1GC-p-r.F0XO1GC-p-t {margin: 16px 44px 0px 0px; padding: 0px 0px 4px !=
important;}
..chrome-theme .F0XO1GC-p-r.F0XO1GC-p-t {margin: 16px 0px 0px !important;}
..F0XO1GC-b-N .F0XO1GC-p-r.F0XO1GC-p-t ,body .F0XO1GC-p-r.F0XO1GC-p-t {margi=
n: 8px 28px 0px 0px;}
..F0XO1GC-b-O .F0XO1GC-p-r.F0XO1GC-p-t {margin: 4px 16px 0px 0px;}
..F0XO1GC-b-dc .F0XO1GC-p-r.F0XO1GC-p-t ,body .F0XO1GC-p-r.F0XO1GC-p-t {marg=
in-right: 30px;}
..F0XO1GC-p-r.F0XO1GC-p-t .jfk-button-standard ,.F0XO1GC-p-r.F0XO1GC-p-t .jf=
k-button-default {height: 19px; line-height: 19px; position: relative; vert=
ical-align: top;}
..F0XO1GC-p-r.F0XO1GC-p-t .jfk-button-action {height: 19px; line-height: 19p=
x; position: relative; vertical-align: top; top: -4px;}
..F0XO1GC-p-s {overflow: hidden;}
..F0XO1GC-p-U > img {margin: 0px 0px 0px 8px;}
..F0XO1GC-p-P ,.F0XO1GC-p-t .F0XO1GC-p-x a ,.F0XO1GC-p-t .F0XO1GC-p-x span {=
white-space: nowrap; text-align: right; color: rgb(102, 102, 102);}
..F0XO1GC-p-F {text-align: center; padding-top: 25px; display: block;}
..F0XO1GC-p-V td {height: 20px; vertical-align: middle; border-bottom: 1px s=
olid rgb(221, 221, 221); cursor: pointer;}
..F0XO1GC-p-o td {border-bottom: 1px solid rgb(221, 221, 221); cursor: point=
er;}
..F0XO1GC-p-Y .F0XO1GC-p-B {font-weight: bold;}
..F0XO1GC-p-B {text-align: right; color: rgb(51, 51, 51);}
a.F0XO1GC-p-Q ,a.F0XO1GC-p-Q:visited {color: rgb(34, 34, 34); text-decorati=
on: none;}
..F0XO1GC-p-Y a.F0XO1GC-p-Q ,.F0XO1GC-p-Y a.F0XO1GC-p-Q:visited {color: rgb(=
34, 34, 34); font-weight: bold;}
..F0XO1GC-p-V td:first-child ,.F0XO1GC-p-o td:first-child {border-left: 2px =
solid transparent;}
..F0XO1GC-p-V tr.selected td:first-child ,.F0XO1GC-p-o tr.selected td:first-=
child {border-left: 2px solid rgb(77, 144, 240);}
..F0XO1GC-p-V tr ,.F0XO1GC-p-o tr {background-color: rgba(255, 255, 255, 0.8=
);}
tr.F0XO1GC-p-M {background-color: rgba(0, 0, 0, 0.06);}
..F0XO1GC-p-X tr.F0XO1GC-p-M {background-color: rgba(0, 0, 0, 0.04);}
..F0XO1GC-p-K {text-align: left; color: rgb(51, 51, 51);}
..F0XO1GC-p-t .F0XO1GC-p-K {padding-right: 30px;}
..F0XO1GC-b-N .F0XO1GC-p-t .F0XO1GC-p-K ,body .F0XO1GC-p-t .F0XO1GC-p-K {pad=
ding-right: 15px;}
..F0XO1GC-b-O .F0XO1GC-p-t .F0XO1GC-p-K {padding-right: 5px;}
..F0XO1GC-b-dc .F0XO1GC-p-t .F0XO1GC-p-K ,body .F0XO1GC-p-t .F0XO1GC-p-K {pa=
dding-right: 15px;}
..F0XO1GC-p-V {width: 100%; border-collapse: collapse;}
..F0XO1GC-p-V td {white-space: nowrap; overflow: hidden; padding: 8px;}
..F0XO1GC-b-N .F0XO1GC-p-V td ,body .F0XO1GC-p-V td {padding: 6px;}
..F0XO1GC-b-O .F0XO1GC-p-V td {padding: 2px;}
..F0XO1GC-p-o {table-layout: fixed; width: 100%; border-collapse: collapse;}
..F0XO1GC-p-W {margin: 0px 3px; vertical-align: middle;}
td.F0XO1GC-p-k {vertical-align: middle; cursor: default;}
..F0XO1GC-p-o .F0XO1GC-p-j {margin-left: 8px;}
..F0XO1GC-p-l {width: 0px;}
..F0XO1GC-p-o .F0XO1GC-p-l {width: 32px;}
..F0XO1GC-p-R {width: 70%;}
..F0XO1GC-p-t .F0XO1GC-p-R {width: 100%;}
..F0XO1GC-p-D .F0XO1GC-p-R {width: 60%;}
..F0XO1GC-p-N {width: 25%;}
..F0XO1GC-p-L {width: 0px;}
..F0XO1GC-p-g {width: 30%;}
..F0XO1GC-p-C {width: 0px;}
..F0XO1GC-p-D .F0XO1GC-p-C {width: 15%;}
..F0XO1GC-p-V .F0XO1GC-p-O {vertical-align: middle;}
..F0XO1GC-p-o .F0XO1GC-p-O {vertical-align: top; position: relative; top: -5=
px;}
..F0XO1GC-p-r .F0XO1GC-p-O {padding: 0px 8px 2px 0px !important;}
..F0XO1GC-p-m {position: relative;}
..F0XO1GC-p-A {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAASklEQVR4Xu3OMQoAIBTDUO+Ph3aVB62bIBjIIKR8x/g8ydz0fTJi5LAZMXLYvI=
uX/U0zYuSwGTFy2LyLl/1NM2LksBkxctj8vMYCmbJE6ecHDvkAAAAASUVORK5CYII=3D") no-r=
epeat scroll 0px 0px;}
..F0XO1GC-p-z {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAAJ0lEQVR4Xu3DgQUAAAzAsJ3e03dEKWMhM+8kxBZiC7GF2EJsIb5rFq8dLQEuSH=
ONAAAAAElFTkSuQmCC") no-repeat scroll 0px 0px;}
..F0XO1GC-p-d {margin-right: 2px; margin-left: 4px; vertical-align: middle; =
position: relative;}
..F0XO1GC-p-d img {vertical-align: middle;}
..F0XO1GC-p-Z {border-bottom: 1px solid rgb(221, 221, 221);}
..F0XO1GC-p-a {color: rgb(102, 102, 102) !important; font-weight: normal !im=
portant;}
..F0XO1GC-p-b {margin-left: 5px; margin-right: 2px;}
..F0XO1GC-p-n {color: rgb(119, 119, 187) !important; margin-left: 4px; white=
-space: nowrap; vertical-align: middle;}
..F0XO1GC-p-y {min-width: 260px;}
..F0XO1GC-p-S {padding-top: 16px;}
..F0XO1GC-p-G {border-bottom: 1px solid rgb(235, 235, 235); text-align: cent=
er;}
..F0XO1GC-p-G > div {margin: 4px; text-align: center; padding: 7px 16px; bac=
kground-color: rgb(249, 237, 190); border: 1px solid rgb(240, 195, 109); di=
splay: inline-block; border-radius: 2px; font-size: 11px; line-height: 16px=
; cursor: pointer;}
..F0XO1GC-p-G a {text-decoration: none; cursor: pointer; color: rgb(51, 51, =
51);}
..F0XO1GC-p-G a:hover {color: rgb(32, 32, 32);}
..F0XO1GC-p-e {position: relative; min-width: 100px;}
..F0XO1GC-p-f {overflow: hidden; position: absolute; top: -9px; left: 0px; r=
ight: 8px; text-overflow: ellipsis; padding: 1px 8px; border-left: 1px dott=
ed rgb(221, 221, 221);}
..F0XO1GC-p-I {display: inline-block; color: rgb(153, 153, 153); margin-left=
: 4px;}
..F0XO1GC-p-h {margin-left: 4px;}
..F0XO1GC-p-J {display: inline-block;}
..F0XO1GC-p-i {border-top: 1px solid rgb(235, 235, 235); padding-top: 8px; m=
argin-top: 8px;}
..F0XO1GC-p-H {top: 3px; line-height: 17px; vertical-align: baseline;}
..F0XO1GC-p-H > img {opacity: 0.667;}
..F0XO1GC-p-H > img:hover {opacity: 1;}
..F0XO1GC-p-x {float: right; padding-right: 28px;}
..F0XO1GC-p-t .F0XO1GC-p-x {float: none; padding-right: 0px; display: inline=
-block;}
..F0XO1GC-p-t .F0XO1GC-p-x > div {padding-right: 8px;}
..chrome-theme .F0XO1GC-p-U {margin-left: 0px;}
..chrome-theme .F0XO1GC-p-Z {display: none;}
..F0XO1GC-p-E {border-top: 1px solid rgb(235, 235, 235); padding-top: 10px;}
..F0XO1GC-p-E h3 {padding-bottom: 10px;}
..F0XO1GC-p-E .jfk-button-action {margin-top: 10px;}
..F0XO1GC-ab-h {float: left;}
..F0XO1GC-ab-c {display: inline-block;}
..F0XO1GC-ab-a {float: right; display: inline-block;}
..F0XO1GC-ab-f {font-size: 18px;}
..F0XO1GC-ab-g {color: rgb(102, 102, 102);}
..F0XO1GC-ab-f ,.F0XO1GC-ab-g ,.F0XO1GC-ab-e {margin-right: 8px;}
..F0XO1GC-ab-a ,.F0XO1GC-ab-a:visited {color: rgb(17, 85, 204); line-height:=
27px;}
..F0XO1GC-ab-b {line-height: 27px;}
..F0XO1GC-ab-k {vertical-align: baseline; display: inline-block;}
..F0XO1GC-ab-k div {line-height: 15px !important;}
..F0XO1GC-ab-j {height: 15px; vertical-align: baseline;}
..F0XO1GC-ab-i {position: relative; top: -1px;}
..F0XO1GC-ab-l {line-height: 17px;}
..F0XO1GC-ab-m {float: right;}
..F0XO1GC-ab-n {line-height: 17px; vertical-align: baseline;}
..F0XO1GC-ab-d {clear: both;}
..F0XO1GC-H-d {display: inline-block; height: 13px; padding: 5px; text-align=
: center; width: 13px; cursor: pointer;}
..F0XO1GC-H-d .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star2.png") no-repeat scroll 0% 0%; height: 13px; width: 13p=
x;}
..F0XO1GC-H-b .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star2.png") no-repeat scroll 0% 0%;}
..F0XO1GC-H-a .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star-lit.png") no-repeat scroll 0% 0%;}
..F0XO1GC-x-a .F0XO1GC-x-d {float: left;}
..F0XO1GC-x-a .F0XO1GC-x-e {float: right;}
..F0XO1GC-x-a .F0XO1GC-x-e td:last-child div {margin-right: 0px;}
..F0XO1GC-x-b {line-height: 24px; margin-bottom: 14px;}
..F0XO1GC-b-O .F0XO1GC-x-b {line-height: 17px; margin-bottom: 8px;}
..jfk-button-action {border: 1px solid rgb(48, 121, 237); color: rgb(255, 25=
5, 255); background-color: rgb(77, 144, 254); background-image: -moz-linear=
-gradient(center top , rgb(77, 144, 254), rgb(71, 135, 237));}
..chrome-theme .jfk-button-action {background-color: rgb(3, 112, 234); backg=
round-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 0%, rgb(3, 112, =
234) 100%); border: 1px solid rgb(7, 107, 210); text-shadow: 1px 1px 1px rg=
b(7, 107, 210);}
..jfk-button-action:hover {color: rgb(255, 255, 255); border: 1px solid rgb(=
47, 91, 183); background-color: rgb(53, 122, 232); background-image: -moz-l=
inear-gradient(center top , rgb(77, 144, 254), rgb(53, 122, 232));}
..chrome-theme .jfk-button-action:hover {background-color: rgb(3, 112, 234);=
background-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 30%, rgb(3=
, 112, 234) 100%); border: 1px solid rgb(7, 107, 210);}
..jfk-button-action:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset=
;}
..jfk-button-action:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) in=
set; outline: 0px none rgba(0, 0, 0, 0);}
..chrome-theme .jfk-button-action:focus {box-shadow: none; outline: medium n=
one !important; border: 1px solid rgb(6, 73, 144);}
..F0XO1GC-G-a {border: 1px solid transparent; color: rgb(255, 255, 255); bac=
kground-color: rgb(209, 72, 54); background-image: -moz-linear-gradient(cen=
ter top , rgb(221, 75, 57), rgb(209, 72, 54)); text-shadow: 0px 1px rgba(0,=
0, 0, 0.1); text-transform: uppercase;}
..chrome-theme .F0XO1GC-G-a {background-color: rgb(3, 112, 234); background-=
image: -webkit-linear-gradient(top, rgb(0, 141, 253) 0%, rgb(3, 112, 234) 1=
00%); border: 1px solid rgb(7, 107, 210); text-shadow: 1px 1px 1px rgb(7, 1=
07, 210); text-transform: none;}
..F0XO1GC-G-a:hover {border-width: 1px; border-style: solid; border-color: r=
gb(176, 40, 26) rgb(176, 40, 26) rgb(175, 48, 31); -moz-border-top-colors: =
none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz=
-border-left-colors: none; border-image: none; background-color: rgb(197, 5=
5, 39); background-image: -moz-linear-gradient(center top , rgb(221, 75, 57=
), rgb(197, 55, 39)); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.2);}
..F0XO1GC-G-a:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset; o=
utline: 0px none rgba(0, 0, 0, 0);}
..chrome-theme .F0XO1GC-G-a:focus {box-shadow: none; outline: medium none !i=
mportant; border: 1px solid rgb(6, 73, 144);}
..F0XO1GC-G-a:active {background-color: rgb(176, 40, 26); border: 1px solid =
rgb(153, 42, 27); background-image: -moz-linear-gradient(center top , rgb(2=
21, 75, 57), rgb(176, 40, 26)); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) =
inset;}
..chrome-theme .F0XO1GC-G-a:hover ,.chrome-theme .F0XO1GC-G-a:active {backgr=
ound-color: rgb(3, 112, 234); border: 1px solid rgb(7, 107, 210); backgroun=
d-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 30%, rgb(3, 112, 234=
) 100%);}
..F0XO1GC-G-a.F0XO1GC-n-b {background: rgb(209, 72, 54) none repeat scroll 0=
% 0%;}
..gux-menu-button {background: rgba(0, 0, 0, 0) url("data:image/png;base64,i=
VBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ=
bWFnZVJlYWR5ccllPAAAAwBQTFRFZmZm////AgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCws=
LDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh=
4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4uLy8vMDAwM=
TExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUFBQkJCQ0ND=
RERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVFRUVVVVVlZ=
WV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ2dnaGhoaW=
lpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5enp6e3t7f=
Hx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIyMjY2Njo6O=
j4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5+foKCgoaG=
hoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxsrKys7OztL=
S0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTExcXFxsbGx=
8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19fX2NjY2dnZ=
2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6urq6+vr7Oz=
s7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+//=
//AADF2QAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGJ0GAQyMYAokDqLA8mlI6gACDAC8p=
AaCn/ezogAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padding-right=
: 12px; text-align: left;}
..gux-menu-button-disabled {background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQB=
BZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFmZmZ////AgICAwMDBAQEBQUFBgYGBwcHCAgICQ=
kJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbH=
BwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4u=
Ly8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUF=
BQkJCQ0NDRERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVF=
RUVVVVVlZWV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ=
2dnaGhoaWlpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5=
enp6e3t7fHx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIy=
MjY2Njo6Oj4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5=
+foKCgoaGhoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxs=
rKys7OztLS0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTE=
xcXFxsbGx8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19f=
X2NjY2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6u=
rq6+vr7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/=
f39/v7+////uBOGsAAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGD0TAhgYwRRIHESB5Wci=
qQMIMAAZIwmyA+lVoQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padd=
ing-right: 12px;}
..gux-menu-button-selected {background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQB=
BZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFZmZm////AgICAwMDBAQEBQUFBgYGBwcHCAgICQ=
kJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbH=
BwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4u=
Ly8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUF=
BQkJCQ0NDRERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVF=
RUVVVVVlZWV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ=
2dnaGhoaWlpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5=
enp6e3t7fHx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIy=
MjY2Njo6Oj4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5=
+foKCgoaGhoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxs=
rKys7OztLS0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTE=
xcXFxsbGx8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19f=
X2NjY2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6u=
rq6+vr7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/=
f39/v7+////AADF2QAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGP0fAhgYwRRIHESB5f8j=
qQMIMADSAxASsJSVyQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padd=
ing-right: 12px;}
..goog-inline-block {position: relative; display: inline-block;}
..F0XO1GC-L-f {text-indent: 32px;}
..F0XO1GC-L-d {text-indent: 17px;}
..F0XO1GC-L-e li {line-height: 19px; white-space: nowrap;}
..F0XO1GC-L-e li > div {cursor: pointer; overflow: hidden; text-overflow: el=
lipsis; padding: 4px 0px 4px 8px;}
..F0XO1GC-L-e li > div:hover {background-color: rgb(238, 238, 238);}
..F0XO1GC-L-e ul {list-style: outside none none; margin-left: -12px; margin-=
top: 0px;}
..F0XO1GC-L-e {list-style: outside none none;}
..F0XO1GC-L-e .F0XO1GC-L-g {color: rgb(66, 133, 244); font-weight: bold;}
..F0XO1GC-L-b {outline-style: none; padding: 5px; min-width: 400px;}
..F0XO1GC-L-c.F0XO1GC-L-b {padding: 0px;}
..F0XO1GC-L-c.F0XO1GC-L-b tr:first-child .gwt-Label {border-bottom: 1px soli=
d rgb(204, 204, 204); color: rgb(102, 102, 102); padding: 18px 15px 15px;}
..F0XO1GC-L-b .F0XO1GC-L-a {position: relative; left: 5px;}
..F0XO1GC-L-c.F0XO1GC-L-b .F0XO1GC-L-a {left: 0px; max-height: 400px; paddin=
g-left: 15px;}
..F0XO1GC-L-c.F0XO1GC-L-b tr:last-child .F0XO1GC-L-h {border-top: 1px solid =
rgb(204, 204, 204); padding: 15px;}
..F0XO1GC-F-a {background-color: rgba(255, 255, 255, 0.65); border: 1px soli=
d rgb(198, 198, 198); border-radius: 1px; height: 13px; margin: 0px 1px; ou=
tline: medium none; vertical-align: text-bottom; width: 13px; display: inli=
ne-block; position: relative;}
..F0XO1GC-F-h {display: block; position: absolute; width: 15px; height: 15px=
; top: -2px; left: 1px;}
..F0XO1GC-F-c .F0XO1GC-F-h {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/menu/checkmark.png") no-repeat scroll -5px -3px;}
..F0XO1GC-F-k .F0XO1GC-F-h {opacity: 0.3;}
..F0XO1GC-F-b {background-color: rgb(235, 235, 235);}
..F0XO1GC-F-f {border: 1px solid rgb(102, 102, 102); box-shadow: 0px 1px 1px=
rgba(0, 0, 0, 0.1) inset;}
..F0XO1GC-F-e {border: 1px solid rgb(77, 144, 254);}
..F0XO1GC-F-k .F0XO1GC-F-a {background-color: rgba(255, 255, 255, 0.45); bor=
der: 1px solid rgb(241, 241, 241);}
..F0XO1GC-F-g .F0XO1GC-F-h {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/menu/checkmark-partial.png") no-repeat scroll -5px -3px;}
..F0XO1GC-F-i {margin-left: 5px;}
..F0XO1GC-F-k .F0XO1GC-F-i {color: rgb(184, 184, 184);}
..F0XO1GC-F-j {cursor: default; outline: medium none; line-height: 24px;}
..F0XO1GC-cc-a {padding-bottom: 7px;}
..F0XO1GC-cc-a input[type=3D"text"] {width: 75px;}
..F0XO1GC-V-a {margin: 0px 1px; vertical-align: text-bottom; display: inline=
-block; position: relative; outline: medium none;}
..F0XO1GC-V-h {background: rgba(255, 255, 255, 0) none repeat scroll 0% 0%; =
border: 1px solid rgb(198, 198, 198); border-radius: 50%; box-sizing: borde=
r-box; height: 15px; margin: 0px; outline: medium none; text-align: left; w=
idth: 15px; display: block;}
..F0XO1GC-V-c .F0XO1GC-V-h {background: rgba(255, 255, 255, 0) none repeat s=
croll 0% 0%;}
..F0XO1GC-V-c .F0XO1GC-V-h::after {background: rgb(96, 96, 96) none repeat s=
croll 0% 0%; border-radius: 50%; content: ""; display: block; height: 7px; =
left: 3px; position: relative; top: 3px; width: 7px;}
..F0XO1GC-V-b .F0XO1GC-V-h {background: rgb(235, 235, 235) none repeat scrol=
l 0% 0%; border-color: rgb(198, 198, 198);}
..F0XO1GC-V-f .F0XO1GC-V-h {border-color: rgb(102, 102, 102); box-shadow: 0p=
x 1px 1px rgba(0, 0, 0, 0.1) inset;}
..F0XO1GC-V-e .F0XO1GC-V-h {border: 1px solid rgb(77, 144, 254); background:=
rgba(255, 255, 255, 0) none repeat scroll 0% 0%;}
..F0XO1GC-V-e.F0XO1GC-V-c .F0XO1GC-V-h {background: rgba(255, 255, 255, 0) n=
one repeat scroll 0% 0%;}
..F0XO1GC-V-k .F0XO1GC-V-h {border: 1px solid rgb(241, 241, 241); background=
: rgba(255, 255, 255, 0) none repeat scroll 0% 0%;}
..F0XO1GC-V-k.F0XO1GC-V-c .F0XO1GC-V-h {background: rgba(255, 255, 255, 0) n=
one repeat scroll 0% 0%;}
..F0XO1GC-V-i {margin-left: 5px;}
..F0XO1GC-V-k .F0XO1GC-V-i {color: rgb(184, 184, 184);}
..F0XO1GC-V-j {cursor: default; outline: medium none; line-height: 24px;}
..F0XO1GC-Ub-c > div {float: left;}
..F0XO1GC-Ub-c > div + div {margin-left: 4px;}
..F0XO1GC-Ub-a {color: rgb(153, 153, 153);}
..F0XO1GC-Ub-b {display: block; clear: both; color: rgb(153, 153, 153); font=
-size: 11px; line-height: 11px;}
..gux-confirm-panel-r1 {background-color: rgb(255, 238, 136); border-left: 1=
px solid rgb(255, 253, 240); border-right: 1px solid rgb(255, 253, 240); ma=
rgin: 0px 1px; padding-top: 1px;}
..gux-confirm-panel-r2 {background-color: rgb(255, 238, 136); border-left: 1=
px solid rgb(255, 253, 240); border-right: 1px solid rgb(255, 253, 240); pa=
dding-top: 1px;}
..gux-confirm-panel-c {background-color: rgb(255, 238, 136); padding: 2px 15=
px;}
..gux-confirm-panel-message {color: rgb(0, 0, 0); font-weight: bold;}
..F0XO1GC-rb-w {padding: 10px; position: relative; height: 34px;}
..F0XO1GC-b-N .F0XO1GC-rb-w ,body .F0XO1GC-rb-w {padding: 8px;}
..F0XO1GC-b-O .F0XO1GC-rb-w {padding: 4px;}
..F0XO1GC-rb-j .F0XO1GC-rb-w {height: 51px;}
..F0XO1GC-rb-w + .F0XO1GC-rb-w {border-top: medium none;}
..F0XO1GC-rb-h {position: absolute; top: 10px; bottom: 10px; left: 86px; rig=
ht: 114px;}
..F0XO1GC-p-w .F0XO1GC-b-Qb {font-size: 13px;}
..F0XO1GC-p-w .F0XO1GC-rb-h {right: 164px; left: 56px !important;}
..F0XO1GC-b-N .F0XO1GC-p-w .F0XO1GC-rb-h ,body .F0XO1GC-p-w .F0XO1GC-rb-h {r=
ight: 164px; left: 50px !important;}
..F0XO1GC-b-O .F0XO1GC-p-w .F0XO1GC-rb-h {right: 164px; left: 44px !importan=
t;}
..F0XO1GC-b-N .F0XO1GC-rb-h ,body .F0XO1GC-rb-h {top: 8px; bottom: 8px; left=
: 78px;}
..F0XO1GC-b-O .F0XO1GC-rb-h {top: 4px; bottom: 4px; left: 70px;}
..F0XO1GC-rb-q {position: absolute; top: 4px; left: 54px;}
..F0XO1GC-b-N .F0XO1GC-rb-q ,body .F0XO1GC-rb-q {top: 2px; left: 48px;}
..F0XO1GC-b-O .F0XO1GC-rb-q {top: 0px; left: 42px;}
..F0XO1GC-rb-e {position: absolute; left: 10px;}
..F0XO1GC-b-N .F0XO1GC-rb-e ,body .F0XO1GC-rb-e {left: 8px;}
..F0XO1GC-b-O .F0XO1GC-rb-e {left: 4px;}
..F0XO1GC-rb-p ,.F0XO1GC-rb-u ,.F0XO1GC-rb-c {position: absolute; overflow: =
hidden; left: 0px; right: 0px;}
..F0XO1GC-rb-u {top: -2px;}
..F0XO1GC-rb-c ,.F0XO1GC-rb-p {top: 17px; color: rgb(102, 102, 102); white-s=
pace: nowrap;}
..F0XO1GC-rb-j .F0XO1GC-rb-c {top: 34px;}
..F0XO1GC-rb-t {display: block; overflow: hidden; text-overflow: ellipsis; w=
hite-space: nowrap;}
..F0XO1GC-rb-s.F0XO1GC-rb-o {font-weight: normal;}
..F0XO1GC-rb-v {float: right; margin-left: 4px; margin-right: 8px;}
..F0XO1GC-p-X .F0XO1GC-rb-c {color: rgb(136, 136, 136); white-space: nowrap;=
}
..F0XO1GC-p-X .F0XO1GC-rb-u {right: 38px;}
..F0XO1GC-rb-d {overflow: hidden; text-overflow: ellipsis;}
..F0XO1GC-rb-d > span img {vertical-align: middle; position: relative; top: =
-2px;}
..F0XO1GC-rb-b {color: rgb(51, 51, 51); display: inline-block;}
..F0XO1GC-rb-n {position: absolute; top: 10px; bottom: 10px; right: 10px; wi=
dth: 90px; overflow: hidden; border-left: 1px dotted rgb(216, 216, 216); pa=
dding-left: 8px;}
..F0XO1GC-b-N .F0XO1GC-rb-n ,body .F0XO1GC-rb-n {top: 8px; bottom: 8px; righ=
t: 8px;}
..F0XO1GC-b-O .F0XO1GC-rb-n {top: 4px; bottom: 4px; right: 4px;}
..F0XO1GC-rb-f {position: absolute; top: 10px; bottom: 10px; right: 110px; o=
verflow: hidden; padding-left: 8px;}
..F0XO1GC-b-N .F0XO1GC-rb-f ,body .F0XO1GC-rb-f {top: 8px; bottom: 8px; righ=
t: 108px;}
..F0XO1GC-b-O .F0XO1GC-rb-f {top: 4px; bottom: 4px; right: 104px;}
..F0XO1GC-rb-g {position: absolute; bottom: 10px; right: 10px; padding-left:=
8px; color: rgb(136, 136, 136);}
..F0XO1GC-b-N .F0XO1GC-rb-g ,body .F0XO1GC-rb-g {bottom: 8px; right: 8px;}
..F0XO1GC-b-O .F0XO1GC-rb-g {bottom: 4px; right: 4px;}
..F0XO1GC-rb-y {width: 16px; height: 16px; overflow: hidden;}
..F0XO1GC-rb-x {width: 16px; height: 16px; overflow: hidden; position: absol=
ute; left: 58px; top: 28px;}
..F0XO1GC-b-N .F0XO1GC-rb-x ,body .F0XO1GC-rb-x {left: 52px; top: 26px;}
..F0XO1GC-b-O .F0XO1GC-rb-x {left: 46px; top: 22px;}
..F0XO1GC-rb-r::before {content: " - ";}
..F0XO1GC-rb-z {font-weight: normal; margin-left: 4px;}
..F0XO1GC-rb-k {padding: 8px; position: relative;}
..F0XO1GC-b-N .F0XO1GC-rb-k ,body .F0XO1GC-rb-k {padding: 6px;}
..F0XO1GC-b-O .F0XO1GC-rb-k {padding: 4px;}
..F0XO1GC-rb-a {display: block; position: absolute; left: 58px;}
..F0XO1GC-rb-l {color: rgb(102, 102, 102); display: inline; margin-left: 78p=
x;}
..F0XO1GC-rb-m {color: rgb(170, 170, 170); display: inline;}
..F0XO1GC-nc-b {color: rgb(119, 119, 119); text-align: center; padding: 4px;=
}
..F0XO1GC-nc-a {color: rgb(5, 71, 192);}
..F0XO1GC-jb-c {display: inline; white-space: nowrap; padding: 0px 2px;}
..F0XO1GC-jb-a {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-jb-b {font-size: 13px;}
..F0XO1GC-mb-k {height: 5px; width: 100%; background-color: rgb(187, 204, 25=
5);}
..F0XO1GC-mb-q {overflow: hidden;}
..F0XO1GC-mb-J {padding: 5px; overflow: hidden;}
..F0XO1GC-mb-x {border-bottom: 1px solid rgb(235, 235, 235); padding-top: 8p=
x; padding-bottom: 8px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-y ,body .F0XO1GC-mb-y {padding-right: 20px;}
..F0XO1GC-mb-z {float: right;}
..F0XO1GC-mb-Z {display: inline;}
..F0XO1GC-mb-u {white-space: nowrap; font-weight: normal; float: right; font=
-size: 13px; color: rgb(102, 102, 102);}
..F0XO1GC-mb-v ,.F0XO1GC-mb-v:hover ,.F0XO1GC-mb-v:visited {text-decoration:=
none; color: rgb(136, 136, 136); cursor: default;}
..chrome-theme .F0XO1GC-mb-u {display: none;}
..F0XO1GC-mb-M {margin-right: 16px;}
..F0XO1GC-mb-cb {font-weight: bold;}
..F0XO1GC-nb-W.F0XO1GC-mb-o {border-top: 1px solid rgb(221, 221, 221);}
..F0XO1GC-nb-W.F0XO1GC-mb-l {border-bottom: 1px solid rgb(221, 221, 221);}
..F0XO1GC-mb-N ,.F0XO1GC-mb-P {padding-bottom: 5px; min-width: 100%;}
..F0XO1GC-mb-K {padding: 5px;}
..F0XO1GC-mb-Y {font-size: 18px;}
..F0XO1GC-mb-bb {font-size: 18px; background-color: rgb(235, 238, 248);}
..F0XO1GC-mb-V {white-space: nowrap;}
..F0XO1GC-mb-ab .F0XO1GC-mb-V ,body .F0XO1GC-mb-V {display: inline-block; ve=
rtical-align: baseline; margin-top: 4px;}
..F0XO1GC-mb-n {color: rgb(34, 34, 34); font-weight: normal;}
..F0XO1GC-mb-fb {vertical-align: middle; margin-right: 1.5em;}
..F0XO1GC-mb-eb {color: black; text-decoration: none; cursor: default; font-=
weight: bold;}
..F0XO1GC-mb-gb {color: rgb(34, 0, 204); cursor: pointer; font-weight: bold;=
}
..F0XO1GC-mb-db {color: rgb(34, 0, 204); cursor: pointer; white-space: nowra=
p; display: inline-block; vertical-align: bottom;}
..F0XO1GC-mb-ab .F0XO1GC-mb-db ,body .F0XO1GC-mb-db {position: relative; top=
: 1px;}
..F0XO1GC-mb-db span {margin-right: 2px;}
..F0XO1GC-mb-db img {opacity: 0.667;}
..F0XO1GC-mb-db img:hover {opacity: 1;}
..F0XO1GC-mb-A ,.F0XO1GC-mb-E {position: relative;}
..F0XO1GC-mb-E > .F0XO1GC-nb-W {margin-top: 20px;}
..F0XO1GC-mb-E > .F0XO1GC-nb-v {margin-top: 2px;}
..F0XO1GC-mb-C {padding-left: 20px; padding-top: 0px; margin-top: 2px;}
..F0XO1GC-mb-B {position: absolute; top: 1px; left: 10px; cursor: pointer;}
..F0XO1GC-mb-W {display: inline-block; position: relative;}
..F0XO1GC-mb-W .gwt-TabBarItem {cursor: pointer; font-weight: normal; positi=
on: relative; top: 1px; padding: 5px 10px; margin: 0px 3px; outline: medium=
none; background-color: rgb(245, 245, 245); border: 1px solid rgb(245, 245=
, 245);}
..F0XO1GC-mb-W .gwt-TabBarItem-selected {color: rgb(0, 0, 0); text-decoratio=
n: none; cursor: default; font-weight: bold; background-color: rgb(255, 255=
, 255); border-width: 1px; border-style: solid; border-color: rgb(235, 235,=
235) rgb(235, 235, 235) rgb(255, 255, 255); -moz-border-top-colors: none; =
-moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-borde=
r-left-colors: none; border-image: none;}
..F0XO1GC-mb-I {width: 100%;}
..F0XO1GC-mb-Q {margin: 16px 0px; border-bottom: 1px solid rgb(235, 235, 235=
);}
..F0XO1GC-mb-L {margin: 0px 3px; vertical-align: middle;}
..F0XO1GC-mb-S {padding: 5px;}
..F0XO1GC-mb-R {padding-bottom: 10px;}
..F0XO1GC-mb-U {font-size: 14px; font-weight: bold;}
..F0XO1GC-mb-T {font-weight: bold;}
..F0XO1GC-mb-a {position: relative; border: 1px solid rgb(235, 235, 235); di=
splay: inline-block; margin: 5px; padding: 5px 0px 0px 5px;}
..F0XO1GC-mb-b {position: absolute; color: rgb(102, 102, 102); left: 5px; bo=
ttom: 5px;}
..F0XO1GC-mb-r {margin-left: 10px;}
..F0XO1GC-mb-j {font-weight: bold; text-decoration: underline; cursor: point=
er;}
..F0XO1GC-mb-i {margin: 0px 5px; position: relative; border: 2px solid rgb(2=
04, 204, 204); padding: 2px 2px 2px 8px; line-height: 1.5em; background-col=
or: rgb(255, 255, 255);}
..F0XO1GC-mb-H {margin-left: 18px; position: relative;}
..F0XO1GC-mb-G {position: relative;}
..F0XO1GC-mb-F {position: absolute; top: 0px; left: 0px; cursor: pointer;}
..F0XO1GC-mb-p {padding: 8px 16px; color: rgb(34, 0, 204); background-color:=
rgb(255, 238, 136); border: 1px solid rgb(188, 188, 188); position: absolu=
te; bottom: 4px; right: 4px;}
..F0XO1GC-mb-p .F0XO1GC-mb-h {margin-left: 4px; color: rgb(128, 128, 128); c=
ursor: pointer; text-decoration: underline;}
..F0XO1GC-mb-O ,.F0XO1GC-mb-d {border-top: 1px solid rgb(221, 221, 221); pad=
ding: 4px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O ,body .F0XO1GC-mb-O {border: 0px none; padding=
: 4px 8px; background-color: rgb(77, 144, 254); border-radius: 10px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O.F0XO1GC-mb-d ,body .F0XO1GC-mb-O.F0XO1GC-mb-d =
{border-bottom: 0px none; padding: 4px 8px; background-color: rgb(61, 148, =
0); color: white; border-radius: 10px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O span ,.F0XO1GC-mb-ab .F0XO1GC-mb-d span ,body =
..F0XO1GC-mb-O span ,body .F0XO1GC-mb-d span {font-size: 16px; font-weight: =
normal;}
..F0XO1GC-mb-O span ,.F0XO1GC-mb-d span {font-weight: bold;}
..F0XO1GC-mb-O span {color: rgb(102, 102, 102);}
..F0XO1GC-mb-d span {color: rgb(75, 195, 87);}
..F0XO1GC-mb-ab .F0XO1GC-mb-O span ,.F0XO1GC-mb-ab .F0XO1GC-mb-d span ,body =
..F0XO1GC-mb-O span ,body .F0XO1GC-mb-d span {color: white;}
..F0XO1GC-mb-g ,.F0XO1GC-mb-t ,.F0XO1GC-mb-e {display: inline-block;}
..F0XO1GC-mb-t {vertical-align: top; overflow: hidden; padding-left: 8px !im=
portant;}
..F0XO1GC-mb-ab .F0XO1GC-mb-t ,body .F0XO1GC-mb-t {position: relative; top: =
1px;}
..F0XO1GC-mb-s {text-align: right; padding-bottom: 10px;}
..F0XO1GC-mb-c {text-align: center;}
..F0XO1GC-mb-w img {height: 20px;}
..F0XO1GC-kb-c {display: inline; white-space: nowrap; padding: 0px 2px;}
..F0XO1GC-kb-b {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-kb-a {font-size: 13px;}
..F0XO1GC-lb-a {color: rgb(102, 102, 102);}
..F0XO1GC-lb-e {border-radius: 2px; height: 22px;}
..F0XO1GC-lb-e > span {position: relative; top: -2px;}
..F0XO1GC-lb-d {z-index: 1021; padding: 10px; display: block; box-shadow: 0p=
x 2px 4px rgba(0, 0, 0, 0.2); outline: medium none; border: 1px solid rgb(2=
04, 204, 204);}
..F0XO1GC-lb-b {text-align: center; margin-bottom: 15px;}
..F0XO1GC-lb-c div {display: inline-block;}
..F0XO1GC-lb-c * {padding-left: 5px; padding-right: 5px;}
..F0XO1GC-nb-W {position: relative; border-top: 1px solid transparent; borde=
r-bottom: 1px solid transparent; border-left: 1px solid transparent; margin=
-right: 0px; padding-right: 0px;}
..F0XO1GC-nb-F {margin-right: 0px;}
..F0XO1GC-nb-X {border-left: 1px solid rgb(77, 144, 240);}
..F0XO1GC-nb-X:focus {outline: medium none;}
..F0XO1GC-nb-Y {padding: 4px 0px;}
..F0XO1GC-nb-V {padding-top: 4px; padding-bottom: 4px; background-position: =
0px 9px;}
..F0XO1GC-b-Nb .F0XO1GC-nb-Y ,.F0XO1GC-b-Nb .F0XO1GC-nb-V {background-color:=
rgb(255, 255, 255);}
..F0XO1GC-nb-O {width: 100%;}
..F0XO1GC-nb-P {color: rgb(34, 34, 34); line-height: normal;}
..F0XO1GC-nb-P p {line-height: normal; margin: 1em 0px;}
..F0XO1GC-nb-p {width: 34px; padding: 5px;}
..F0XO1GC-nb-kb {border-bottom: 1px solid rgb(221, 221, 221); margin-bottom:=
8px;}
..F0XO1GC-nb-lb {margin-bottom: 8px;}
..F0XO1GC-nb-v {margin-top: 0px;}
..F0XO1GC-nb-w {padding: 2px 5px;}
..F0XO1GC-nb-w .F0XO1GC-nb-O {padding-bottom: 1px;}
..F0XO1GC-nb-a {position: relative; padding: 4px 0px;}
..F0XO1GC-nb-b {padding-left: 5px; margin-left: 39px; margin-right: 0px !imp=
ortant;}
..F0XO1GC-nb-c {display: inline-block;}
..F0XO1GC-nb-a .F0XO1GC-nb-jb {margin-right: 1em;}
..F0XO1GC-nb-G {vertical-align: inherit;}
..F0XO1GC-nb-G span {line-height: 27px; vertical-align: inherit;}
..F0XO1GC-nb-G img {top: 0px; vertical-align: top;}
..F0XO1GC-nb-d {float: right; text-align: right; line-height: 27px;}
..F0XO1GC-nb-d a {text-decoration: none; color: rgb(102, 136, 221); cursor: =
pointer; vertical-align: middle;}
..F0XO1GC-nb-U {font-size: 11px; float: right; line-height: 27px;}
..F0XO1GC-nb-O table {width: 100%;}
..F0XO1GC-nb-O td {vertical-align: top;}
..F0XO1GC-nb-Q {white-space: nowrap;}
..F0XO1GC-nb-R {height: 1.5em; cursor: pointer; padding-right: 5px; padding-=
bottom: 5px; padding-left: 5px; white-space: nowrap; overflow: hidden; padd=
ing-top: 6px !important;}
..F0XO1GC-nb-T {text-align: right;}
..F0XO1GC-nb-N {padding: 5px; vertical-align: middle;}
..F0XO1GC-nb-ab {white-space: pre-wrap; margin: 0px;}
..F0XO1GC-nb-H {background-color: rgb(211, 222, 255); padding: 5px;}
..F0XO1GC-nb-H input {width: 100%; display: block; border: 1px solid rgb(102=
, 136, 238); margin: 5px 0px;}
..F0XO1GC-nb-m {color: rgb(51, 51, 51); text-decoration: none; cursor: defau=
lt;}
..F0XO1GC-nb-m img {opacity: 1;}
..F0XO1GC-nb-hb ,.F0XO1GC-nb-D {padding: 4px 5px 3px 0px; white-space: nowra=
p;}
..F0XO1GC-nb-L {display: inline-block; margin-top: 4px;}
..F0XO1GC-nb-ib {display: inline-block;}
..F0XO1GC-nb-I {margin-left: -8px;}
..F0XO1GC-nb-J {margin-right: 0px;}
..F0XO1GC-nb-M {display: inline-block;}
..F0XO1GC-nb-K {margin-left: 13px;}
..F0XO1GC-nb-o {border-top: 1px solid rgb(221, 221, 221); padding: 5px; marg=
in-top: 5px;}
..F0XO1GC-nb-eb {color: rgb(136, 136, 136); height: 1.5em; overflow: hidden;=
line-height: 1.5em;}
..F0XO1GC-nb-w .F0XO1GC-nb-Q {line-height: 1.5em;}
..F0XO1GC-nb-fb {padding: 0px 4px; vertical-align: top;}
..F0XO1GC-nb-w .F0XO1GC-nb-Q {float: right; padding-right: 2px; padding-left=
: 8px;}
..F0XO1GC-nb-w .F0XO1GC-nb-z {float: right;}
..F0XO1GC-nb-w {cursor: pointer;}
..F0XO1GC-nb-v .F0XO1GC-nb-a ,.F0XO1GC-nb-v .F0XO1GC-nb-l {display: none;}
..F0XO1GC-nb-Z .gux-confirm-panel {padding: 4px; text-align: center;}
..F0XO1GC-nb-Z .F0XO1GC-nb-eb {padding: 4px;}
..F0XO1GC-nb-C {padding: 4px; text-align: center; background-color: rgb(239,=
239, 239);}
..F0XO1GC-nb-S {border-bottom: 1px solid rgb(221, 221, 221); margin-bottom: =
8px; padding-bottom: 8px;}
..F0XO1GC-nb-t {font-weight: bold;}
..F0XO1GC-nb-r {width: 15%; font-weight: bold;}
..F0XO1GC-nb-q {width: 85%;}
..F0XO1GC-nb-s {font-size: 12px; white-space: nowrap; text-decoration: under=
line; color: rgb(119, 136, 204); cursor: pointer;}
..F0XO1GC-nb-y {margin-top: 8px; border-top: 1px solid rgb(221, 221, 221);}
..F0XO1GC-nb-n {vertical-align: middle; margin-right: 5px; float: left;}
..F0XO1GC-nb-x .F0XO1GC-nb-gb ,body .F0XO1GC-nb-gb {float: left; margin: 0px=
10px;}
..F0XO1GC-nb-w .F0XO1GC-nb-gb ,.F0XO1GC-nb-x .F0XO1GC-nb-gb ,body .F0XO1GC-n=
b-gb {position: relative; top: -4px;}
..F0XO1GC-nb-e {float: right; white-space: nowrap; margin-top: 5px !importan=
t;}
..F0XO1GC-nb-i {display: inline-block; white-space: nowrap; text-align: cent=
er; height: 27px;}
..F0XO1GC-nb-f {padding: 0px;}
..F0XO1GC-nb-k {min-width: 0px; width: 13px; height: 27px; margin-right: 0px=
;}
..F0XO1GC-nb-k .F0XO1GC-k-b {margin-left: 0px;}
..F0XO1GC-nb-g span {margin-left: 24px; margin-right: 4px;}
..F0XO1GC-nb-g img {position: absolute; top: 4px; left: 12px;}
..F0XO1GC-nb-bb {display: inline-block;}
..chrome-theme .F0XO1GC-nb-P {color: rgb(119, 119, 119);}
..chrome-theme .F0XO1GC-nb-P a ,.chrome-theme .F0XO1GC-nb-P a:visited {color=
: rgb(0, 0, 0) !important; font-weight: 600 !important; text-decoration: no=
ne !important;}
..chrome-theme .F0XO1GC-nb-P a:hover ,.chrome-theme .F0XO1GC-nb-P a:active {=
color: rgb(51, 153, 255) !important;}
..F0XO1GC-nb-A {min-width: 34px;}
..F0XO1GC-nb-E {color: rgb(119, 119, 119);}
..F0XO1GC-nb-E > img {position: relative; top: 2px; padding-right: 4px;}
..F0XO1GC-nb-E > span {padding-right: 4px;}
..F0XO1GC-nb-u {padding-right: 4px; vertical-align: top;}
..F0XO1GC-nb-E .F0XO1GC-nb-u {vertical-align: baseline;}
..F0XO1GC-nb-E .F0XO1GC-D-c {vertical-align: middle !important;}
..F0XO1GC-nb-E .F0XO1GC-D-a {vertical-align: baseline;}
..F0XO1GC-Db-a {color: rgb(153, 153, 153); cursor: pointer; font-size: 9px;}
..F0XO1GC-Db-b {color: rgb(136, 136, 136);}
..F0XO1GC-ld-d {margin-left: auto; margin-right: auto;}
..F0XO1GC-ld-c {width: 100%; min-width: 400px;}
..F0XO1GC-ld-a {resize: vertical;}
..F0XO1GC-ld-b {font-weight: bold;}
..F0XO1GC-ed-a {padding-left: 5px; margin-left: 44px;}
..F0XO1GC-D-d {vertical-align: top; padding-left: 2px;}
..F0XO1GC-D-c {padding-left: 4px; vertical-align: top;}
..F0XO1GC-D-a {font-weight: bold; white-space: nowrap; vertical-align: top; =
cursor: default;}
..F0XO1GC-D-b {color: rgb(102, 102, 102); vertical-align: top; white-space: =
nowrap; margin-left: 4px;}
..F0XO1GC-pb-d {background-color: rgb(255, 255, 255); box-shadow: 0px 2px 4p=
x 0px rgba(0, 0, 0, 0.2); padding: 10px; z-index: 1021;}
..F0XO1GC-pb-b {padding-top: 5px; padding-bottom: 5px; font-size: 11px; colo=
r: rgb(102, 102, 102);}
..F0XO1GC-pb-g {width: 100%;}
..F0XO1GC-pb-e {display: block;}
..F0XO1GC-pb-c {display: block; width: 100%;}
..F0XO1GC-pb-f {display: block;}
..gwt-SuggestBoxPopup {overflow: auto !important; max-height: 240px; z-index=
: 1021;}
..F0XO1GC-b-N .gwt-SuggestBoxPopup ,body .gwt-SuggestBoxPopup {line-height: =
26px !important;}
..F0XO1GC-b-O .gwt-SuggestBoxPopup {line-height: 20px !important;}
..item {position: relative;}
..F0XO1GC-b-N .item ,body .item {line-height: 26px !important;}
..F0XO1GC-b-O .item {line-height: 20px !important;}
..item-selected {position: relative;}
td > strong {color: orange;}
..F0XO1GC-j-f .F0XO1GC-pb-d {box-shadow: none;}
..F0XO1GC-vb-p {padding: 8px;}
..F0XO1GC-vb-r {padding-bottom: 20px;}
..F0XO1GC-vb-a {padding: 16px 0px;}
..F0XO1GC-vb-a .goog-button-base {margin-right: 1em;}
..F0XO1GC-vb-z {width: 99%; display: block; border: 1px solid rgb(102, 136, =
238); margin: 5px 0px;}
..F0XO1GC-vb-A {padding-top: 8px;}
..F0XO1GC-vb-i .gwt-CheckBox {white-space: nowrap; padding-right: 1em; displ=
ay: inline-block;}
..F0XO1GC-vb-g {width: 25px; font-weight: bold; text-align: left; padding: 1=
0px 18px 0px 0px; vertical-align: top; white-space: nowrap; color: rgb(153,=
153, 153);}
..F0XO1GC-vb-h {width: 99%; border: 1px solid rgb(102, 136, 238); margin: 3p=
x 0px 3px 3px; font-size: 13px;}
..F0XO1GC-vb-f {color: rgb(136, 136, 136); font-size: 85%; text-decoration: =
none;}
..F0XO1GC-vb-k {background-color: white; max-width: 99%;}
..F0XO1GC-vb-q ,.F0XO1GC-vb-l ,.F0XO1GC-vb-E ,.F0XO1GC-vb-F ,body {min-heigh=
t: 200px; max-width: 100%; overflow: auto; outline: medium none; margin-bot=
tom: 4px;}
..F0XO1GC-vb-q {resize: none;}
..F0XO1GC-vb-E ,.F0XO1GC-vb-F ,body {height: 200px; resize: vertical;}
..F0XO1GC-vb-q ,.F0XO1GC-vb-F {padding: 4px;}
..F0XO1GC-vb-b {margin: 8px 0px;}
..F0XO1GC-vb-b td {vertical-align: middle;}
..F0XO1GC-vb-b a {cursor: pointer; padding: 0px 4px;}
..F0XO1GC-vb-j {white-space: nowrap;}
..F0XO1GC-vb-j a {text-decoration: underline;}
..F0XO1GC-vb-v {cursor: pointer; margin-left: 4px;}
..F0XO1GC-vb-e {padding-left: 10px;}
..F0XO1GC-vb-B {font-weight: bold; margin-bottom: 8px;}
..F0XO1GC-vb-w {margin-bottom: 5px; margin-right: 5px;}
..F0XO1GC-vb-x {max-width: 99%; overflow: hidden; transition: all 0.15s ease=
-in-out 0s;}
..F0XO1GC-vb-C {margin-bottom: 8px;}
..F0XO1GC-vb-o {color: rgb(136, 136, 136); text-decoration: none;}
..F0XO1GC-vb-y {font-weight: bold;}
..F0XO1GC-vb-n {border-bottom: 1px solid rgb(235, 235, 235); padding: 14px 0=
px 8px;}
..F0XO1GC-vb-c {display: inline-block; margin-right: 8px; position: relative=
; top: 6px;}
..F0XO1GC-vb-d {display: inline-block;}
..F0XO1GC-vb-D {font-weight: bold;}
..F0XO1GC-vb-u {display: inline-block; vertical-align: middle;}
..F0XO1GC-vb-t {padding-top: 3px;}
..F0XO1GC-vb-s {padding: 0px 5px 0px 15px;}
..F0XO1GC-vb-m {margin-right: 12px;}
..F0XO1GC-Uc-a {background: white none repeat scroll 0% 0%; min-width: 140px=
; overflow: hidden; white-space: nowrap;}
..F0XO1GC-Uc-b {display: flex; flex-wrap: wrap;}
..F0XO1GC-Uc-c {background-color: white; border: medium none; font-size: 11p=
x; overflow: hidden; outline: medium none; margin: 2px 0px; width: 100%;}
..F0XO1GC-Uc-d {display: inline-block; margin: 0px; padding: 0px; width: 100=
%;}
..F0XO1GC-Lc-h {width: 99%; display: block; border: 1px solid rgb(102, 136, =
238); margin: 5px 0px;}
..F0XO1GC-Lc-d {font-size: 11px; color: rgb(136, 136, 136);}
..F0XO1GC-Lc-e {font-size: 11px; text-decoration: none; white-space: nowrap;=
}
..F0XO1GC-Lc-c {white-space: nowrap; padding-bottom: 2px;}
..F0XO1GC-Lc-a {color: rgb(136, 136, 136);}
..F0XO1GC-Lc-b {color: rgb(153, 0, 0); font-size: 11px;}
..F0XO1GC-Lc-g {height: 2em; overflow: hidden; margin-right: 10px; padding-b=
ottom: 5px;}
..F0XO1GC-Lc-f {line-height: 14px;}
..F0XO1GC-vc-a {font-style: italic;}
..jfk-button-default {color: rgb(255, 255, 255); text-shadow: 0px 1px rgba(0=
, 0, 0, 0.1); border: 1px solid rgb(41, 105, 29); background-color: rgb(61,=
148, 0); background-image: -moz-linear-gradient(center top , rgb(61, 148, =
0), rgb(57, 138, 0));}
..jfk-button-default:hover {border: 1px solid rgb(45, 98, 0); text-shadow: 0=
px 1px rgba(0, 0, 0, 0.3); background-color: rgb(54, 130, 0); background-im=
age: -moz-linear-gradient(center top , rgb(61, 148, 0), rgb(54, 130, 0));}
..jfk-button-default:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t;}
..jfk-button-default:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; outline: 0px none rgba(0, 0, 0, 0);}
..F0XO1GC-rc-c {display: inline-block; cursor: default; padding: 4px; positi=
on: relative;}
..F0XO1GC-rc-e {height: 18px; width: 18px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCA=
QAAAD8x0bcAAABG0lEQVR4AZXRP04CQRiG8ekIibFhgG4rK2WR8KfVwitAaL2BsXgCFB7AgkAoC=
SE0XsATcAJtjSWCsbIjwFCsb7JkJiEWuk/zFr9kk/nMvz/ytOmpNhYTCrPIjD3JIceUwjGK+WRD=
nyoZVWPAlhUlAqIosuBCK+KOeyKtmKXKBzRjgwjXrEnUmisMZXZMDkh6Tx8tXnkjUu+8YNQQh01=
Rm4QqWjxwg1GPOIyqk9BKUU8zg/GdseAZLbIkdH9DMd/MOfWoE35X8+iJL04Ou0FCM0UWx8CjSy=
p+j3DkhFBM2RKT7rlKV4Ud4/BOBVYsKaPNrUrJig+sR6oktGVInaxqMGIncn584DwTXDgwYywmo=
JClRZcOTXKYkOEP/QCM69uSuWj5UAAAAABJRU5ErkJggg=3D=3D") no-repeat scroll 0px =
0px;}
..F0XO1GC-rc-b {display: inline-block;}
..F0XO1GC-rc-c:hover > .F0XO1GC-rc-d ,.F0XO1GC-rc-c:focus > .F0XO1GC-rc-d {d=
isplay: block; z-index: 10;}
..F0XO1GC-rc-g .F0XO1GC-rc-d {right: 0px;}
..F0XO1GC-rc-d {background-color: white; border: 1px solid rgb(187, 187, 187=
); color: black; display: none; font-family: "Roboto",Arial,sans-serif; fon=
t-size: 13px; font-variant: normal; font-weight: normal; line-height: 17px;=
margin: 10px -10px; max-width: 300px; padding: 15px; position: absolute; w=
hite-space: normal; width: 290px;}
..F0XO1GC-rc-a {left: 9px; position: absolute; top: -9px;}
..F0XO1GC-rc-g .F0XO1GC-rc-a {left: inherit; right: 33px;}
..F0XO1GC-rc-h {border-width: 0px 9px 9px; border-style: solid; -moz-border-=
top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors=
: none; -moz-border-left-colors: none; border-image: none; border-color: rg=
b(187, 187, 187) transparent; display: block; left: 0px; position: absolute=
; top: 0px;}
..F0XO1GC-rc-f {border-width: 0px 9px 9px; border-style: solid; -moz-border-=
top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors=
: none; -moz-border-left-colors: none; border-image: none; border-color: wh=
ite transparent; display: block; left: 0px; position: absolute; top: 1px; z=
-index: 120;}
..F0XO1GC-Q-a {margin: 0px 0px 0px 0.8ex; border-left: 1px solid rgb(204, 20=
4, 204); padding-left: 1ex;}
..F0XO1GC-Q-b {margin: 0px 0.8ex; border-style: solid; border-color: rgb(204=
, 204, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; =
-moz-border-bottom-colors: none; -moz-border-left-colors: none; border-imag=
e: none; border-width: 0px 1px; padding: 0px 1ex;}
..F0XO1GC-Q-c {position: relative; top: 5px; height: 16px; width: 16px; over=
flow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iVBOR=
w0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAyElEQVR4Xs2SzQpBURSFlzfwBEp5FIkB=
j8AAeQYDZeDh8ACERMwUA6b+1mpT2z4Z3cn96qvTXrtz7jl3A3mjRpf0Ttuu3vnUFrTq6glbWGO=
PFl1d6wF90I2rJ7zoIRYdR/qMxS8F2Aa7GDj2sB71JpRh4SwGjjmspxSDEb3QE22GzNOC9Zzp0A=
cTeoPdv+6DQAP2Dlc6/o2ACuzzpjFw6Hrq0XUTMj+iyPQbhU7XIPWRDlIXNkgatr/oAdewRj/KW=
mvjFWzcc8QbzwI0QWHWGZ4AAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..picker-framepane-root {position: absolute; width: 100%; height: 100%;}
* .picker-framepane-root ,body .picker-framepane-root {overflow: hidden;}
..picker-framepane-content {position: absolute; top: 0px; left: 0px; right: =
0px; bottom: 0px; overflow: hidden;}
* html .picker-framepane-content ,body .picker-framepane-content {position:=
relative; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 100%; heigh=
t: 100%;}
..picker-framepane-top ,.picker-framepane-bottom {position: absolute; left: =
0px; right: 0px;}
* html .picker-framepane-top ,* html .picker-framepane-bottom ,body .picker=
-framepane-top ,body .picker-framepane-bottom {width: 100%;}
..picker-framepane-top {top: 0px;}
..picker-framepane-bottom {bottom: 0px;}
..picker-framepane-left ,.picker-framepane-right {overflow: auto; position: =
absolute; top: 0px; bottom: 0px;}
* html .picker-framepane-left ,* html .picker-framepane-right ,body .picker=
-framepane-left ,body .picker-framepane-right {height: 100%;}
..picker-framepane-left {left: 0px;}
..picker-framepane-right {right: 0px;}
..picker-actionpane-frame {background-color: rgb(255, 255, 255); border-top:=
1px solid rgb(229, 229, 229);}
..picker-actionpane-content {overflow: hidden;}
..picker-actionpane-frame .jfk-button {margin-top: 20px;}
..picker-actionpane-icon {margin-right: 8px; font-size: 13px; vertical-align=
: middle; background-image: url("//ssl.gstatic.com/docs/picker/images/apps_=
upload_icons-v1.gif") !important; background-position: center 0px; height: =
16px; width: 16px;}
..picker-actionpane-photomove-div {padding: 4px;}
..picker-actionpane-photomove {font-size: 13px; padding-left: 6px; vertical-=
align: bottom;}
:first-child + html .picker-navhidden .picker-actionpane-root {padding-left=
: 10px;}
..picker-navhidden.picker-chrome-none .picker-actionpane-root {bottom: 0px; =
left: 0px; right: 0px;}
..picker-chrome-none .picker-actionpane-content {margin-bottom: 5px;}
..picker-chrome-none .picker-framepane-hidden .picker-actionpane-content {ma=
rgin-bottom: 0px;}
* html .picker-actionpane-content ,body .picker-actionpane-content {padding=
-right: 6px; padding-bottom: 6px;}
..picker-actionpane-float-item {-moz-user-select: none; float: left; margin:=
0px 20px; height: 100%;}
..picker-people-picker .picker-actionpane-float-item {float: right;}
..picker-actionpane-uploading-message {padding: 8px 20px 0px 0px;}
..picker-actionpane-upload-status {color: rgb(68, 68, 68); font-size: 12px; =
max-width: 320px; padding: 17px 0px; position: absolute; right: 0px; top: 0=
px;}
..picker-actionpane-upload-status .picker-progress-bar.progress-bar-horizont=
al {height: 9px; border: 1px solid rgb(153, 153, 153); margin: 1px; padding=
: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; width: 100%=
; vertical-align: middle;}
..picker-actionpane-attachment-label {color: rgb(85, 85, 85); display: inlin=
e-block; font-size: 12px; margin-right: 10px;}
..picker-actionpane-attachment-type-float-item {float: right; margin: 20px;}
..picker-actionpane-attachment-type-float-item .jfk-button {vertical-align: =
middle; margin: 0px;}
..picker-segmentedbuttonbar .picker-actionpane-imagebutton-icon {display: in=
line-block; float: left; margin-top: 3px;}
..picker-segmentedbuttonbar .picker-actionpane-imagebutton-text {display: in=
line-block; font-size: 11px; line-height: 21px; margin-top: 3px;}
..picker-actionpane-frame .picker-segmentedbuttonbar {display: inline-block;=
outline: medium none; position: relative; z-index: 0;}
..picker-segmentedbuttonbar .jfk-button-standard.jfk-button-selected ,.picke=
r-segmentedbuttonbar .jfk-button-standard.jfk-button-clear-outline.jfk-butt=
on-selected {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background-c=
olor: rgb(238, 238, 238); background-image: -moz-linear-gradient(center top=
, rgb(238, 238, 238), rgb(224, 224, 224)); transition: all 0.1s ease 0s; b=
order: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..picker-actionpane-upload-status .progress-bar-horizontal .progress-bar-thu=
mb {height: 100%; background-repeat: repeat-x; background-size: 20px 10px; =
background-color: rgb(204, 204, 204); background-attachment: scroll; backgr=
ound-image: linear-gradient(315deg, transparent, transparent 33%, rgba(0, 0=
, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 66%, transparent); ani=
mation-duration: 0.8s; animation-iteration-count: infinite; animation-timin=
g-function: linear;}
:first-child + html .picker-actionpane-float-item {float: right; margin: 0p=
x; padding-left: 4px;}
..picker-actionpane-frame .goog-imageless-button-content {padding: 6px 14px =
!important;}
..picker-actionpane-frame .goog-imageless-button {margin-left: 8px;}
:first-child + html .picker-actionpane-frame .goog-imageless-button {margin=
-left: 4px;}
..picker-actionpane-frame .goog-link-button {margin-top: 1px;}
..picker-actionpane-actionpanetext {float: right; font-size: 13px; margin: 2=
6px 37px 0px 0px; color: rgb(170, 170, 170);}
..picker-actionpane-upload-button-float-item {float: right;}
..picker-actionpane-upload-button {display: inline-block; float: right; marg=
in: 16px 23px;}
..picker-action-upload-button-img {margin-top: -3px; margin-right: 4px; vert=
ical-align: middle;}
..picker-main-overlay {position: absolute; background-color: rgb(255, 255, 2=
55); z-index: 2200; top: 0px; right: 0px; bottom: 0px; left: 0px; cursor: w=
ait;}
..picker-busy {opacity: 0.6; background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/loading-32-v1.gif") no-repeat scroll 50% 50%;}
..picker-gplus.picker-main-container {background-color: rgb(231, 231, 231);}
..picker-people-picker.picker-main-container {background-color: rgb(255, 255=
, 255);}
..picker-main-container .goog-link-button {color: rgb(17, 85, 204); text-dec=
oration: none; font-size: 13px; cursor: pointer; padding: 9px 2px; outline:=
medium none;}
..picker-main-container .goog-link-button-hover ,.picker-main-container .goo=
g-link-button-focused {text-decoration: underline;}
..picker-attributionbar-frame {background-color: rgb(255, 255, 255); border-=
top: 1px solid rgb(229, 229, 229); color: rgb(170, 170, 170); font-size: 11=
px; padding: 10px 20px; z-index: 2115;}
..picker-attributionbar-line {white-space: nowrap; overflow: hidden;}
..picker-actionpane-legal-text ,.picker-actionpane-notice {height: 100%; pad=
ding-right: 20px; cursor: default;}
..picker-actionpane-legal-text-td ,.picker-actionpane-notice-td {color: rgb(=
170, 170, 170); font-size: 13px; padding: 0px 20px 0px 10px; vertical-align=
: middle;}
..picker-actionpane-notice-link {cursor: pointer;}
..picker-actionpane-notice-error {color: rgb(204, 51, 51); font-size: 13px;}
..picker-actionpane-notice-warning {color: rgb(85, 85, 85); font-size: 11px;=
}
..picker-actionpane-notice-popup {font-size: 13px;}
..picker-actionpane-notice-popup .jfk-bubble-content-id {width: 300px;}
..picker-googlelogo-large {height: 44px; width: 120px;}
..picker-googlelogo-small {height: 20px; width: 52px;}
..picker-msgbar.jfk-butterBar {width: 75%; margin: auto; position: absolute;=
left: 0px; right: 0px; top: 10px; height: auto;}
..picker-msgbar.jfk-butterBar-shown {height: auto;}
..picker-msgbar.jfk-butterBar-warning .picker-link {color: rgb(255, 255, 255=
);}
..picker-main-container .goog-control {cursor: pointer;}
..picker-licensebar {color: rgb(68, 68, 68); font-size: 11px; margin-top: 7p=
x;}
..picker-loadingstatusbox {position: absolute; z-index: 100; padding: 2px 2p=
x 1px 4px; top: 50%; left: 50%; height: 32px; width: 32px; margin-top: -16p=
x; margin-left: -16px;}
..picker-loadingstatusbox-body {z-index: -1;}
..picker-photoupload-albumchooser-select {width: 242px; text-align: left; ma=
rgin: 0px; padding: 6px 10px;}
..picker-photoupload-albumchooser-select .goog-flat-menu-button-caption {wid=
th: 222px; padding: 0px 10px 0px 0px; overflow: hidden; text-overflow: elli=
psis; font-size: 11px; font-weight: bold; color: rgb(68, 68, 68); white-spa=
ce: nowrap; top: 1px; height: 16px;}
..picker-photoupload-albumchooser-select {height: 16px;}
..picker-photoupload-albumchooser-select .goog-flat-menu-button-caption ,.pi=
cker-photoupload-albumchooser-select .goog-flat-menu-button-dropdown ,.pick=
er-photoupload-albumchooser-select {line-height: normal;}
..picker-photoupload-albumchooser-select-menu {height: 180px; overflow: auto=
; z-index: 2200; width: 300px;}
..picker-photoupload-albumchooser-select-menu .goog-menuitem-content {text-o=
verflow: ellipsis; overflow: hidden;}
..picker-header-frame {padding: 17px 20px;}
..picker-header-content {border-top: 1px solid rgb(229, 229, 229);}
..picker-header-text {-moz-user-select: none; display: inline-block; font-si=
ze: 20px; vertical-align: top;}
..picker-header-icon {display: inline-block; margin: 0px 5px 5px 0px;}
..picker-dogfood-confidential-text {color: rgb(221, 75, 57); font-size: 13px=
; font-weight: bold; line-height: 25px; padding-left: 30px; text-transform:=
uppercase;}
..picker-header-close {line-height: 0; overflow: hidden; position: absolute;=
right: 11px; top: 20px;}
..picker-header-close .jfk-button-flat {cursor: pointer; height: inherit; ma=
rgin: 0px; width: inherit;}
..picker-debug-build-label {-moz-user-select: initial; background-color: rgb=
(255, 255, 255); color: rgb(153, 153, 153); font-size: 10px; position: abso=
lute; right: 10px; top: 0px;}
..picker-quotaview {padding: 21px; font-size: 13px;}
..picker-quotaview-div {margin-bottom: 10px;}
..picker-dropdown-menuitem {padding: 2px 7em 2px 30px; border: 0px none;}
..picker-dropdown-menuitem-header {color: rgb(153, 153, 153); cursor: defaul=
t; font-size: 11px; font-weight: bold; padding: 8px 7em 8px 30px; text-tran=
sform: uppercase;}
..picker-dropdown-menu {padding-bottom: 6px; width: 234px; z-index: 2108;}
..picker-url-input-frame {cursor: default; overflow: hidden; padding: 2px 10=
px 4px 8px; border-top: 1px solid rgb(229, 229, 229);}
..picker-url-input-text {font-size: 11px; color: rgb(68, 68, 68); margin: 5p=
x 0px 2px;}
..picker-url-input-box {border-width: 1px; border-style: solid; border-color=
: rgb(191, 191, 191) rgb(216, 216, 216) rgb(216, 216, 216); -moz-border-top=
-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: n=
one; -moz-border-left-colors: none; border-image: none; padding: 1px 0px; m=
argin: 1px 0px; font-size: 11px; width: 100%;}
..picker-url-input-box-selected {border: 2px solid rgb(77, 144, 254);}
..picker-urlview {padding: 14px 20px !important;}
..picker-urlview-header {color: rgb(68, 68, 68); font-size: 13px; font-weigh=
t: bold;}
..picker-urlview-input {width: 200px; border-width: 1px; border-style: solid=
; border-color: rgb(191, 191, 191) rgb(216, 216, 216) rgb(216, 216, 216); -=
moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bo=
ttom-colors: none; -moz-border-left-colors: none; border-image: none; margi=
n: 1px 1px 2px 8px; padding: 3px;}
input.picker-urlview-selected {border: 2px solid rgb(77, 144, 254); margin:=
0px 0px 1px 7px;}
..picker-urlview-loading-icon {background-image: url("//ssl.gstatic.com/docs=
/picker/images/apps_upload_icons-v1.gif") !important; background-position: =
center 0px; height: 16px; width: 16px; margin-left: 5px; margin-bottom: 2px=
; vertical-align: middle; opacity: 0.5;}
..picker-urlview-success-icon {background-image: url("//ssl.gstatic.com/docs=
/picker/images/apps_upload_icons-v1.gif") !important; width: 16px; margin-l=
eft: 5px; vertical-align: middle; opacity: 0.5;}
..picker-urlview-error-icon {background-image: url("//ssl.gstatic.com/docs/p=
icker/images/apps_upload_icons-v1.gif") !important; height: 16px; width: 16=
px; margin-left: 5px; margin-bottom: 2px; vertical-align: middle; opacity: =
0.5;}
..picker-urlview-success-icon {background-position: center -16px; height: 13=
px; margin-bottom: 0px;}
..picker-urlview-error-icon {background-position: center -30px;}
..picker-urlview-preview {position: absolute; margin-top: 8px;}
..picker-urlview-preview-td {vertical-align: middle; text-align: center; col=
or: rgb(170, 170, 170); font-size: 12px;}
..picker-urlview-preview-content {font-size: 14px; margin: 10px 0px;}
..picker-urlview-error-td {color: rgb(204, 51, 51);}
..picker-web-control {border: 6px solid rgb(255, 255, 255); cursor: pointer;=
margin: -2px 8px 4px; overflow: hidden; padding: 6px;}
..picker-web-control-hover ,.picker-web-control-focused {border: 6px solid r=
gb(243, 243, 243); background: rgb(243, 243, 243) none repeat scroll 0% 0%;=
}
..picker-web-control-checked {border: 6px solid rgb(77, 144, 254); backgroun=
d: rgb(242, 247, 255) none repeat scroll 0% 0%;}
..picker-web-control-title {font-size: small; text-decoration: underline;}
..picker-web-control-content {font-size: small; color: rgb(68, 68, 68);}
..picker-web-control-url {font-size: small; color: green;}
..picker-learnmore {position: absolute; bottom: 9px; left: 16px;}
..picker-actionpane-frame .picker-learnmore {float: right; margin-top: 16px;=
position: static;}
..picker-actionpane-frame .picker-learnmore .goog-link-button {margin-right:=
20px; width: auto;}
..picker-learnmore .goog-link-button {width: 134px; vertical-align: middle;}
..picker-spr-questionmark {display: inline-block; margin-right: 5px; vertica=
l-align: middle;}
..picker-iconview-container {height: 100%;}
..picker-iconview-img {border: 1px solid rgb(221, 221, 221); margin-right: a=
uto; margin-left: auto; display: block; position: relative; top: 5%;}
..picker-main-container .jfk-tooltip {z-index: 2103;}
..picker-main-container .jfk-textinput ,.picker-main-container .jfk-button {=
transition: all 0.218s ease 0s;}
..picker-menu-container .goog-menu {z-index: 2112;}
..picker-offscreen {position: absolute; left: -10000px; top: -10000px;}
..picker-content {position: absolute; top: 0px; bottom: 0px; left: 0px; righ=
t: 0px; overflow: hidden;}
..picker-chrome-none .picker-content {left: 0px; right: 0px; bottom: 0px; bo=
rder-top: 0px none; border-left: 0px none; border-right: 0px none;}
..picker-chrome-none .picker-framepane-hidden .picker-actionpane-content .pi=
cker-content {border: 0px none;}
* html .picker-content ,body .picker-content {position: relative; bottom: 0=
px; left: 0px; right: 0px; top: 0px; height: 100%; width: 100%;}
:first-child + html .picker-content {left: 0px; bottom: 0px; right: 0px; to=
p: 0px; overflow-x: hidden;}
:first-child + html .picker-chrome-none .picker-content {left: 0px;}
..picker-dataview {overflow-y: auto;}
..picker-dataview-message {font-size: 13px; padding: 18px 0px 0px 7px; color=
: rgb(51, 51, 51); line-height: 150%;}
..picker-messagelist .picker-dataview-message {margin-left: 13px; padding-to=
p: 5px;}
..picker-combosearchmessagelist .pickercombosearch-content {margin: 20px 0px=
0px 20px;}
..picker-combosearchmessagelist .jfk-button-flat {cursor: pointer; font-size=
: inherit; font-weight: inherit; height: auto;}
..picker-combosearchmessagelist .picker-spr-life-photo-archive-large {margin=
-left: 50px;}
..picker-combosearchmessagelist .picker-searchbar-stock-photos-large {color:=
rgb(102, 102, 102); font-size: 18px; font-weight: bold; height: 27px; marg=
in: 10px 0px 0px 50px; position: absolute; text-align: left; vertical-align=
: middle; width: auto;}
..picker-listrenderer-table {width: 100%; table-layout: fixed; border-spacin=
g: 0px; margin-top: 0px;}
..picker-listrenderer-table .picker-dataview-message {padding: 20px;}
..picker-list-control-tablerow {font-size: 13px; width: 100%; cursor: pointe=
r;}
..picker-list-control-tablerow-with-checkbox {outline: medium none;}
..picker-list-control-focused .jfk-checkbox {border: 1px solid rgb(77, 144, =
254);}
..picker-list-control-unselectable .picker-list-control-cell {color: rgb(204=
, 204, 204);}
..picker-list-control-unselectable .picker-list-control-icon {opacity: 0.3;}
..picker-list-control-checked {background-color: rgb(255, 255, 204);}
..picker-list-control-checkbox-cell {width: 42px; margin: 0px; padding-left:=
20px;}
..picker-list-control-icon-cell {width: 23px; padding-left: 8px;}
..picker-list-control-icon {display: block; margin-top: 4px; padding-bottom:=
3px; width: 16px; height: 16px;}
..picker-list-control-icon-img {max-height: 16px; max-width: 16px;}
..picker-list-control-name-cell {margin-left: 5px; overflow: hidden; padding=
-left: 7px;}
..picker-list-control-lastedited-cell {margin-left: 5px; overflow: hidden; p=
adding-left: 7px; width: 115px;}
..picker-list-control-cell {white-space: nowrap; text-overflow: ellipsis; bo=
rder-bottom: 1px solid rgb(229, 229, 229); padding-top: 4px; padding-bottom=
: 4px;}
..picker-navpane-horizontal-content .picker-list-control-cell {border-color:=
rgb(221, 221, 221);}
..picker-breadcrumbs-frame {cursor: default; overflow: hidden; margin-top: 1=
9px; margin-left: 18px;}
..picker-chrome-none .picker-breadcrumbs-frame {border: 0px none; margin-lef=
t: 0px;}
:first-child + html .picker-breadcrumbs-frame ,* html .picker-breadcrumbs-f=
rame ,body .picker-breadcrumbs-frame {margin-left: 0px; margin-right: 0px;}
* html .picker-breadcrumbs-content ,body .picker-breadcrumbs-content {paddi=
ng-bottom: 6px;}
..picker-breadcrumbs-table {color: rgb(85, 85, 85); font-size: 13px; positio=
n: relative; top: 1px; left: 1px;}
..picker-breadcrumbs-parent {padding-right: 3px; padding-left: 3px; padding-=
bottom: 3px; white-space: nowrap;}
..picker-breadcrumbs-clickable {cursor: pointer;}
..picker-breadcrumbs-triangle {white-space: nowrap;}
..picker-breadcrumbs-triangle1 {border-color: transparent transparent transp=
arent rgb(85, 85, 85); border-style: solid; border-width: 4px; margin: -2px=
2px 3px 6px; width: 0px; height: 0px; vertical-align: middle; line-height:=
0;}
..picker-breadcrumbs-child {font-weight: bold; white-space: nowrap; padding-=
right: 3px; padding-left: 3px; padding-bottom: 3px;}
..picker-butterbar {color: rgb(34, 34, 34); background-color: rgb(249, 237, =
190); font-size: 11px; padding: 3px 0px 0px; height: 17px; text-align: cent=
er; border: 1px solid rgb(240, 195, 109); border-radius: 2px;}
..picker-butterbar .picker-link {color: rgb(0, 0, 0);}
..picker-navhorizontal-new .picker-header-content {border-top: medium none;}
..picker-navhorizontal-new .picker-navpane-horizontal-frame {border-bottom: =
1px solid rgb(225, 225, 225); box-shadow: 0px 1px 5px 1px rgb(225, 225, 225=
); z-index: 1;}
..picker-navpane-horizontal-tab-bar-wrapper {background-color: rgb(245, 245,=
245); height: 50px; text-align: center;}
..picker-navhorizontal-new .picker-navpane-horizontal-tab-bar-wrapper {text-=
align: left;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-bar {background: trans=
parent none repeat scroll 0% 0%; border-bottom: 0px none; display: inline-b=
lock; font-size: 12px; height: 50px; outline: medium none;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-tabco=
ntent {display: inline-block; font-size: 14px; vertical-align: middle;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab ,.picker-navpane-horiz=
ontal-tab-bar-wrapper .goog-menu-button {background: transparent none repea=
t scroll 0% 0%; border: medium none; color: rgb(34, 34, 34); float: left; h=
eight: 14px; margin: 0px 18px; padding: 16px 4px 7px; position: static;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-bar-top {border: mediu=
m none !important; padding: 0px !important;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-hover {background: tra=
nsparent none repeat scroll 0% 0%; border-bottom: 2px solid rgb(77, 144, 25=
4); color: rgb(38, 38, 38); cursor: pointer; padding-bottom: 18px;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-selected {background: =
transparent none repeat scroll 0% 0% !important; border-width: 0px 0px 2px;=
border-style: none none solid; border-color: currentcolor currentcolor rgb=
(77, 144, 254); color: rgb(38, 38, 38); font-weight: bold; padding-bottom: =
18px;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-divid=
er {border-left: 1px solid rgb(34, 34, 34); cursor: default; margin: 10px 1=
0px 0px; padding: 7px 0px;}
..picker-navpane-horizontal-back-icon {display: inline-block; margin-right: =
1px; opacity: 0.8; vertical-align: middle;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button {font-size: 14=
px; outline: medium none;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button-hover ,.picker=
-navpane-horizontal-tab-bar-wrapper .goog-menu-button-open {border-bottom: =
2px solid rgb(77, 144, 254); color: rgb(38, 38, 38); cursor: pointer; paddi=
ng-bottom: 17px;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button.picker-horizon=
tal-navpane-more-selected {border-bottom: 2px solid rgb(77, 144, 254); colo=
r: rgb(38, 38, 38); cursor: pointer; font-weight: bold; padding-bottom: 17p=
x;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button .picker-spr-ar=
row-dk-grey-down {opacity: 0.5; display: inline-block; margin: 0px 0px 2px =
5px;}
..picker-horizontal-navpane-more-menu {max-height: 50%; overflow-y: auto; z-=
index: 2200;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-paren=
t-tab {padding: 15px 2px 0px;}
..picker-navpane-horizontal-parent-tab.goog-tab-hover {padding-bottom: 19px;=
}
..picker-navpane-frame {background-color: rgb(255, 255, 255); border-right: =
1px solid rgb(229, 229, 229); overflow: visible; padding: 14px 0px 0px; z-i=
ndex: 2102;}
..picker-peoplesearchbar-showroom.picker-navpane-frame {background-color: rg=
b(245, 245, 245); border-right: 1px solid rgb(245, 245, 245);}
..picker-navpane-content {overflow: hidden; right: 0px;}
..picker-chrome-inline .picker-navpane-content {top: 10px;}
..picker-main-container .picker-navpane-frame .goog-tree-icon {width: 0px;}
..picker-main-container .picker-navpane-frame .picker-spr-arrow-dk-grey {cur=
sor: pointer; height: 7px; margin-bottom: 1px; margin-left: 2px; margin-rig=
ht: 6px; width: 4px;}
..picker-main-container .picker-navpane-frame .picker-spr-arrow-dk-grey-down=
{cursor: pointer; height: 4px; margin-right: 5px; width: 7px;}
..picker-main-container .picker-navpane-frame .picker-navpane-hascollapse .g=
oog-tree-expand-icon-blank {width: 12px;}
..picker-main-container .picker-navpaneitem .goog-tree-row .goog-tree-icon {=
left: 11px; position: relative;}
..picker-main-container .picker-navpane-frame .goog-tree-root.goog-tree-item=
{margin-top: -1px; outline: medium none; overflow: auto; padding: 2px 12px=
0px 0px;}
..picker-main-container .picker-navpaneitem .goog-tree-item-label {color: rg=
b(68, 68, 68); cursor: pointer; font-size: 13px; margin: 0px 20px 0px 0px; =
overflow: visible; white-space: normal; width: auto; z-index: 2103;}
..picker-main-container .goog-tree-item .picker-navpaneitem .selected {backg=
round-color: transparent; font-weight: normal;}
..picker-main-container .picker-navpane-frame .goog-tree-item .goog-tree-row=
{border-left: 5px solid transparent;}
..picker-main-container .picker-navpane-frame .goog-tree-root .picker-navpan=
eitem-active {border-left: 5px solid rgb(221, 75, 57); border-radius: 0px;}
..picker-main-container .picker-navpaneitem .goog-tree-item-label {margin-le=
ft: 11px;}
..picker-main-container .goog-tree-root .picker-navpaneitem-active .goog-tre=
e-item-label {color: rgb(207, 66, 54); font-weight: bold;}
..picker-main-container .picker-navpaneitem .goog-tree-row {height: auto; li=
ne-height: 90%; margin: 0px; padding: 3px 0px 6px; white-space: nowrap;}
..picker-main-container .picker-navpanedivider .goog-tree-row {line-height: =
0; margin: 0px 10px; padding: 10px 0px; white-space: nowrap;}
..picker-main-container .picker-navpane-frame .picker-navpanedivider .goog-t=
ree-expand-icon-blank ,.picker-main-container .picker-navpanedivider .picke=
r-navpanedivider-icon {height: 0px; position: absolute;}
..picker-main-container .picker-navpanedivider .picker-nav-hr {background-co=
lor: rgb(235, 235, 235); border-width: 0px; color: rgb(235, 235, 235); heig=
ht: 1px;}
..picker-main-container .goog-tree-item .picker-navpaneitem .picker-navpanei=
tem-root {margin-bottom: 1px; padding: 6px 0px 9px;}
..picker-main-container .goog-tree-item .picker-navpaneitem .picker-navpanei=
tem-hover ,.picker-main-container .focused .picker-navpaneitem .selected {b=
ackground-color: rgb(238, 238, 238);}
..picker-main-container .picker-navpane-frame .goog-tree-root .picker-navpan=
eitem .picker-navpaneitem-not-clickable {cursor: default;}
:first-child + html .picker-main-container .picker-navpane-frame .goog-tree=
-root .picker-navpaneitem .goog-tree-item-label {margin-right: 0px; padding=
-bottom: 4px;}
:first-child + html .picker-main-container .picker-navpaneitem .goog-tree-r=
ow {padding-bottom: 0px;}
:first-child + html .picker-main-container .goog-tree-item .picker-navpanei=
tem .picker-navpaneitem-root {padding-bottom: 5px;}
..picker-navpane-frame .picker-buildlabel {bottom: 0px; color: rgb(153, 153,=
153); font-size: 10px; left: 0px; padding: 5px; position: absolute;}
..picker-navpane-frame .picker-buildlabel-a {color: rgb(153, 153, 153);}
..picker-noticebar {font-size: 12px; padding: 7px 14px 15px; color: rgb(68, =
68, 68);}
..picker-progress-bar-spinner.progress-bar-horizontal {border: 0px none; bac=
kground: transparent url("//ssl.gstatic.com/docs/picker/images/loading-v1.g=
if") no-repeat scroll 0px 0px; height: 16px; width: 16px; margin: auto auto=
5px; opacity: 0.5;}
..picker-progress-bar-spinner .progress-bar-thumb {opacity: 0;}
..picker-progress-bar.progress-bar-horizontal {position: relative; border: 0=
px none; text-align: left; background: rgb(225, 225, 225) none repeat scrol=
l 0% 0%; vertical-align: top;}
..picker-main-container .progress-bar-thumb {transition: width 1s ease 0s;}
..picker-progress-bar .progress-bar-thumb {background: rgb(44, 117, 236) non=
e repeat scroll 0% 0%; height: 16px;}
..picker-jfk-tall-progressbar {border-width: 1px; border-style: solid; paddi=
ng: 1px;}
..picker-jfk-tall-progressbar .progress-bar-thumb {height: 8px;}
..picker-sspr-back-arrow-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -129=
px; height: 21px; width: 21px;}
..picker-sspr-back-arrow-inverted {background: rgba(0, 0, 0, 0) url("//ssl.g=
static.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -=
562px; height: 21px; width: 21px;}
..picker-sspr-close-tab {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -150px; hei=
ght: 15px; width: 15px;}
..picker-sspr-drive-logo-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -61p=
x; height: 20px; width: 20px;}
..picker-sspr-folder-new {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -349px; he=
ight: 21px; width: 21px;}
..picker-sspr-forward-arrow-black {background: rgba(0, 0, 0, 0) url("//ssl.g=
static.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -=
436px; height: 21px; width: 21px;}
..picker-sspr-forward-arrow-inverted {background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0p=
x -394px; height: 21px; width: 21px;}
..picker-sspr-group {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/doc=
s/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -481px; height:=
24px; width: 24px;}
..picker-sspr-group-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -601px; h=
eight: 24px; width: 24px;}
..picker-sspr-help-black {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -165px; he=
ight: 24px; width: 24px;}
..picker-sspr-help-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -538px; he=
ight: 24px; width: 24px;}
..picker-sspr-inline-image {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -517px; =
height: 21px; width: 21px;}
..picker-sspr-launch {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/do=
cs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -625px; height=
: 18px; width: 18px;}
..picker-sspr-launch-inverted {background: rgba(0, 0, 0, 0) url("//ssl.gstat=
ic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -583p=
x; height: 18px; width: 18px;}
..picker-sspr-minpicker-back-button {background: rgba(0, 0, 0, 0) url("//ssl=
..gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px=
-21px; height: 16px; width: 16px;}
..picker-sspr-minpicker-forward-button {background: rgba(0, 0, 0, 0) url("//=
ssl.gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll =
0px -309px; height: 16px; width: 16px;}
..picker-sspr-my-drive-new-black {background: rgba(0, 0, 0, 0) url("//ssl.gs=
tatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -4=
57px; height: 24px; width: 24px;}
..picker-sspr-my-drive-new-white {background: rgba(0, 0, 0, 0) url("//ssl.gs=
tatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -2=
37px; height: 24px; width: 24px;}
..picker-sspr-mydrive {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/d=
ocs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -370px; heigh=
t: 24px; width: 24px;}
..picker-sspr-mydrive-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -261px;=
height: 24px; width: 24px;}
..picker-sspr-open-link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -505px; hei=
ght: 12px; width: 12px;}
..picker-sspr-paper-clip {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -415px; he=
ight: 21px; width: 21px;}
..picker-sspr-plus {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs=
/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -37px; height: 2=
4px; width: 24px;}
..picker-sspr-plus-inverted {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -213px;=
height: 24px; width: 24px;}
..picker-sspr-search-icon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px 0px; heig=
ht: 21px; width: 21px;}
..picker-sspr-sort {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs=
/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -325px; height: =
24px; width: 24px;}
..picker-sspr-starred {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/d=
ocs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -81px; height=
: 24px; width: 24px;}
..picker-sspr-starred-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -285px;=
height: 24px; width: 24px;}
..picker-sspr-team-drive-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -105=
px; height: 24px; width: 24px;}
..picker-sspr-team-drive-white {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -189=
px; height: 24px; width: 24px;}
..picker-spr-add-people ,.picker-spr-added-check ,.picker-spr-arrow-back ,.p=
icker-spr-arrow-back-white ,.picker-spr-arrow-dk-grey ,.picker-spr-arrow-dk=
-grey-down ,.picker-spr-arrow-forward ,.picker-spr-arrow-forward-white ,.pi=
cker-spr-audience-acl-small-domain-public ,.picker-spr-audience-acl-small-e=
xtended-circles ,.picker-spr-audience-acl-small-limited ,.picker-spr-audien=
ce-acl-small-owner-only ,.picker-spr-audience-acl-small-public ,.picker-spr=
-back-folder-ltr ,.picker-spr-back-folder-rtl ,.picker-spr-black-close ,.pi=
cker-spr-check ,.picker-spr-checkbox-active ,.picker-spr-checkbox-selected =
,.picker-spr-checkbox-selected-blue ,.picker-spr-checkmark-checked ,.picker=
-spr-circle ,.picker-spr-circle-active ,.picker-spr-circle-big ,.picker-spr=
-circle-big-white ,.picker-spr-circle-hover ,.picker-spr-close-box-small-of=
f ,.picker-spr-close-box-small-on ,.picker-spr-close-box-tiny-black ,.picke=
r-spr-close-box-tiny-white ,.picker-spr-close-min ,.picker-spr-collection ,=
..picker-spr-drive-64 ,.picker-spr-drive-black-icon ,.picker-spr-drive-drag-=
upload-icon ,.picker-spr-drive-upload-icon ,.picker-spr-folder-shared-white=
,.picker-spr-folder-white ,.picker-spr-gmail ,.picker-spr-google-logo ,.pi=
cker-spr-google-logo-large ,.picker-spr-google-photos-20 ,.picker-spr-googl=
e-photos-24 ,.picker-spr-googleplus ,.picker-spr-grid-view ,.picker-spr-ic-=
dragfile-blue ,.picker-spr-ic-dragfile-bluepng ,.picker-spr-ic-dragfile-gre=
y ,.picker-spr-ic-dragphoto-blue ,.picker-spr-ic-dragphoto-grey ,.picker-sp=
r-ic-dragvideo-blue ,.picker-spr-ic-dragvideo-grey ,.picker-spr-ic-photos-1=
2 ,.picker-spr-ic-photos-20 ,.picker-spr-ic-remove ,.picker-spr-icon-autofi=
x-active ,.picker-spr-icon-computer ,.picker-spr-icon-cover-photo ,.picker-=
spr-icon-photos-delete ,.picker-spr-icon-photos-delete-white ,.picker-spr-i=
con-remove-active ,.picker-spr-icon-rotate-ccw-active ,.picker-spr-icon-rot=
ate-cw-active ,.picker-spr-icon-rotate-left-white ,.picker-spr-icon-rotate-=
right-white ,.picker-spr-icon-three-dots-active ,.picker-spr-icon-zoom-max =
,.picker-spr-icon-zoom-min ,.picker-spr-imagefilter-all-colors ,.picker-spr=
-imagefilter-monochrome ,.picker-spr-inline-image ,.picker-spr-large-plus-b=
lack ,.picker-spr-life-photo-archive ,.picker-spr-life-photo-archive-large =
,.picker-spr-list-view ,.picker-spr-maps-cancel-en ,.picker-spr-maps-next-d=
is ,.picker-spr-maps-next-en ,.picker-spr-maps-prev-dis ,.picker-spr-maps-p=
rev-en ,.picker-spr-mic ,.picker-spr-navpane-albums ,.picker-spr-navpane-al=
bums-selected ,.picker-spr-navpane-from-computer ,.picker-spr-navpane-from-=
computer-selected ,.picker-spr-navpane-gdrive ,.picker-spr-navpane-gdrive-s=
elected ,.picker-spr-navpane-instantupload ,.picker-spr-navpane-instantuplo=
ad-selected ,.picker-spr-navpane-url ,.picker-spr-navpane-webcam ,.picker-s=
pr-navpane-webcam-selected ,.picker-spr-navpane-youtube ,.picker-spr-new-fo=
lder ,.picker-spr-no-photo ,.picker-spr-no-photo-48 ,.picker-spr-no-photo-8=
4 ,.picker-spr-paper-clip ,.picker-spr-photo-discard ,.picker-spr-photo-ico=
n ,.picker-spr-photo-upload-cancel ,.picker-spr-picasa-rectangles ,.picker-=
spr-plus-black ,.picker-spr-plus-gray ,.picker-spr-profile-rotate-ccw ,.pic=
ker-spr-profile-rotate-cw ,.picker-spr-questionmark ,.picker-spr-rio-arrow-=
menu ,.picker-spr-rio-check-active ,.picker-spr-rio-check-checked ,.picker-=
spr-rio-checkmark-active ,.picker-spr-rio-checkmark-selected ,.picker-spr-r=
io-rotate ,.picker-spr-rio-trash ,.picker-spr-rio-upload ,.picker-spr-rio-u=
pload-big ,.picker-spr-sad-face ,.picker-spr-sort ,.picker-spr-sort-bar ,.p=
icker-spr-toolbar-gray-rotate-ccw ,.picker-spr-toolbar-gray-rotate-cw ,.pic=
ker-spr-toolbar-gray-trash ,.picker-spr-toolbar-white-rotate-ccw ,.picker-s=
pr-toolbar-white-rotate-cw ,.picker-spr-toolbar-white-trash ,.picker-spr-up=
load-arrow ,.picker-spr-upload-error ,.picker-spr-upload-retry ,.picker-spr=
-video-play-overlay ,.picker-spr-video-play-overlay-small ,.picker-spr-vide=
o-stars ,.picker-spr-video-stars-rtl ,.picker-spr-video-upload-icon ,.picke=
r-spr-white-checkmark ,.picker-spr-youtube {background: rgba(0, 0, 0, 0) ur=
l("//ssl.gstatic.com/docs/picker/images/picker_sprite-v107.png") no-repeat =
scroll 0% 0%;}
..picker-spr-add-people {background-position: -28px -230px; width: 27px; hei=
ght: 26px;}
..picker-spr-added-check {background-position: 0px -676px; width: 21px; heig=
ht: 21px;}
..picker-spr-arrow-back-white {background-position: -128px -1112px; width: 2=
1px; height: 21px;}
..picker-spr-arrow-back {background-position: -15px -1402px; width: 21px; he=
ight: 21px;}
..picker-spr-arrow-dk-grey-down {background-position: 0px -1240px; width: 7p=
x; height: 4px;}
..picker-spr-arrow-dk-grey {background-position: 0px -230px; width: 4px; hei=
ght: 7px;}
..picker-spr-arrow-forward-white {background-position: 0px -576px; width: 21=
px; height: 21px;}
..picker-spr-arrow-forward {background-position: -58px -676px; width: 21px; =
height: 21px;}
..picker-spr-audience-acl-small-domain-public {background-position: -110px -=
1402px; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-extended-circles {background-position: -88px=
-1388px; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-limited {background-position: -4px -310px; w=
idth: 12px; height: 12px;}
..picker-spr-audience-acl-small-owner-only {background-position: 0px -1112px=
; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-public {background-position: 0px -985px; wid=
th: 12px; height: 12px;}
..picker-spr-back-folder-ltr {background-position: 0px -1012px; width: 21px;=
height: 21px;}
..picker-spr-back-folder-rtl {background-position: 0px -1304px; width: 21px;=
height: 21px;}
..picker-spr-black-close {background-position: -147px -244px; width: 11px; h=
eight: 11px;}
..picker-spr-checkbox-active {background-position: -15px -1140px; width: 24p=
x; height: 24px;}
..picker-spr-checkbox-selected-blue {background-position: 0px -1325px; width=
: 24px; height: 24px;}
..picker-spr-checkbox-selected {background-position: -46px -802px; width: 24=
px; height: 24px;}
..picker-spr-checkmark-checked {background-position: -19px -922px; width: 18=
px; height: 18px;}
..picker-spr-check {background-position: 0px -890px; width: 14px; height: 11=
px;}
..picker-spr-circle-active {background-position: 0px -1373px; width: 14px; h=
eight: 14px;}
..picker-spr-circle-big-white {background-position: -79px -676px; width: 26p=
x; height: 26px;}
..picker-spr-circle-big {background-position: -83px -1112px; width: 26px; he=
ight: 26px;}
..picker-spr-circle-hover {background-position: -147px -230px; width: 14px; =
height: 14px;}
..picker-spr-circle {background-position: -113px -64px; width: 14px; height:=
14px;}
..picker-spr-close-box-small-off {background-position: -79px -945px; width: =
15px; height: 15px;}
..picker-spr-close-box-small-on {background-position: -43px -676px; width: 1=
5px; height: 15px;}
..picker-spr-close-box-tiny-black {background-position: -19px -915px; width:=
7px; height: 7px;}
..picker-spr-close-box-tiny-white {background-position: -82px -985px; width:=
7px; height: 7px;}
..picker-spr-close-min {background-position: -105px -676px; width: 11px; hei=
ght: 11px;}
..picker-spr-collection {background-position: -21px -1077px; width: 16px; he=
ight: 13px;}
..picker-spr-drive-64 {background-position: -88px -1511px; width: 64px; heig=
ht: 64px;}
..picker-spr-drive-black-icon {background-position: -79px -960px; width: 21p=
x; height: 21px;}
..picker-spr-drive-drag-upload-icon {background-position: 0px -422px; width:=
35px; height: 45px;}
..picker-spr-drive-upload-icon {background-position: -149px -1112px; width: =
11px; height: 14px;}
..picker-spr-folder-shared-white {background-position: -4px -289px; width: 2=
1px; height: 21px;}
..picker-spr-folder-white {background-position: -32px -363px; width: 21px; h=
eight: 21px;}
..picker-spr-gmail {background-position: -72px -1388px; width: 16px; height:=
11px;}
..picker-spr-google-logo-large {background-position: -40px -826px; width: 11=
8px; height: 41px;}
..picker-spr-google-logo {background-position: -64px -915px; width: 61px; he=
ight: 28px;}
..picker-spr-google-photos-20 {background-position: -90px -802px; width: 20p=
x; height: 20px;}
..picker-spr-google-photos-24 {background-position: -4px -230px; width: 24px=
; height: 24px;}
..picker-spr-googleplus {background-position: -109px -390px; width: 48px; he=
ight: 48px;}
..picker-spr-grid-view {background-position: 0px -1140px; width: 15px; heigh=
t: 15px;}
..picker-spr-ic-dragfile-bluepng {background-position: 0px -130px; width: 10=
0px; height: 100px;}
..picker-spr-ic-dragfile-blue {background-position: -100px -130px; width: 64=
px; height: 64px;}
..picker-spr-ic-dragfile-grey {background-position: 0px -1447px; width: 64px=
; height: 64px;}
..picker-spr-ic-dragphoto-blue {background-position: -65px -278px; width: 64=
px; height: 64px;}
..picker-spr-ic-dragphoto-grey {background-position: -90px -1240px; width: 6=
4px; height: 64px;}
..picker-spr-ic-dragvideo-blue {background-position: 0px -1511px; width: 64p=
x; height: 64px;}
..picker-spr-ic-dragvideo-grey {background-position: 0px -702px; width: 100p=
x; height: 100px;}
..picker-spr-ic-photos-12 {background-position: -125px -915px; width: 12px; =
height: 12px;}
..picker-spr-ic-photos-20 {background-position: -70px -802px; width: 20px; h=
eight: 20px;}
..picker-spr-ic-remove {background-position: -24px -826px; width: 16px; heig=
ht: 16px;}
..picker-spr-icon-autofix-active {background-position: 0px -802px; width: 24=
px; height: 24px;}
..picker-spr-icon-computer {background-position: -21px -676px; width: 22px; =
height: 20px;}
..picker-spr-icon-cover-photo {background-position: -124px -702px; width: 14=
px; height: 21px;}
..picker-spr-icon-photos-delete-white {background-position: 0px -826px; widt=
h: 24px; height: 24px;}
..picker-spr-icon-photos-delete {background-position: -100px -702px; width: =
24px; height: 24px;}
..picker-spr-icon-remove-active {background-position: -100px -726px; width: =
24px; height: 24px;}
..picker-spr-icon-rotate-ccw-active {background-position: 0px 0px; width: 24=
px; height: 24px;}
..picker-spr-icon-rotate-cw-active {background-position: -64px -1511px; widt=
h: 24px; height: 24px;}
..picker-spr-icon-rotate-left-white {background-position: -43px -936px; widt=
h: 15px; height: 9px;}
..picker-spr-icon-rotate-right-white {background-position: 0px -1402px; widt=
h: 15px; height: 9px;}
..picker-spr-icon-three-dots-active {background-position: -104px 0px; width:=
24px; height: 24px;}
..picker-spr-icon-zoom-max {background-position: 0px -390px; width: 32px; he=
ight: 32px;}
..picker-spr-icon-zoom-min {background-position: 0px -342px; width: 32px; he=
ight: 32px;}
..picker-spr-imagefilter-all-colors {background-position: -21px -1304px; wid=
th: 19px; height: 19px;}
..picker-spr-imagefilter-monochrome {background-position: -109px -1112px; wi=
dth: 19px; height: 19px;}
..picker-spr-inline-image {background-position: -43px -915px; width: 21px; h=
eight: 21px;}
..picker-spr-large-plus-black {background-position: -87px -230px; width: 12p=
x; height: 12px;}
..picker-spr-life-photo-archive-large {background-position: 0px -945px; widt=
h: 79px; height: 40px;}
..picker-spr-life-photo-archive {background-position: -12px -1112px; width: =
55px; height: 28px;}
..picker-spr-list-view {background-position: -55px -262px; width: 15px; heig=
ht: 15px;}
..picker-spr-maps-cancel-en {background-position: 0px -883px; width: 7px; he=
ight: 7px;}
..picker-spr-maps-next-dis {background-position: -128px -867px; width: 6px; =
height: 11px;}
..picker-spr-maps-next-en {background-position: -37px -915px; width: 6px; he=
ight: 11px;}
..picker-spr-maps-prev-dis {background-position: -24px -32px; width: 6px; he=
ight: 11px;}
..picker-spr-maps-prev-en {background-position: -76px -985px; width: 6px; he=
ight: 11px;}
..picker-spr-mic {background-position: 0px -1349px; width: 9px; height: 14px=
;}
..picker-spr-navpane-albums-selected {background-position: -99px -230px; wid=
th: 48px; height: 48px;}
..picker-spr-navpane-albums {background-position: -100px -750px; width: 48px=
; height: 48px;}
..picker-spr-navpane-from-computer-selected {background-position: -109px -43=
8px; width: 30px; height: 28px;}
..picker-spr-navpane-from-computer {background-position: -21px -1049px; widt=
h: 30px; height: 28px;}
..picker-spr-navpane-gdrive-selected {background-position: -24px -1325px; wi=
dth: 48px; height: 48px;}
..picker-spr-navpane-gdrive {background-position: 0px -508px; width: 48px; h=
eight: 48px;}
..picker-spr-navpane-instantupload-selected {background-position: -56px 0px;=
width: 48px; height: 48px;}
..picker-spr-navpane-instantupload {background-position: -53px -342px; width=
: 48px; height: 48px;}
..picker-spr-navpane-url {background-position: -83px -64px; width: 30px; hei=
ght: 30px;}
..picker-spr-navpane-webcam-selected {background-position: 0px -1244px; widt=
h: 48px; height: 48px;}
..picker-spr-navpane-webcam {background-position: -101px -342px; width: 48px=
; height: 48px;}
..picker-spr-navpane-youtube {background-position: -21px -576px; width: 30px=
; height: 30px;}
..picker-spr-new-folder {background-position: -48px -1240px; width: 21px; he=
ight: 21px;}
..picker-spr-no-photo-48 {background-position: -80px -867px; width: 48px; he=
ight: 48px;}
..picker-spr-no-photo-84 {background-position: -72px -1304px; width: 84px; h=
eight: 84px;}
..picker-spr-no-photo {background-position: 0px -476px; width: 32px; height:=
32px;}
..picker-spr-paper-clip {background-position: -69px -1240px; width: 21px; he=
ight: 21px;}
..picker-spr-photo-discard {background-position: -41px -278px; width: 24px; =
height: 24px;}
..picker-spr-photo-icon {background-position: -105px -687px; width: 18px; he=
ight: 14px;}
..picker-spr-photo-upload-cancel {background-position: -41px -302px; width: =
10px; height: 10px;}
..picker-spr-picasa-rectangles {background-position: -19px -867px; width: 61=
px; height: 44px;}
..picker-spr-plus-black {background-position: -32px -342px; width: 21px; hei=
ght: 21px;}
..picker-spr-plus-gray {background-position: -148px -278px; width: 9px; heig=
ht: 9px;}
..picker-spr-profile-rotate-ccw {background-position: 0px -867px; width: 19p=
x; height: 16px;}
..picker-spr-profile-rotate-cw {background-position: -64px -1535px; width: 1=
9px; height: 16px;}
..picker-spr-questionmark {background-position: -123px -676px; width: 16px; =
height: 16px;}
..picker-spr-rio-arrow-menu {background-position: -83px -48px; width: 16px; =
height: 16px;}
..picker-spr-rio-check-active {background-position: -55px -230px; width: 32p=
x; height: 32px;}
..picker-spr-rio-check-checked {background-position: -24px 0px; width: 32px;=
height: 32px;}
..picker-spr-rio-checkmark-active {background-position: -137px -867px; width=
: 24px; height: 24px;}
..picker-spr-rio-checkmark-selected {background-position: -139px -676px; wid=
th: 24px; height: 24px;}
..picker-spr-rio-rotate {background-position: -25px -278px; width: 16px; hei=
ght: 16px;}
..picker-spr-rio-trash {background-position: -67px -1112px; width: 16px; hei=
ght: 16px;}
..picker-spr-rio-upload-big {background-position: -35px -390px; width: 74px;=
height: 86px;}
..picker-spr-rio-upload {background-position: -128px 0px; width: 25px; heigh=
t: 29px;}
..picker-spr-sad-face {background-position: -16px -48px; width: 67px; height=
: 58px;}
..picker-spr-sort-bar {background-position: -55px -1402px; width: 20px; heig=
ht: 20px;}
..picker-spr-sort {background-position: -139px -438px; width: 13px; height: =
18px;}
..picker-spr-toolbar-gray-rotate-ccw {background-position: -94px -945px; wid=
th: 19px; height: 14px;}
..picker-spr-toolbar-gray-rotate-cw {background-position: -36px -1402px; wid=
th: 19px; height: 14px;}
..picker-spr-toolbar-gray-trash {background-position: -75px -1402px; width: =
19px; height: 14px;}
..picker-spr-toolbar-white-rotate-ccw {background-position: -129px -278px; w=
idth: 19px; height: 14px;}
..picker-spr-toolbar-white-rotate-cw {background-position: 0px -915px; width=
: 19px; height: 14px;}
..picker-spr-toolbar-white-trash {background-position: 0px -850px; width: 19=
px; height: 14px;}
..picker-spr-upload-arrow {background-position: -4px -278px; width: 11px; he=
ight: 11px;}
..picker-spr-upload-error {background-position: 0px -48px; width: 16px; heig=
ht: 14px;}
..picker-spr-upload-retry {background-position: -100px -1388px; width: 14px;=
height: 14px;}
..picker-spr-video-play-overlay-small {background-position: -24px -802px; wi=
dth: 22px; height: 22px;}
..picker-spr-video-play-overlay {background-position: -21px -1012px; width: =
37px; height: 37px;}
..picker-spr-video-stars-rtl {background-position: 0px -106px; width: 110px;=
height: 24px;}
..picker-spr-video-stars {background-position: 0px -1423px; width: 110px; he=
ight: 24px;}
..picker-spr-video-upload-icon {background-position: -82px -992px; width: 22=
px; height: 14px;}
..picker-spr-white-checkmark {background-position: -64px -1551px; width: 12p=
x; height: 9px;}
..picker-spr-youtube {background-position: -12px -985px; width: 64px; height=
: 27px;}
..picker-searchbar {margin: 15px 0px 8px 20px;}
..picker-searchbar .jfk-button {background-image: none; vertical-align: midd=
le;}
..picker-searchbar .goog-menu {z-index: 2112;}
..picker-searchbar-input {font-size: 13px; text-align: left;}
..picker-searchbar-input-logo .picker-spr-google-logo {margin-right: 10px;}
..picker-searchbar .picker-searchbar-input-logo {position: relative;}
..picker-searchbar .picker-flat-menu-button {cursor: pointer; height: 14px; =
left: 221px; min-width: 0px; opacity: 0.5; padding: 11px 15px 0px 5px; posi=
tion: absolute; top: 6px;}
..picker-searchbar .picker-flat-menu-button.jfk-button-hover ,.picker-search=
bar .picker-flat-menu-button.jfk-button-focused {opacity: 1;}
..picker-searchbar-input-box.picker-searchbar-dropdownmenu-padding {width: 2=
10px; padding-right: 23px;}
..picker-searchbar .picker-flat-menu-button .picker-spr-arrow-dk-grey-down {=
position: absolute;}
..picker-searchbar-input-logo .picker-spr-life-photo-archive {margin: 0px 6p=
x 0px 2px;}
..picker-searchbar-input-item {vertical-align: bottom;}
..picker-searchbar-input-box {width: 225px; margin: 4px 15px 5px 0px; vertic=
al-align: middle;}
..picker-searchbar-logo .picker-searchbar-input-box {margin-top: 5px;}
..picker-searchbar-input-logo .picker-searchbar-stock-photos ,.goog-menuitem=
-content .picker-searchbar-stock-photos {text-align: left; color: rgb(102, =
102, 102); padding: 6px 4px 0px 0px; margin: 0px; width: auto; height: 22px=
; vertical-align: middle; font-size: 15px; font-weight: bold;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-spr-goo=
gle-logo {margin: 2px 2px 2px 0px;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-spr-lif=
e-photo-archive {margin: 2px 6px 2px 2px;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-searchb=
ar-stock-photos {padding: 2px 0px 0px; height: 30px;}
..goog-menuitem.picker-searchbar-menuitem {padding-right: 13px; padding-left=
: 13px;}
..picker-searchbar-menuitem .goog-menuitem-content {margin-top: -2px;}
..picker-searchbar-input-logo .goog-flat-menu-button.picker-searchbar-combob=
ox-dropdown {border-bottom-right-radius: 0px; border-top-right-radius: 0px;=
height: 32px; margin: 0px; vertical-align: middle;}
..picker-searchbar-input-logo .goog-flat-menu-button.picker-searchbar-combob=
ox-dropdown.goog-flat-menu-button-focused {z-index: 2104;}
..picker-searchbar-combobox .picker-searchbar-input-box {padding-top: 4px; p=
adding-bottom: 3px; margin-left: -1px; position: relative; z-index: 2103;}
..picker-searchbar-combobox .jfk-button {height: 28px; padding-top: 4px;}
..picker-drive-view-switcher {display: inline-block; position: absolute; rig=
ht: 20px; top: 19px;}
..picker-drive-view-switcher-with-drive-sort {right: 58px;}
..picker-drive-view-switcher-button {opacity: 0.55; margin: 6px 12px;}
..picker-doctype-chip {background-color: rgb(218, 228, 246); border: 1px sol=
id rgb(218, 228, 246); border-radius: 2px; display: inline-block; height: 2=
3px; left: 22px; outline: medium none; position: absolute; top: 6px;}
..picker-videos-listview .picker-doctype-chip ,.picker-videos-grid .picker-d=
octype-chip {left: 2px;}
..picker-doctype-chip-label {display: inline-block; font-size: 12px; line-he=
ight: 23px; padding: 0px 3px; vertical-align: top;}
..picker-doctype-chip-dismiss {display: inline-block; padding: 8px 4px;}
..picker-dropdown-menu.picker-doctypes-dropdown-menu {max-height: 70%; width=
: 341px;}
..picker-navhorizontal-new .picker-dropdown-menu.picker-doctypes-dropdown-me=
nu {width: 441px;}
..picker-doctypes-dropdown-menu .picker-dropdown-menuitem-header {padding-bo=
ttom: 0px;}
..picker-dataview .picker-searchbar-input {position: relative;}
..picker-main-container .picker-dataview .picker-searchbar .picker-flat-menu=
-button {left: 321px;}
..picker-dataview .picker-searchbar-input-box.picker-searchbar-dropdownmenu-=
padding {width: 310px;}
..picker-dataview .picker-searchbar-input-box {width: 325px;}
..picker-bloggerinstructions-text {color: rgb(68, 68, 68); font-size: 11px; =
padding: 10px 15px 2px;}
..picker-docsortoptions-menu-button {display: inline-block; min-width: 22px;=
padding-right: 8px; position: absolute; right: 34px; top: 19px;}
..picker-docsortoptions-menu-button .goog-flat-menu-button-dropdown {display=
: none;}
..picker-docsortoptions-menu-button-content {height: 18px; margin: 4px 3px; =
opacity: 0.5;}
..picker-docsortoptions-selector {border-bottom: 1px solid rgb(229, 229, 229=
); padding-bottom: 4px; padding-top: 8px; position: relative;}
..picker-docsortoptions-title {color: rgb(170, 170, 170); cursor: pointer; d=
isplay: inline-block; font-size: 11px; font-weight: bold; margin-left: 70px=
; text-transform: uppercase; vertical-align: top;}
..picker-docsortoptions-label {color: rgb(170, 170, 170); display: inline-bl=
ock; font-size: 11px; font-weight: bold; position: absolute; right: 40px; t=
ext-transform: uppercase; vertical-align: top;}
..picker-docsortoptions-active.picker-docsortoptions-title ,.picker-docsorto=
ptions-active.picker-docsortoptions-label {color: rgb(221, 75, 57);}
..picker-docsortoptions-button {display: inline-block; position: absolute; r=
ight: 20px; vertical-align: top;}
..picker-docsortoptions-grid-view .picker-docsortoptions-label {display: inl=
ine-block; margin-left: 40px; position: static;}
..picker-docsortoptions-grid-view .picker-docsortoptions-button {display: in=
line-block; margin-left: 6px; position: static;}
..picker-dropdown-menu.picker-sort-dropdown-menu {max-width: 30%; width: ini=
tial;}
..picker-sort-dropdown-menu .goog-menuitem {min-width: 0px; padding-left: 20=
px;}
..picker-sort-dropdown-menu .goog-menuitem-content {overflow: hidden; text-o=
verflow: ellipsis;}
..picker-promo-table {position: absolute; top: 0px; left: 0px; height: 100%;=
width: 100%; border-spacing: 15px; margin-top: -15px;}
..picker-promo-logo {margin: 15px;}
..picker-promo-text {font-size: 13px; color: rgb(170, 170, 170); width: 420p=
x;}
..picker-promo-title {font-size: 13px; color: rgb(0, 0, 0); font-weight: bol=
d; margin-bottom: 10px; width: 420px;}
..picker-uploadbar {color: rgb(68, 68, 68); font-size: 11px; margin-bottom: =
15px; white-space: nowrap;}
..picker-uploadbar .jfk-button {margin: 15px 15px 5px;}
..picker-uploadbar .picker-spr-upload-arrow {margin-right: 6px;}
..picker-uploadbar-msg {padding: 4px 15px;}
..picker-uploadbar-separator {margin-top: 7px; border-top: 1px solid rgb(221=
, 221, 221);}
..picker-uploadbar-htmlfileinput {margin: 14px 14px 3px;}
..picker-main-container {position: absolute; height: 100%; width: 100%;}
..picker-modal-dialog {box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2); -moz-use=
r-select: none; background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); color: rgb(0, 0, 0); position: absolute=
; z-index: 2101; outline: medium none;}
..picker-modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative;}
..picker-modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 2100;}
..picker-modal-dialog-title {-moz-user-select: none; background: rgb(255, 25=
5, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); cursor: move; font-s=
ize: 20px; padding: 6px 8px 15px; position: relative; vertical-align: middl=
e; border-top: 10px solid rgb(255, 255, 255); border-left: 10px solid rgb(2=
55, 255, 255); border-right: 10px solid rgb(255, 255, 255);}
..picker-modal-dialog-title-text {display: block; overflow: hidden; text-ove=
rflow: ellipsis; white-space: nowrap;}
..picker-modal-dialog-title-close {cursor: pointer; position: absolute; righ=
t: 0px; top: 10px; opacity: 0.7;}
..picker-modal-dialog-dogfood-confidential-text {color: rgb(221, 75, 57); fo=
nt-size: 13px; font-weight: bold; overflow: hidden; position: absolute; rig=
ht: 30px; top: 10px; text-transform: uppercase;}
..picker-modal-dialog-title-close-hover {opacity: 1;}
..picker-modal-dialog-buttons {display: none;}
..picker-modal-dialog-content {border: 0px none;}
..picker-main-container .goog-buttonset-default {font-weight: bold;}
div.picker-navpane-root {position: relative; left: 0px; right: 0px; width: =
auto;}
..picker-content {width: auto; height: auto;}
..picker-searchbar-input-box {font-size: 13px;}
..picker-form {margin: 0px; padding: 0px;}
..picker-main-container .goog-toolbar {border: 0px none; background: rgba(0,=
0, 0, 0) none repeat scroll 0px center;}
..picker-header-close {display: none;}
..picker-native.picker-minew .picker-header-close {display: block;}
..picker-contactbin-chip-holder .picker-contactbin-input {width: 130px;}
..picker-album-control {border: 2px solid transparent; color: rgb(68, 68, 68=
); cursor: pointer; font-size: 11px; margin: 6px; position: relative; verti=
cal-align: top; outline: medium none;}
..picker-album-control-album-tile {box-shadow: 0px 1px 0px rgb(218, 218, 218=
); background-color: rgb(255, 255, 255); border: 1px solid rgb(229, 229, 22=
9); height: 158px; width: 163px;}
..picker-album-control:active ,.picker-album-control-checked {border: 2px so=
lid rgb(77, 144, 254);}
..picker-album-control-checked .picker-album-control-album-tile ,.picker-alb=
um-control-focused .picker-album-control-album-tile {box-shadow: none; bord=
er: 1px solid rgb(77, 144, 254);}
..picker-album-control-thumbs {height: 110px; width: 163px;}
..picker-album-control-thumb {border: medium none; height: 110px; padding: 0=
px; width: 163px;}
..picker-album-control-no-cover-thumb {background-color: rgb(238, 238, 238);=
opacity: 1 !important;}
..picker-album-control-title {margin: 0px; overflow: hidden; text-overflow: =
ellipsis; vertical-align: top; white-space: nowrap; width: 80%;}
..picker-album-control-photo-count-date {margin: 0px; overflow: hidden; text=
-overflow: ellipsis; vertical-align: top; white-space: nowrap; width: 80%; =
color: rgb(186, 186, 186); padding: 6px 0px 0px 7px;}
..picker-album-control-title {color: rgb(38, 38, 38); font-size: 13px; font-=
weight: bold; height: 20px; padding: 8px 10px 0px;}
..picker-album-control-photo-count {bottom: 9px; color: rgb(170, 170, 170); =
font-size: 11px; padding: 0px 10px; position: absolute;}
..picker-album-control-visibility .picker-spr-audience-acl-small-owner-only =
,.picker-album-control-visibility .picker-spr-audience-acl-small-limited ,.=
picker-album-control-visibility .picker-spr-audience-acl-small-extended-cir=
cles ,.picker-album-control-visibility .picker-spr-audience-acl-small-domai=
n-public ,.picker-album-control-visibility .picker-spr-audience-acl-small-p=
ublic {opacity: 0.4; bottom: 11px; display: inline-block; height: 12px; pos=
ition: absolute; right: 10px; vertical-align: top; width: 12px;}
..picker-album-control-thumbs .picker-spr-rio-checkmark-active ,.picker-albu=
m-control-thumbs .picker-spr-rio-checkmark-selected {display: inline-block;=
left: 5px; opacity: 0; position: absolute; top: 5px;}
..picker-album-control-hover .picker-spr-rio-checkmark-active ,.picker-album=
-control-focused .picker-spr-rio-checkmark-active {opacity: 0.7;}
..picker-album-control-checked .picker-spr-rio-checkmark-selected {opacity: =
1;}
..ozAppNoFocusOutline .picker-album-control {outline: 0px none;}
..picker-albumname .picker-photoupload-albumchooser {margin-right: 10px;}
..picker-albumname .picker-photoupload-albumchooser-select .goog-flat-menu-b=
utton-caption {overflow: hidden; text-overflow: ellipsis; white-space: nowr=
ap; width: 148px;}
..picker-albumname .picker-photoupload-albumchooser-select {margin-left: 2px=
; position: relative; top: -1px; width: 168px;}
..picker-camerasyncseparator {cursor: default; font-size: 12px; padding: 10p=
x 0px 7px;}
..picker-camerasyncseparator-checkbox {cursor: pointer; display: inline-bloc=
k; opacity: 0.3; transition: opacity 0.218s ease 0s; vertical-align: middle=
;}
..picker-camerasyncseparator-checkbox.picker-hover ,.picker-camerasyncsepara=
tor.picker-selected .picker-camerasyncseparator-checkbox {opacity: 1;}
..picker-camerasyncseparator.picker-selected .picker-camerasyncseparator-che=
ckbox.picker-hover {opacity: 0.8;}
..picker-camerasyncseparator-title {display: inline-block; font-size: 18px; =
padding: 2px 12px 0px 6px; vertical-align: middle;}
..picker-camerasyncseparator-details {display: inline-block; padding: 4px 12=
px 0px 0px; vertical-align: middle;}
..picker-camerasyncseparator-select-link {color: rgb(17, 85, 204); cursor: p=
ointer; display: inline-block; padding-top: 4px; vertical-align: middle;}
..picker-camerasyncseparator-select-link.picker-hover {text-decoration: unde=
rline;}
..picker-collection-control-title {color: rgb(68, 68, 68); display: inline-b=
lock; font-size: 14px; height: 16px; margin-bottom: 2px; margin-top: 10px; =
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
..picker-collection-control-totalitems ,.picker-collection-control-timestamp=
{color: rgb(170, 170, 170); display: inline-block; font-size: 11px; margin=
: 0px 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
..picker-collection-control-timestamp::before {color: rgb(170, 170, 170); co=
ntent: "*"; font-size: 5px; vertical-align: middle;}
..picker-collection-control .picker-photosgrid .picker-dataview-content {pad=
ding: 0px;}
..picker-collection-control .picker-content {height: 100%; position: relativ=
e; overflow: visible;}
..picker-collectionsgrid {padding-left: 18px;}
..picker-collection-control-border {opacity: 0; transition: opacity 0.218s e=
ase 0s; position: relative;}
..picker-collection-control-checked .picker-collection-control-border {borde=
r: 5px solid rgb(66, 133, 244); padding: 0px; max-height: 207px;}
..picker-collection-control {cursor: default; display: inline-block; margin:=
5px 10px 0px 0px; padding: 0px 10px; outline: medium none; text-align: lef=
t; vertical-align: middle;}
..picker-docscollection-control {position: relative; margin: 10px; cursor: p=
ointer;}
..picker-docscollection-control-preview-container {position: relative;}
..picker-docscollection-control-preview-content {border: 6px solid transpare=
nt; bottom: 0px; left: 31px; position: absolute;}
..picker-docscollection-control-checked .picker-docscollection-control-previ=
ew-content {border: 6px solid rgb(77, 144, 254);}
..picker-docscollection-control-hover .picker-docscollection-control-preview=
-content {background-color: rgb(252, 249, 204);}
..picker-docscollection-control-focused .picker-docscollection-control-previ=
ew-content {outline: 1px solid rgb(66, 133, 244);}
..picker-docscollection-control-preview {background: rgb(238, 238, 238) none=
repeat scroll 0% 0%; border: 1px solid rgb(206, 206, 206); height: 116px; =
outline: medium none; position: relative; width: 116px;}
..picker-docscollection-control-child-1 {position: absolute; border: 1px sol=
id rgb(206, 206, 206); width: 116px; height: 116px; left: 2px; top: 2px;}
..picker-docscollection-control-child-2 {position: absolute; border: 1px sol=
id rgb(206, 206, 206); width: 116px; height: 116px; left: 4px; top: 4px;}
..picker-docscollection-control-preview .picker-spr-collection {display: inl=
ine-block; position: absolute; left: 51px; top: 51px;}
..picker-docscollection-control .jfk-checkbox {background-color: rgb(252, 24=
9, 204); display: none; outline: 4px solid rgb(252, 249, 204); position: ab=
solute; top: 1px;}
..picker-docscollection-control .jfk-checkbox.jfk-checkbox-checked {backgrou=
nd-color: rgb(255, 255, 255); display: inline-block; outline: medium none;}
..picker-docscollection-control-hover .jfk-checkbox {display: inline-block;}
..picker-dataview.picker-docs-images-view {padding-top: 0px;}
..picker-docs-images-view .new-upload-box .picker-photo-control-placeholder =
{border: 0px none;}
..picker-docs-images-label {font-size: 12px; overflow: hidden; padding-botto=
m: 6px; padding-top: 6px; text-align: center; text-overflow: ellipsis; whit=
e-space: nowrap;}
..picker-docs-images-preview {position: relative;}
..picker-docs-images-preview-content {border: 6px solid transparent; bottom:=
0px; outline: medium none; position: absolute;}
..picker-docs-images-focused .picker-docs-images-preview-content {outline: 1=
px solid rgb(66, 133, 244);}
..picker-docs-images-checked .picker-docs-images-preview-content {border: 6p=
x solid rgb(77, 144, 254);}
..picker-docs-images-preview-content .jfk-checkbox {background-color: rgb(25=
2, 249, 204); display: none; outline: 4px solid rgb(252, 249, 204); positio=
n: absolute; top: 1px;}
..picker-docs-images-preview-content .jfk-checkbox.jfk-checkbox-checked {bac=
kground-color: rgb(255, 255, 255); display: inline-block; outline: medium n=
one;}
..picker-docs-images-hover .picker-docs-images-preview-content .jfk-checkbox=
{display: inline-block;}
..picker-docs-images-preview-placeholder {border: 1px solid rgb(229, 229, 22=
9); bottom: 0px; outline: medium none; position: absolute;}
..picker-docs-images-hover .picker-docs-images-preview-content {background-c=
olor: rgb(252, 249, 204);}
..picker-photo-control-unselectable.picker-docs-images-hover .picker-docs-im=
ages-preview-content {background-color: transparent;}
..picker-photo-control-unselectable.picker-docs-images-hover .jfk-checkbox {=
display: none;}
..picker-photo-control-unselectable.picker-docs-images-container {opacity: 0=
..3; position: relative;}
..picker-docs-images-container {margin: 10px;}
..picker-docs-images-preview .nub-loading {display: none;}
..picker-drive-view .picker-searchbar {border-bottom: 1px solid rgb(229, 229=
, 229); margin-bottom: 0px; margin-left: 0px; padding-bottom: 15px;}
..picker-main-container .picker-drive-view.picker-dataview .picker-searchbar=
.picker-flat-menu-button {left: 341px;}
..picker-drive-view .picker-searchbar-input-logo ,.picker-drive-view .picker=
-searchbar-input {padding-left: 20px;}
..picker-dataview.picker-drive-view {overflow-y: hidden;}
..picker-drive-view .picker-content-container {bottom: 0px; left: 0px; overf=
low-y: auto; position: absolute; right: 0px; top: 69px;}
..picker-docs-images-view .picker-dataview-content {padding-left: 13px; padd=
ing-top: 10px;}
..picker-caption-bubble .picker-edit-caption-instructions {color: rgb(0, 0, =
0); font-size: 13px; margin-top: 3px;}
..picker-caption-bubble .picker-edit-caption-popup {padding: 0px 16px 0px 0p=
x; border: 0px none; margin: 0px;}
..picker-caption-bubble {z-index: 2112 !important;}
..picker-edit-caption {z-index: 2109; position: absolute;}
..picker-crop-content .picker-edit-caption {margin-top: 8px;}
..picker-crop-content .picker-edit-caption-hint {margin-top: 2px;}
..picker-crop-content .picker-edit-caption-popup {margin: 1px 0px 2px;}
..picker-edit-caption-hint ,.picker-crop-content .picker-edit-caption-hover =
..picker-edit-caption-hint {color: rgb(17, 85, 204); font-size: 13px; width:=
100%; overflow: hidden; text-align: center; text-overflow: ellipsis; white=
-space: nowrap; position: absolute; cursor: pointer;}
..picker-crop-content .picker-edit-caption-hint {color: rgb(153, 153, 153);}
..picker-edit-caption-hint.picker-video-control-metadata {text-align: left; =
width: 100%; margin-left: 0px;}
..picker-edit-caption-hint .picker-video-control-title {color: rgb(17, 85, 2=
04);}
..picker-edit-caption-input {width: 100%; margin: 0px 0px 0px -2px;}
..picker-edit-caption-instructions {color: rgb(102, 102, 102); font-size: 10=
px; margin-top: 2px;}
..picker-edit-caption-popup {background: rgb(255, 255, 255) none repeat scro=
ll 0% 0%; padding: 4px; border: 1px solid rgb(102, 102, 102); margin: 0px 0=
px 2px;}
..picker-crop-content .picker-edit-caption-popup {border: 1px solid transpar=
ent;}
..picker-main-container .picker-edit-toolbar-overlay {background-attachment:=
scroll; background-clip: border-box; position: relative; z-index: 2106; fo=
nt: 12px Roboto,Arial,sans-serif; margin: 0px; outline: medium none; paddin=
g: 0px;}
..picker-main-container .picker-edit-toolbar-overlay-background-dark {positi=
on: absolute; z-index: 2107; background-color: rgb(0, 0, 0); opacity: 0.6; =
width: 100%; height: 100%;}
..picker-main-container .picker-edit-toolbar-overlay-container {position: re=
lative; z-index: 2108;}
..picker-edit-toolbar-manager {position: relative;}
..picker-edit-toolbar {cursor: default; position: relative; z-index: 2106; f=
ont: 12px Roboto,Arial,sans-serif; margin: 0px; outline: medium none; paddi=
ng: 2px; background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; border: 0px=
none;}
..picker-edit-toolbar .goog-toolbar-button {margin: 0px; border: 0px none; p=
adding: 0px; font-family: Roboto,Arial,sans-serif; color: rgb(51, 51, 51); =
text-decoration: none; list-style: outside none none; vertical-align: middl=
e; cursor: default; outline: medium none; opacity: 0.8;}
..picker-edit-toolbar .goog-toolbar-button-outer-box ,.picker-edit-toolbar .=
goog-toolbar-button-inner-box {border: 0px none; vertical-align: top;}
..picker-edit-toolbar .goog-toolbar-button-outer-box {margin: 0px; padding: =
1px 0px;}
..picker-edit-toolbar .goog-toolbar-button-inner-box {margin: 0px -1px; padd=
ing: 3px 4px;}
* html .picker-edit-toolbar .goog-toolbar-button-inner-box ,body .picker-ed=
it-toolbar .goog-toolbar-button-inner-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-button-o=
uter-box ,body .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-=
button-outer-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-button-i=
nner-box ,body .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-=
button-inner-box {right: auto;}
:first-child + html .picker-edit-toolbar .goog-toolbar-button-inner-box {le=
ft: -1px;}
:first-child + html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-too=
lbar-button-inner-box {left: 1px; right: auto;}
..picker-edit-toolbar .goog-toolbar-button-disabled {opacity: 0.3;}
..picker-edit-toolbar .goog-toolbar-button-disabled .goog-toolbar-button-out=
er-box ,.picker-edit-toolbar .goog-toolbar-button-disabled .goog-toolbar-bu=
tton-inner-box {color: rgb(51, 51, 51) !important; border-color: rgb(153, 1=
53, 153) !important;}
* html .picker-edit-toolbar .goog-toolbar-button-disabled ,:first-child + h=
tml .picker-edit-toolbar .goog-toolbar-button-disabled ,body .picker-edit-t=
oolbar .goog-toolbar-button-disabled {background-color: rgb(238, 238, 238);=
margin: 0px 1px; padding: 0px 1px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-outer-=
box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-=
outer-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar-=
button-outer-box ,.picker-edit-toolbar .goog-toolbar-button-selected .goog-=
toolbar-button-outer-box {border-width: 1px 0px; border-style: solid; paddi=
ng: 0px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-inner-=
box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-=
inner-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar-=
button-inner-box ,.picker-edit-toolbar .goog-toolbar-button-selected .goog-=
toolbar-button-inner-box {border-width: 0px 1px; border-style: solid; paddi=
ng: 3px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-outer-=
box ,.picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-i=
nner-box {border-color: transparent !important;}
..picker-edit-toolbar .goog-toolbar-button-hover ,.picker-edit-toolbar .goog=
-toolbar-button-active ,.picker-edit-toolbar .goog-toolbar-button-checked ,=
..picker-edit-toolbar .goog-toolbar-button-selected {background-color: trans=
parent !important; opacity: 1;}
..picker-edit-toolbar .goog-toolbar-button-hover ,.picker-edit-toolbar .goog=
-toolbar-button-active ,.picker-edit-toolbar .goog-toolbar-button-checked ,=
..picker-edit-toolbar .goog-toolbar-button-selected {background: rgba(0, 0, =
0, 0) none repeat scroll 0% 0%;}
..picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-outer=
-box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button=
-inner-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar=
-button-outer-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-=
toolbar-button-inner-box ,.picker-edit-toolbar .goog-toolbar-button-selecte=
d .goog-toolbar-button-outer-box ,.picker-edit-toolbar .goog-toolbar-button=
-selected .goog-toolbar-button-inner-box {border-color: transparent;}
..picker-edit-toolbar .goog-toolbar-button-collapse-right ,.picker-edit-tool=
bar .goog-toolbar-button-collapse-right .goog-toolbar-button-outer-box ,.pi=
cker-edit-toolbar .goog-toolbar-button-collapse-right .goog-toolbar-button-=
inner-box {margin-right: 0px;}
..picker-edit-toolbar .goog-toolbar-button-collapse-left ,.picker-edit-toolb=
ar .goog-toolbar-button-collapse-left .goog-toolbar-button-outer-box ,.pick=
er-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolbar-button-inn=
er-box {margin-left: 0px;}
* html .picker-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolba=
r-button-inner-box ,:first-child + html .picker-edit-toolbar .goog-toolbar-=
button-collapse-left .picker-edit-toolbar .goog-toolbar-button-inner-box ,b=
ody .picker-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolbar-b=
utton-inner-box {left: 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button {margin: 0px 2px; border: 0p=
x none; padding: 0px; font-family: Roboto,Arial,sans-serif; color: rgb(51, =
51, 51); text-decoration: none; list-style: outside none none; vertical-ali=
gn: middle; cursor: default; outline: medium none;}
..picker-edit-toolbar .goog-toolbar-menu-button-outer-box ,.picker-edit-tool=
bar .goog-toolbar-menu-button-inner-box {border: 0px none; vertical-align: =
top;}
..picker-edit-toolbar .goog-toolbar-menu-button-outer-box {margin: 0px; padd=
ing: 1px 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button-inner-box {margin: 0px -1px;=
padding: 3px 4px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-inner-box ,body .pick=
er-edit-toolbar .goog-toolbar-menu-button-inner-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .goog-toolbar-men=
u-button-outer-box ,body .picker-edit-toolbar .goog-toolbar-menu-button-rtl=
.goog-toolbar-menu-button-outer-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .goog-toolbar-men=
u-button-inner-box ,body .picker-edit-toolbar .goog-toolbar-menu-button-rtl=
.goog-toolbar-menu-button-inner-box {right: auto;}
:first-child + html .picker-edit-toolbar .goog-toolbar-menu-button-inner-bo=
x {left: -1px;}
:first-child + html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .pic=
ker-edit-toolbar .goog-toolbar-menu-button-inner-box {left: 1px; right: aut=
o;}
..picker-edit-toolbar .goog-toolbar-menu-button-disabled {opacity: 0.3;}
..picker-edit-toolbar .goog-toolbar-menu-button-disabled .goog-toolbar-menu-=
button-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-disabled .=
goog-toolbar-menu-button-inner-box {color: rgb(51, 51, 51) !important; bord=
er-color: rgb(153, 153, 153) !important;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-disabled ,:first-chil=
d + html .picker-edit-toolbar .goog-toolbar-menu-button-disabled ,body .pic=
ker-edit-toolbar .goog-toolbar-menu-button-disabled {background-color: rgb(=
238, 238, 238); margin: 0px 1px; padding: 0px 1px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog-=
toolbar-menu-button-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-butt=
on-open .goog-toolbar-menu-button-outer-box {border-width: 1px 0px; border-=
style: solid; padding: 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog-=
toolbar-menu-button-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-butt=
on-open .goog-toolbar-menu-button-inner-box {border-width: 0px 1px; border-=
style: solid; padding: 3px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-t=
oolbar-menu-button-inner-box {border-color: rgb(192, 192, 192) !important;}
..picker-edit-toolbar .goog-toolbar-menu-button-active ,.picker-edit-toolbar=
.goog-toolbar-menu-button-open {background-color: rgb(238, 238, 238) !impo=
rtant;}
..picker-edit-toolbar .goog-toolbar-menu-button-active .goog-toolbar-menu-bu=
tton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog=
-toolbar-menu-button-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-but=
ton-open .goog-toolbar-menu-button-outer-box ,.picker-edit-toolbar .goog-to=
olbar-menu-button-open .goog-toolbar-menu-button-inner-box {border-color: r=
gb(187, 187, 187);}
..picker-edit-toolbar .goog-toolbar-menu-button-caption {padding: 0px 4px 0p=
x 0px; vertical-align: middle;}
..picker-edit-toolbar .goog-toolbar-menu-button-dropdown {width: 7px; backgr=
ound: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no=
-repeat scroll -388px center; vertical-align: middle;}
..picker-edit-toolbar .goog-toolbar-separator {margin: 0px 2px; border-left:=
1px solid rgb(214, 214, 214); border-right: 1px solid rgb(247, 247, 247); =
padding: 0px; width: 0px; text-decoration: none; list-style: outside none n=
one; outline: medium none; vertical-align: middle; line-height: normal; fon=
t-size: 120%; overflow: hidden;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-outer-b=
ox {border-width: 1px 0px; border-style: solid; padding: 0px;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-inner-b=
ox {border-width: 0px 1px; border-style: solid; padding: 3px;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-outer-b=
ox ,.picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-inn=
er-box {border-color: rgb(191, 203, 223);}
..picker-actionpane-evph-message {position: absolute; top: 50%; height: 18px=
; margin-top: -9px; font-size: 13px; color: rgb(102, 102, 102);}
..picker-actionpane-evph-people {font-size: 13px; color: rgb(34, 34, 34); wi=
dth: 284px;}
..picker-actionpane-evph-people-title {font-weight: bold; padding-bottom: 8p=
x;}
..picker-actionpane-evph-people-img {border-radius: 2px; margin-right: 1px; =
border: 0px none;}
..picker-evph-people-jfk-bubble {z-index: 2200 !important;}
..picker-evph-plain-link {color: rgb(17, 85, 204); text-decoration: none; cu=
rsor: pointer;}
..picker-eventtheme-view .picker-listrenderer-table {margin: 15px 0px;}
..picker-eventtheme-border {position: relative; border: 1px solid rgb(204, 2=
04, 204);}
..picker-eventtheme-control-tablerow {outline: medium none;}
..picker-eventtheme-media {vertical-align: middle; cursor: pointer;}
..picker-eventtheme-control-tablerow.picker-list-control-checked {background=
-color: transparent;}
..picker-eventtheme {border: 6px solid transparent; margin: 5px 20px;}
..picker-list-control-checked.picker-list-control-focused .picker-eventtheme=
,.picker-list-control-checked .picker-eventtheme {border: 6px solid rgb(74=
, 151, 223);}
..picker-list-control-focused .picker-eventtheme-border {border: 1px solid r=
gb(77, 144, 254);}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper.picker-featuredpho=
to-control {font-size: 12px; height: 170px; position: relative;}
..picker-featuredphoto-caption {overflow: hidden; position: absolute; text-a=
lign: left; text-overflow: ellipsis; white-space: nowrap;}
..picker-gmailfeaturedphoto-caption {bottom: 5px; box-sizing: border-box; ov=
erflow: hidden; position: absolute; text-overflow: ellipsis; white-space: n=
owrap; width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-border {opacity: 0; transi=
tion: opacity 0.218s ease 0s; padding: 5px; position: relative;}
..picker-flatphoto-control-checked .picker-flatphoto-control-border {border:=
5px solid rgb(66, 133, 244); padding: 0px;}
..picker-flatphoto-control-focused .picker-flatphoto-control-border {outline=
: 1px solid rgb(66, 133, 244);}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper {cursor: pointer; =
display: inline-block; margin: 10px; outline: medium none; text-align: cent=
er; vertical-align: middle;}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper-with-description {=
position: relative;}
..picker-flatphoto-control-description {font-size: 12px; bottom: 5px; box-si=
zing: border-box; overflow: hidden; padding: 0px 5px; position: absolute; t=
ext-overflow: ellipsis; white-space: nowrap; width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-thumbnail {max-height: 100=
%; max-width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-hover .picker-flatphoto-co=
ntrol-check {opacity: 0.7;}
..picker-flatphotosgrid .picker-flatphoto-control-checked .picker-flatphoto-=
control-check {opacity: 1; top: 5px; left: 5px;}
..picker-flatphotosgrid .picker-flatphoto-control-check {opacity: 0; transit=
ion: opacity 0.218s ease 0s; position: absolute; top: 10px; left: 10px; z-i=
ndex: 2104;}
..picker-flatphotosgrid .picker-spr-rio-checkmark-selected {animation: 0.3s =
linear 0s normal none 1 running pickerPhotosSelectionOverlayCheckmarkSelect=
edTransition;}
..picker-flatphoto-control-unselectable {opacity: 0.3;}
..picker-flatphoto-control-unselectable .picker-flatphoto-control-check {dis=
play: none;}
..picker-flatphoto-message .picker-dataview-message {color: rgb(51, 51, 51);=
font-size: 16px; height: 16px; line-height: 16px; margin-top: -8px; positi=
on: absolute; text-align: center; top: 50%; width: 100%;}
..picker-highlightsphoto-control-border {opacity: 0; transition: opacity 0.2=
18s ease 0s; overflow: hidden;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-bor=
der {display: inline-block; position: relative;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-inn=
er-border {border: 3px solid rgb(66, 133, 244); display: inline-block; left=
: 0px; opacity: 1; position: absolute; top: 0px; z-index: 2104;}
..picker-highlightsphoto-control-focused {outline: medium none;}
..picker-highlightsphoto-control-focused .picker-highlightsphoto-control-bor=
der {outline: 1px solid rgb(66, 133, 244);}
..picker-highlightsphoto-control {cursor: pointer; display: inline-block; ve=
rtical-align: top;}
..picker-highlightsphoto-control-border {display: inline-block; margin: 1px;=
position: relative;}
..picker-highlightsphoto-control-inner-border {border: 3px solid transparent=
; display: none;}
..picker-highlightsphoto-control-hover {opacity: 0.7;}
..picker-highlightsphoto-control-checked {opacity: 1;}
..picker-highlightsphoto-control-hover .picker-highlightsphoto-control-check=
{opacity: 0.7;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-che=
ck {opacity: 1; left: 10px; top: 10px;}
..picker-highlightsphoto-control-check {transition: opacity 0.218s ease 0s; =
left: 10px; opacity: 0; position: absolute; top: 10px; z-index: 2104;}
..picker-highlightsphoto-control-unselectable {opacity: 0.3;}
..picker-highlightsphoto-control-unselectable .picker-highlightsphoto-contro=
l-check {display: none;}
..picker-momentscontrol-wrapper .picker-flatphoto-control-border {display: i=
nline-block; vertical-align: middle;}
..picker-momentscontrol-wrapper .picker-flatphoto-control-thumbnail {display=
: block;}
..picker-momentscontrol-wrapper.picker-flatphoto-control-wrapper {line-heigh=
t: 140px;}
..picker-momentchapter-title {color: rgb(85, 85, 85); font-size: 15px; font-=
weight: bold; padding: 20px 0px 0px 20px;}
..picker-collection-more-control {transition: background-color 130ms ease-in=
-out 0s; background-color: rgb(229, 229, 229); cursor: pointer; display: in=
line-block; margin: 1px; text-align: center; vertical-align: top; width: 40=
px;}
..picker-collection-more-control-content ,.picker-collection-more-control-im=
g {display: inline-block; margin: auto;}
..picker-collection-more-control-text {color: rgb(153, 153, 153); display: i=
nline-block; font-size: 12px; margin: 0px 2px; text-align: center; width: 3=
5px;}
..picker-collection-more-control-focused {outline: 1px solid rgb(66, 133, 24=
4);}
..picker-collection-more-control-hover {background-color: rgb(224, 224, 224)=
;}
..picker-noitemszone {height: 100%; left: 0px; position: absolute; text-alig=
n: center; top: 0px; width: 100%;}
..picker-noitemszone-container {text-align: center;}
..picker-noitemszone-text {color: rgb(170, 170, 170); font-size: 14px; font-=
weight: bold; margin: 20px 0px; text-align: center;}
..picker-noitemszone-title {color: rgb(170, 170, 170); font-size: 20pt; font=
-weight: bold; margin: 20px 0px; text-align: center;}
..picker-noitemszone-container .jfk-button {margin: 20px 0px;}
..picker-photo-album-control {border-bottom: 1px solid rgb(218, 218, 218); c=
ursor: pointer; font-size: 13px; left: -18px; outline: 0px none; padding: 2=
0px 25px; position: relative; top: -15px; width: 100%;}
..picker-photo-album-control-hover ,.picker-photo-album-control-focused {bac=
kground: rgb(243, 243, 243) none repeat scroll 0% 0%;}
..picker-photo-album-control-checked {background: rgb(77, 144, 254) none rep=
eat scroll 0% 0%; color: rgb(255, 255, 255);}
..picker-photo-album-control-title {padding-right: 10px;}
..picker-photo-album-control-new-album-label {padding-bottom: 8px;}
..picker-photo-album-control-name-edit {border-radius: 1px; box-sizing: bord=
er-box; border: 1px solid rgb(216, 216, 216); color: rgb(51, 51, 51); displ=
ay: inline-block; height: 29px; line-height: 20px; margin: 0px; padding: 8p=
x; width: 325px;}
..picker-photo-album-control-date {color: rgb(153, 153, 153); font-size: 12p=
x; padding-right: 5px;}
..picker-photo-album-control-checked .picker-photo-album-control-date {color=
: rgb(204, 204, 204);}
..picker-photo-album-control-caption {color: rgb(102, 102, 102); font-size: =
12px; padding-right: 8px;}
..picker-photo-album-control-checked .picker-photo-album-control-caption {co=
lor: rgb(204, 204, 204);}
..picker-photo-album-control-thumbs {height: 65px; overflow: hidden;}
..picker-photo-album-control-thumb {background-color: rgb(255, 255, 255); bo=
rder: 1px solid rgb(221, 221, 221); height: 48px; margin: 5px 8px 3px 1px; =
padding: 2px; width: 48px;}
..picker-photoalbumsview-actionpane-notice {cursor: default; float: right; h=
eight: 100%; margin-left: -30px;}
..picker-photoalbumsview-actionpane-notice .picker-actionpane-notice-td {col=
or: rgb(119, 119, 119); font-size: 11px; padding-right: 20px; text-align: r=
ight;}
..picker-curation-album-name-bar-album-select ,.picker-curation-album-name-b=
ar-album-select.goog-flat-menu-button-hover {background: rgb(255, 255, 255)=
none repeat scroll 0% 0%; height: 37px; line-height: 37px; margin-left: 15=
px; max-width: 300px; padding-left: 10px; text-align: left;}
..picker-curation-album-name-bar-album-select .goog-flat-menu-button-caption=
{max-width: 200px; overflow: hidden; padding: 0px 15px 0px 5px; text-overf=
low: ellipsis;}
..picker-curation-album-name-bar-album-select .goog-flat-menu-button-dropdow=
n {border: medium none; right: 10px; top: 10px;}
..picker-curation-album-name-bar .goog-menu {max-height: 300px; overflow-x: =
hidden; overflow-y: scroll; text-overflow: ellipsis; width: 280px; z-index:=
2115;}
..picker-curation-album-name-bar-empty-menu .goog-menu {height: 100px;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-empty-menu =
..picker-loadingstatusbox {top: 70%; display: inline-block;}
..picker-curation-album-name-bar .picker-loadingstatusbox {display: none;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-select-labe=
l-input {border-bottom: 1px solid rgb(204, 204, 204); margin-bottom: 4px; h=
eight: 36px; line-height: 36px;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-select-labe=
l-input .jfk-textinput {box-shadow: none; border: medium none; padding: 0px=
16px; position: absolute; top: 0px; left: 0px; vertical-align: top; width:=
232px;}
..picker-curation-album-name-bar .goog-menuitem {padding: 6px 15px; width: 2=
32px;}
..picker-curation-album-name-bar .goog-menuitem-highlight {border-width: 0px=
;}
..picker-curation-album-name-bar .goog-menuitem-content {line-height: 24px; =
overflow: hidden; text-align: left; text-overflow: ellipsis; width: 250px;}
..picker-curation-album-name-bar-album-label-input {display: inline-block; m=
argin-left: 15px; position: relative;}
..picker-curation-album-name-bar-album-label-input .jfk-textinput {padding-r=
ight: 30px;}
..picker-curation-album-name-bar-album-label-input .picker-spr-black-close {=
opacity: 0.5; cursor: pointer; position: absolute; right: 14px; top: 28px;}
..picker-curation-order-dropdown-menu.goog-flat-menu-button-disabled {opacit=
y: 0.1;}
..picker-curation-view {height: 100%; position: absolute; top: 0px; bottom: =
0px; left: 0px; right: 0px;}
..picker-curation-grid-parent {position: absolute; top: 0px; bottom: 0px; le=
ft: 0px; right: 0px;}
..picker-curation-grid-wrapper {position: absolute; bottom: 0px; left: 0px; =
right: 0px;}
..picker-curation-bar {border-bottom: 1px solid rgb(229, 229, 229); line-hei=
ght: 64px; padding: 0px 20px;}
..picker-curation-bar .jfk-button ,.picker-curation-bar .goog-flat-button ,.=
picker-curation-bar .goog-flat-menu-button {cursor: pointer;}
..picker-curation-grid-wrapper {top: 71px; overflow-y: auto; overflow-x: hid=
den;}
..picker-curation-grid-parent {margin: 35px 15px 0px;}
..picker-curation-grid-parent .picker-dataview {overflow: visible; margin: 0=
px 0px 0px 20px; right: 20px;}
..picker-curation-hidden-input {position: absolute; top: -9999px; width: 1px=
; height: 1px;}
..picker-curation-bar .jfk-textinput {color: rgb(34, 34, 34); font-weight: b=
old; height: 37px; left: 20px; padding-bottom: 0px; padding-top: 0px; top: =
13px; width: 200px;}
..picker-curation-order-dropdown-menu {transition: all 0.218s ease 0s; backg=
round: rgb(241, 241, 241) none repeat scroll 0% 0%; border: 1px solid rgb(2=
16, 216, 216); height: 33px; line-height: 30px; vertical-align: middle; dis=
play: inline-block; margin-left: 20px;}
..picker-curation-order-dropdown-menu .goog-flat-menu-button-dropdown {borde=
r: medium none; display: inline-block; right: 10px; top: 10px;}
..picker-curation-bar {background: rgb(255, 255, 255) none repeat scroll 0% =
0%; height: 65px; text-align: right;}
..picker-curation-bar-left {position: absolute; text-align: left; z-index: 2=
120;}
..picker-curation-bar-toggles {border-radius: 2px; display: inline-block; he=
ight: 37px; line-height: 37px; margin-left: 20px; vertical-align: middle; b=
order: 1px solid rgb(216, 216, 216);}
..picker-curation-bar-toggles .goog-flat-button {opacity: 0.4; transition: a=
ll 0.218s ease 0s; background: rgb(255, 255, 255) none repeat scroll 0% 0%;=
margin: 0px; outline: medium none;}
..picker-curation-bar-toggles .goog-flat-button-checked {opacity: 1; backgro=
und: rgb(229, 229, 229) none repeat scroll 0% 0%;}
..picker-curation-bar-toggles .goog-flat-button.picker-curation-bar-large-th=
umb {padding: 9px;}
..picker-curation-bar-toggles .goog-flat-button.picker-curation-bar-small-th=
umb {padding: 13px;}
..picker-curation-upload-button-content {color: rgb(115, 115, 115); font-siz=
e: 13px; margin: 0px 4px;}
..picker-curation-view .picker-dropdown-menu.picker-curation-order-dropdown-=
menu {background: rgb(255, 255, 255) none repeat scroll 0% 0%; height: 37px=
; min-width: 37px; padding: 0px; text-align: center; vertical-align: middle=
; width: 37px; z-index: auto;}
..picker-curation-progress-parent {display: inline-block; vertical-align: mi=
ddle; transition: margin-top 0.218s ease 0s, opacity 0.218s ease 0s;}
..picker-curation-bar .picker-progress-bar {display: inline-block; font-size=
: 12px; vertical-align: middle;}
..picker-curation-bar .picker-curation-progress-label {display: inline-block=
; vertical-align: middle;}
..picker-curation-bar .picker-curation-progress-stop-upload ,.picker-curatio=
n-bar .jfk-textinput {display: inline-block; font-size: 12px; vertical-alig=
n: middle;}
..picker-curation-bar .picker-progress-bar {margin-left: 20px; width: 150px;=
}
..picker-curation-view .picker-progress-bar {border: 1px solid rgb(187, 187,=
187); background-color: rgb(229, 229, 229); box-shadow: 0px 0px 1px rgba(0=
, 0, 0, 0.2) inset;}
..picker-curation-view .progress-bar-thumb {border: 1px solid rgb(33, 117, 2=
55); background-color: rgb(77, 144, 254);}
..picker-curation-view .picker-progress-bar {height: 4px;}
..picker-curation-view .progress-bar-thumb {height: 4px; position: absolute;=
left: -1px; top: -1px;}
..picker-curation-bar .picker-curation-progress-label {margin-left: 10px; co=
lor: rgb(153, 153, 153); font-size: 12px;}
..picker-curation-bar .picker-curation-progress-stop-upload {margin-left: 10=
px; padding: 0px;}
..picker-curation-bar .jfk-button {transition: all 0.218s ease 0s; backgroun=
d: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid rgb(216, =
216, 216); height: 38px; line-height: 37px; margin: 0px; position: static; =
right: 20px; top: 17px;}
..picker-curation-bar .picker-spr-icon-computer {display: inline-block; marg=
in-right: 8px; vertical-align: middle; opacity: 0.8;}
..picker-curation-bar .jfk-button.jfk-button-focused .picker-spr-icon-comput=
er ,.picker-curation-bar .jfk-button.jfk-button-active .picker-spr-icon-com=
puter ,.picker-curation-bar .jfk-button.jfk-button-hover .picker-spr-icon-c=
omputer {opacity: 1;}
..picker-curation-drop-notice-parent {color: rgb(153, 153, 153); cursor: def=
ault; font-weight: bold; font-size: 13px; height: 65px; margin: auto; line-=
height: 65px; text-align: center; top: 0px;}
..picker-curation-drop-notice-text {padding: 0px 10px;}
..picker-spr-icon-zoom-min ,.picker-spr-icon-zoom-max ,.picker-curation-albu=
m-name-bar {display: inline-block;}
..picker-spr-icon-zoom-max {margin-left: 10px;}
..picker-spr-icon-zoom-min {margin-right: 5px;}
..picker-curation-drag-selector {z-index: 2200; position: absolute; border: =
1px solid rgba(136, 190, 190, 0.3); background: rgba(136, 187, 255, 0.4) no=
ne repeat scroll 0% 0%; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); border=
-radius: 2px; opacity: 0.8;}
..picker-curation-drag-scroll-mask {position: absolute; top: 0px; bottom: 0p=
x; left: 0px; right: 0px; opacity: 0; z-index: 2200;}
..picker-curation-drag-pile {position: absolute;}
..picker-curation-view .tt-photos-tagging-tcontent-button-container {display=
: none;}
..picker-curation-upload.picker-actionpane-frame {z-index: 2115; background-=
color: rgb(255, 255, 255);}
..picker-curation-drop-notice-parent .picker-actionpane-notice-td {border-ri=
ght: 128px solid transparent;}
..picker-curationview-autobackup-icon {height: 20px; margin: 8px; top: 14px;=
width: 20px;}
..picker-curationview-autobackup-promo {color: rgb(170, 170, 170); font-size=
: 13px; text-align: center; top: -53px; vertical-align: middle; width: 100%=
;}
..picker-curation-control {transition: border-color 0.2s ease 0s, margin 0.5=
s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease-out 0=
s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease 0s, b=
ox-shadow 0.5s ease 0s; border-radius: 4px; outline: medium none; backgroun=
d-color: rgb(245, 245, 245); border-color: rgb(208, 208, 208); border-style=
: solid; border-width: 1px; overflow: hidden;}
..picker-curation-control.picker-curation-fast ,.picker-curation-control.pic=
ker-curation-fast .picker-curation-control-card ,.picker-curation-control.p=
icker-curation-fast-thumb .picker-curation-control-thumb-wrapper ,.picker-c=
uration-control.picker-curation-fast-thumb .picker-curation-control-thumb ,=
..picker-curation-control.picker-curation-fast-thumb .picker-curation-contro=
l-thumb-border ,.picker-curation-control.picker-curation-control-selected-r=
eordering .picker-curation-control-thumb-wrapper {transition: margin 0s eas=
e 0s, height 0s ease 0s, width 0s ease 0s, opacity 0.5s ease-out 0s, top 0s=
ease 0s, left 0s ease 0s;}
..picker-curation-control.picker-curation-fast .picker-curation-control-thum=
b-wrapper ,.picker-curation-control.picker-curation-fast .picker-curation-c=
ontrol-thumb ,.picker-curation-control.picker-curation-fast .picker-curatio=
n-control-thumb-border {transition: margin 0s ease 0s, height 0s ease 0s, w=
idth 0s ease 0s, opacity 0.5s ease-out 0s, top 0.5s ease 0s, left 0.5s ease=
0s;}
..picker-curation-control.picker-curation-control-rotating .picker-curation-=
control-thumb ,.picker-curation-control.picker-curation-control-rotating .p=
icker-curation-control-thumb-wrapper { }
..picker-curation-control.picker-curation-control-rotating .picker-curation-=
control-thumb-wrapper .picker-curation-control-thumb-border {transition: -w=
ebkit-transform 0.2s ease-in-out 0s;}
..picker-curation-control-card {transition: border-color 0.2s ease 0s, margi=
n 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease-=
out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease =
0s, box-shadow 0.5s ease 0s;}
..picker-curation-control ,.picker-curation-control-card ,.picker-curation-c=
ontrol-thumb-wrapper ,.picker-curation-control-upload-preview {position: ab=
solute;}
..picker-curation-control-thumb-wrapper {text-align: center; transition: bor=
der-color 0.2s ease 0s, margin 0.5s ease 0s, height 0.5s ease 0s, width 0.5=
s ease 0s, opacity 0.5s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-o=
ut 0s, line-height 0.5s ease 0s, box-shadow 0.5s ease 0s; border-radius: 1p=
x; margin-top: -2px;}
..picker-curation-control-thumb {transition: border-color 0.2s ease 0s, marg=
in 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease=
-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease=
0s, box-shadow 0.5s ease 0s; cursor: default; position: relative; line-hei=
ght: 0;}
..picker-curation-control-thumb-border {transition: border-color 0.2s ease 0=
s, margin 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.=
5s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.=
5s ease 0s, box-shadow 0.5s ease 0s; cursor: default; line-height: 0; posit=
ion: relative; display: inline-block; vertical-align: middle; background-co=
lor: rgb(255, 255, 255);}
..picker-curation-control-thumb-border-lines {transition: border-color 0.2s =
ease 0s; position: absolute; top: -3px; left: -3px; right: -3px; bottom: -3=
px; border: 2px solid transparent; z-index: 2107;}
..picker-curation-control-selected.picker-curation-control {border-color: rg=
b(77, 144, 254);}
..picker-curation-control-tag-adding-mode {position: absolute; display: inli=
ne-block; z-index: 2114;}
..picker-curation-control-toolbar {background: rgb(255, 255, 255) none repea=
t scroll 0% 0%; border-top: 1px solid rgb(208, 208, 208); overflow: hidden;=
cursor: default; line-height: 42px; height: 42px; position: absolute; bott=
om: 0px; width: 100%; outline: medium none;}
..picker-curation-control-small .picker-curation-control-toolbar {opacity: 0=
; transition: opacity 0.4s ease-out 0s, border-color 0.5s ease-in 0s, backg=
round-color 0.5s ease-in 0s; line-height: 0; height: 0px;}
..picker-curation-control-small.picker-curation-control-hover .picker-curati=
on-control-toolbar {opacity: 1; line-height: 42px; height: 42px;}
..picker-curation-control-caption-input.picker-curation-control-toolbar-disa=
bled ,.picker-curation-control-toolbar-icon.picker-curation-control-toolbar=
-rotate-disabled ,.picker-curation-control-toolbar-icon.picker-curation-con=
trol-toolbar-icon-hover.picker-curation-control-toolbar-rotate-disabled {op=
acity: 0; cursor: default; visibility: hidden;}
..picker-curation-control-hover .picker-curation-control-caption-input {opac=
ity: 1;}
..picker-curation-control-has-caption-focus .picker-curation-control-caption=
-input {opacity: 1; overflow: visible; color: rgb(51, 51, 51);}
..picker-curation-control-caption-input {transition: color 0.3s ease 0s, opa=
city 0.3s ease 0s, border-color 0.3s ease 0s, width 0.5s ease 0s, height 0.=
5s ease 0s, box-shadow 0.5s ease 0s; color: rgb(153, 153, 153); font-family=
: Roboto,Arial,sans-serif; font-size: 13px; border: 0px none; margin: auto;=
outline: medium none; overflow: hidden; padding: 0px 8px; resize: none; wi=
dth: 70%; height: 16px;}
..picker-curation-control-caption-input.picker-curation-control-disabled {ba=
ckground-color: transparent;}
..picker-curation-control-upload-preview {left: 0px; right: 0px; bottom: 0px=
; height: 40px; min-width: 40px;}
..picker-curation-control-upload-preview.picker-curation-control-upload-prev=
iew-empty {left: -156px; height: 40px; width: 312px;}
..picker-curation-control-upload-preview .picker-progress-bar {width: 50%; p=
osition: absolute; bottom: 24px; margin-top: -4px; left: 50%; margin-left: =
-25%;}
..picker-curation-view .picker-curation-control-upload-preview .picker-progr=
ess-bar ,.picker-curation-view .picker-curation-control-upload-preview .pro=
gress-bar-thumb {height: 2px;}
..picker-curation-control.picker-curation-control-nudge-left ,.picker-curati=
on-control.picker-curation-control-nudge-right {transition: margin 0.3s eas=
e 0s;}
..picker-curation-control.picker-curation-control-nudge-left {margin-left: -=
50px; z-index: 2104;}
..picker-curation-control.picker-curation-control-nudge-left .picker-curatio=
n-control-thumb {transition: color 0.3s ease 0s, opacity 0.3s ease 0s, bord=
er-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.5s=
ease 0s; box-shadow: -5px 0px 8px rgba(0, 0, 0, 0.3);}
..picker-curation-control.picker-curation-control-nudge-right {margin-left: =
50px; z-index: 2104;}
..picker-curation-control.picker-curation-control-nudge-right .picker-curati=
on-control-thumb {transition: color 0.3s ease 0s, opacity 0.3s ease 0s, bor=
der-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.5=
s ease 0s; box-shadow: 5px 0px 8px rgba(0, 0, 0, 0.3);}
..picker-curation-control.picker-curation-control-selected.picker-curation-c=
ontrol-nudge-left ,.picker-curation-control.picker-curation-control-selecte=
d.picker-curation-control-nudge-right {margin-left: 0px;}
..picker-curation-control.picker-curation-control-unselected-reordering {tra=
nsition: opacity 0.6s ease 0s, top 0.2s ease-out 0s, left 0.2s ease-out 0s,=
line-height 0.2s ease 0s;}
..picker-curation-control.picker-curation-control-unselected-reordering .pic=
ker-curation-control-thumb ,.picker-curation-control.picker-curation-contro=
l-unselected-reordering .picker-curation-control-thumb-wrapper {transition:=
top 0.3s ease-out 0s, left 0.3s ease-out 0s, line-height 0.3s ease 0s;}
..picker-curation-control.picker-curation-control-unselected-reordering.pick=
er-curation-control-changelines {opacity: 0;}
..picker-curation-control.picker-curation-control-selected-reordering {z-ind=
ex: 2103; transition: top 0.1s ease-out 0s, left 0.3s ease-out 0s;}
..picker-curation-control.picker-curation-control-selected-reordering.picker=
-curation-control-dropped {transition: none 0s ease 0s ;}
..picker-curation-control.picker-curation-control-dragging {opacity: 0; tran=
sition: opacity 0.2s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out =
0s, margin 0.2s ease-out 0s;}
..picker-curation-drag-control-img {position: absolute; bottom: 0px; left: 5=
0%; width: 100%; height: 100%; cursor: pointer; box-shadow: 0px 3px 25px rg=
ba(0, 0, 0, 0.6);}
..picker-curation-drag-control-img-box {position: relative;}
..picker-curation-drag-control-img ,.picker-curation-drag-control-img-box {z=
-index: 2106;}
..picker-curation-drag-control-img-box.picker-curation-drag-control-stack-1 =
{z-index: 2105; position: absolute; margin-top: 5px; margin-left: 5px; tran=
sform: rotate(7deg);}
..picker-curation-drag-control-img-box.picker-curation-drag-control-stack-2 =
{z-index: 2105; position: absolute; margin-top: -5px; margin-left: -5px; tr=
ansform: rotate(-10deg);}
..picker-curation-drag-control-count {position: absolute; height: 23px; line=
-height: 23px; border-radius: 3px; background: rgb(77, 144, 254) none repea=
t scroll 0% 0%; color: rgb(255, 255, 255); text-align: center; font-size: 1=
3px; font-weight: bold; top: 0px; margin-top: -15px; left: 50%; margin-left=
: -36px; width: 72px; z-index: 2109; box-shadow: 0px 2px 20px rgba(0, 0, 0,=
0.8);}
..picker-curation-control-toolbar.jfk-bubble {z-index: 2113 !important; line=
-height: 0; margin: 0px; padding: 0px; min-width: 124px;}
..picker-curation-control-error-bubble.jfk-bubble {z-index: 2112 !important;=
}
..picker-curation-control-toolbar-top-buttons {border-left: 1px dashed rgb(2=
21, 221, 221); overflow: hidden; position: absolute; cursor: default; top: =
0px; right: 0px; display: inline;}
..picker-curation-control-small .picker-curation-control-toolbar-top-buttons=
{border: 0px none; text-align: center; width: 100%; z-index: 2108;}
..picker-curation-control-toolbar-icon {cursor: pointer; display: inline-blo=
ck; opacity: 0.4; transition: color 0.3s ease 0s, opacity 0.13s ease 0s, bo=
rder-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.=
5s ease 0s; margin: 0px 7px; vertical-align: middle;}
..picker-curation-control-toolbar.picker-curation-control-toolbar-is-cover .=
picker-curation-control-toolbar-icon.picker-spr-checkbox-active {opacity: 0=
;}
..picker-curation-control-toolbar-top-buttons .picker-curation-control-toolb=
ar-icon-hover {opacity: 0.7;}
..picker-curation-control-toolbar-icon.picker-curation-control-toolbar-icon-=
active {opacity: 1;}
..tt-photos-ttagoverlay .tt-photos-tagging-bubble {font-size: 10px; line-hei=
ght: 1em; padding: 8px; z-index: 2108 !important;}
..picker-curation-control .tt-photos-tagging-acl-msg {margin-top: 2px;}
..picker-curation-control .tt-photos-tagging-bubble-spinner {margin-left: 2p=
x;}
..picker-main-container .tacotown-autocomplete-box {z-index: 2115;}
..picker-curation-control .tt-photos-tagging-tcontent-remove-button {backgro=
und: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs/picker/images/dialog_clos=
e_small.gif") no-repeat scroll 0% 0% padding-box content-box; height: 15px;=
margin-bottom: -3px; width: 15px;}
..picker-curation-control .tt-photos-ttagoverlay-cursor.tt-photos-ttagoverla=
y-tagged .tt-photos-ttagoverlay-cursor-ring-inner ,.picker-curation-control=
.tt-photos-ttagoverlay-cursor.tt-photos-ttagoverlay-tagged .tt-photos-ttag=
overlay-cursor-ring-outer ,.picker-curation-control .tt-photos-ttr-ring .tt=
-photos-ttr-ring-inner ,.picker-curation-control .tt-photos-ttr-ring .tt-ph=
otos-ttr-ring-outer {border-width: 6px;}
..picker-curation-control .tt-photos-ttagoverlay-cursor.tt-photos-ttagoverla=
y-tagged .tt-photos-ttagoverlay-cursor-ring ,.picker-curation-control .tt-p=
hotos-ttr-ring .tt-photos-ttr-ring-inner ,.picker-curation-control .tt-phot=
os-ttr-ring .tt-photos-ttr-ring-outer {bottom: -6px; left: -6px; right: -6p=
x; top: -6px;}
..picker-curation-control-is-cover.picker-curation-control-small .picker-cur=
ation-control-cover-selected ,.picker-curation-control-small.picker-curatio=
n-control-hover .picker-curation-control-cover ,.picker-curation-control-is=
-cover.picker-curation-control-hover .picker-curation-control-cover ,.picke=
r-curation-control-error-holder ,.picker-curation-control-thumb ,.picker-cu=
ration-control-loaded .picker-curation-control-upload-preview ,.picker-cura=
tion-control-cancel .picker-curation-control-upload-preview ,.picker-curati=
on-control-error .picker-curation-control-upload-preview ,.picker-curation-=
control-small .picker-curation-control-caption-container ,.picker-curation-=
control-caption-input.picker-curation-control-toolbar-disabled ,.picker-cur=
ation-control-toolbar-icon.picker-curation-control-toolbar-rotate-disabled =
,.picker-curation-control-toolbar-icon.picker-curation-control-toolbar-icon=
-hover.picker-curation-control-toolbar-rotate-disabled {display: none;}
..picker-curation-control-caption-container ,.picker-curation-control-error =
..picker-curation-control-error-holder ,.picker-curation-control-loaded .pic=
ker-curation-control-thumb {display: inline;}
..picker-curation-control-cover {background-color: rgb(38, 38, 38);}
..picker-curation-control-hover .picker-curation-control-cover {opacity: 0.7=
; z-index: 2108;}
..picker-curation-control-tag-adding-mode .picker-curation-control-cover {op=
acity: 0.7;}
..picker-curation-control-cover-selected {background-color: rgb(77, 144, 254=
);}
..picker-curation-control-hover .picker-curation-control-is-hover-cover.pick=
er-curation-control-cover ,.picker-curation-control-is-hover-cover.picker-c=
uration-control-cover ,.picker-curation-control-is-cover .picker-curation-c=
ontrol-cover-selected {opacity: 1;}
..picker-curation-control-cover-selected .picker-spr-checkmark-checked {disp=
lay: inline-block; margin: 5px; vertical-align: middle;}
..picker-curation-control-cover-selected .picker-curation-control-cover-text=
{padding-left: 0px;}
..picker-curation-control-cover ,.picker-curation-control-tag-adding-mode.pi=
cker-curation-control-is-cover .picker-curation-control-cover ,.picker-cura=
tion-control-cover-selected {border-radius: 5px; opacity: 0; bottom: 10px; =
cursor: pointer; display: inline-block; left: 10px; position: absolute;}
..picker-curation-control-cover-text {color: rgb(255, 255, 255); display: in=
line-block; font-size: 13px; font-weight: bold; line-height: 13px; padding:=
8px;}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small.picker-curation-control-hover {transition: opacity 0.4s ease-out=
0s, border-color 0.5s ease-in 0s, background-color 0.5s ease-in 0s; backgr=
ound-color: rgb(245, 245, 245); border-color: rgb(208, 208, 208);}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small.picker-curation-control-selected {background-color: rgb(245, 245=
, 245); border-color: rgb(77, 144, 254);}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small {background-color: transparent; border: 1px solid transparent;}
..picker-curation-control-error-holder {z-index: 2111; bottom: 0px; left: 0p=
x; position: absolute; right: 0px; text-align: center; top: 0px;}
..picker-curation-control-retry ,.picker-curation-control-error-delete {marg=
in: 5px; color: rgb(17, 85, 204); cursor: pointer;}
..picker-curation-control-error-separator {color: rgb(204, 204, 204);}
..picker-curation-control-error-icon {display: inline-block; height: 66px; l=
eft: 50%; margin-top: -33px; margin-left: -33px; position: absolute; top: 5=
0%; width: 66px; vertical-align: middle; transition: all 0.5s ease 0s; back=
ground-repeat: no-repeat;}
..picker-curation-control-error-text {font-size: 11px; text-align: center; w=
idth: 110px;}
..picker-curation-control-small .picker-curation-control-error-icon {height:=
14px; margin-left: -7px; margin-top: -7px; width: 14px;}
..picker-curation-control-preview-background {background-color: rgb(255, 255=
, 255); bottom: 0px; left: 0px; position: absolute; right: 0px; top: 0px;}
..picker-photo-control-thumbframe .picker-photo-control-description {width: =
auto; position: static; margin: 0px 5px;}
..picker-photo-control-thumbframe .picker-photo-control-bottom-controls {wid=
th: 158px;}
..picker-photo-control-attribution {cursor: pointer;}
..picker-photo-control-thumbframe .picker-video-play-icon {position: absolut=
e; left: 60px; top: 40px;}
..new-upload-box .picker-photo-control-thumbframe .picker-video-play-icon {t=
op: 60px;}
..picker-photo-control-thumbframe .picker-video-filename {width: 158px;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video {width: 158px; height: 158px;}
..picker-photo-control-thumbframe .picker-video-processing-box {height: 158p=
x;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video ,.picker-dataview-content .picker-photo-control ,.picker-datavi=
ew-content .picker-photo-control-focused.picker-photo-control ,.picker-data=
view-content .picker-photosuploadview .picker-photo-control.picker-photo-co=
ntrol-focused ,.picker-dataview-content .picker-photosgrid-edit .picker-pho=
to-control.picker-photo-control-focused {border: 0px none transparent;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video {background-color: transparent;}
..picker-photo-control-thumbframe .picker-photo-control-description {height:=
auto;}
..picker-albumname-album-cell {font-size: 13px;}
..picker-albumname-label {margin-right: 5px;}
..picker-albumname-input {margin: 0px 10px 1px 2px; width: 172px;}
..picker-albumname .goog-link-button {padding: 6px 0px;}
:first-child + html .picker-albumname .picker-albumname-album-cell .goog-li=
nk-button {position: relative; top: 6px;}
..picker-photosgrid-edit .picker-albumname {padding: 0px 7px;}
..picker-photosgrid-edit .picker-photo-control {padding: 0px 2px 12px;}
..picker-photosgrid-edit {padding: 12px 0px 0px 1px;}
..picker-albumsgrid .picker-dataview-content ,.picker-photosgrid .picker-dat=
aview-content {padding: 0px 13px 15px;}
..picker-dataview.picker-albumsgrid ,.picker-dataview.picker-photosgrid-came=
rasync {padding-top: 0px;}
..picker-breadcrumbs-content .picker-photosgrid .picker-dataview-content {pa=
dding-top: 14px;}
..picker-photo-control {vertical-align: middle; text-align: center; margin: =
1px; font-size: 0px; border: 1px solid rgb(255, 255, 255);}
..picker-photosuploadview .picker-photo-control.picker-photo-control-focused=
,.picker-photosgrid-edit .picker-photo-control.picker-photo-control-focuse=
d {border: 1px solid rgb(255, 255, 255);}
..picker-photo-control-focused.picker-photo-control {border: 1px solid rgb(7=
4, 151, 223);}
..picker-photo-control-preview {font-size: 0px; position: relative;}
..picker-photo-control-placeholder {background: transparent url("//ssl.gstat=
ic.com/docs/picker/images/placeholder-v1.gif") repeat scroll 0% 0%;}
..picker-photo-control-preview-content {cursor: pointer; outline: medium non=
e;}
..picker-upload-control-error .picker-photo-control-uploading {border: 1px s=
olid rgb(221, 221, 221); background-color: rgb(255, 255, 255);}
..picker-photo-control-preview-content .uploader-thumb-img {display: block; =
position: relative;}
..picker-photo-control-unselectable .picker-photo-control-preview-content {c=
ursor: default;}
..picker-photo-control-attribution {position: absolute; bottom: 0px; left: 7=
px; right: 7px; overflow: hidden; white-space: nowrap; text-overflow: ellip=
sis; font-size: 10px; text-align: left;}
* html .picker-photo-control-attribution ,body .picker-photo-control-attrib=
ution {width: 100%;}
..picker-photo-control-attribution-spacer {font-size: 10px; visibility: hidd=
en;}
..picker-photo-control-bottom-controls {bottom: -8px; width: 100%;}
..picker-photo-control-description {position: absolute; left: 0px; font-size=
: 13px; color: rgb(153, 153, 153); width: 100%; height: 1.2em; overflow: hi=
dden; text-align: center; text-overflow: ellipsis; white-space: nowrap;}
..picker-photosgrid-edit .picker-photo-control-description.goog-control-hove=
r {text-decoration: underline; cursor: pointer;}
..picker-photosgrid-camerasync {padding: 10px 13px;}
..picker-photosgrid-separator {font-size: 11px; color: rgb(170, 170, 170); m=
argin: 0px 10px 0px 8px;}
..picker-photosgrid-separatorhr {border-width: 1px 0px 0px; border-style: so=
lid none none; border-color: rgb(221, 221, 221) currentcolor currentcolor; =
-moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-b=
ottom-colors: none; -moz-border-left-colors: none; border-image: none; marg=
in-left: -1px;}
..picker-photo-control-border ,.picker-photosgrid-edit .picker-photo-control=
-checked .picker-photo-control-border {border: 6px solid transparent;}
..picker-photo-control-checked .picker-photo-control-border {border: 6px sol=
id rgb(77, 144, 254);}
..picker-photo-control .photo-image-edit-controls {position: absolute; top: =
-20px; right: 0px;}
..picker-photo-control-checked .photo-image-edit-controls {top: -26px; right=
: -6px;}
..picker-photo-control .photo-image-edit-caption {left: 50%; top: -35px; mar=
gin-left: -144px;}
..picker-photo-control .progress-bar-horizontal {position: absolute; bottom:=
4px; left: 4px; right: 4px; height: 5px; border: 0px none; text-align: lef=
t; background: transparent none repeat scroll 0% 0%;}
* html .picker-photo-control .progress-bar-horizontal ,body .picker-photo-c=
ontrol .progress-bar-horizontal {left: 0px; right: 0px; width: 100%;}
..picker-photo-control .progress-bar-thumb {background: rgb(136, 136, 136) n=
one repeat scroll 0% 0%; height: 5px;}
..picker-upload-control-canceled .picker-photo-control-preview .progress-bar=
-horizontal ,.picker-upload-control-default .picker-photo-control-preview .=
progress-bar-horizontal ,.picker-upload-control-error .picker-photo-control=
-preview .progress-bar-horizontal ,.picker-upload-control-scheduled .picker=
-photo-control-preview .progress-bar-horizontal ,.picker-upload-control-suc=
cess .picker-photo-control-preview .progress-bar-horizontal {display: none;=
}
..picker-upload-control-error .picker-photo-control-message {position: absol=
ute; bottom: 0px; left: 0px; right: 0px; height: 10px; border: 0px none; pa=
dding: 2px; text-align: left; background: rgb(215, 0, 0) none repeat scroll=
0% 0%; color: rgb(255, 255, 255); white-space: nowrap; overflow: hidden; t=
ext-overflow: ellipsis; font-size: 9px; cursor: default;}
* html .picker-photo-control .picker-photo-control-message ,body .picker-ph=
oto-control .picker-photo-control-message {left: 0px; right: 0px; width: 10=
0%; padding: 0px;}
..new-upload-box .picker-photo-control-uploading ,.new-upload-box .picker-ph=
oto-control-placeholder {background: rgb(238, 238, 238) none repeat scroll =
0% 0%; border: 1px solid rgb(206, 206, 206);}
..picker-upload-control-error .picker-photo-control-preview .picker-photo-co=
ntrol-uploading {background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-upload-control-running .picker-photo-control-preview .progress-bar-=
horizontal {display: inline;}
..new-upload-box .progress-bar-thumb {height: 100%; background-repeat: repea=
t-x; background-size: 20px 10px; background-color: rgb(204, 204, 204); back=
ground-attachment: scroll; background-image: linear-gradient(315deg, transp=
arent, transparent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, t=
ransparent 66%, transparent); animation-duration: 0.8s; animation-iteration=
-count: infinite; animation-timing-function: linear;}
..new-upload-box .progress-bar-horizontal {right: 0px; bottom: 0px; left: 0p=
x; height: 8px; border: 1px solid rgb(153, 153, 153); margin: 0px 8px 8px; =
padding: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..new-upload-box .picker-progress-bar-spinner.progress-bar-horizontal {borde=
r: 0px none; background: transparent url("//ssl.gstatic.com/docs/picker/ima=
ges/loading-v1.gif") no-repeat scroll 0px 0px; height: 16px; width: 16px; m=
argin: auto auto 5px; opacity: 0.5;}
..picker-video-control-thumb-table {width: 100%; position: relative; top: 10=
5px; z-index: 2200; opacity: 0.8; color: rgb(153, 153, 153); font-size: 10p=
x; height: 20px;}
..picker-video-filename {position: relative; top: 38px; z-index: 2104; heigh=
t: 13px; width: 120px; text-overflow: ellipsis; white-space: nowrap; overfl=
ow: hidden; font-size: 12px; color: rgb(153, 153, 153);}
..picker-video-spinner {position: relative; top: 5px; right: 1px; z-index: 2=
100; background-image: url("//ssl.gstatic.com/docs/picker/images/loading-v1=
..gif"); height: 16px; width: 16px; opacity: 0.5;}
..picker-photo-control-preview.picker-processing-video {background-color: rg=
b(238, 238, 238); border: 1px solid rgb(206, 206, 206); width: 120px; heigh=
t: 120px;}
..picker-video-processing-box {height: 120px; left: 0px; position: absolute;=
top: 0px; width: auto;}
..picker-video-play-icon {position: absolute; left: 12px; top: 12px;}
..jfk-bubble.picker-video-bubble {padding-top: 30px; z-index: 2200 !importan=
t; top: 0px;}
..picker-photo-control-unselectable .picker-photo-control-preview-content .u=
ploader-thumb-img {opacity: 0.3; position: relative;}
..picker-albumslist {padding: 15px 0px 0px 15px;}
..picker-content.picker-gridview-bandselect.picker-flatphotosgrid .picker-fl=
atphoto-control-wrapper ,.picker-content.picker-gridview-bandselect {cursor=
: crosshair;}
..picker-photosview .picker-dataview {padding-top: 0px;}
..picker-profile-toolbar.picker-edit-toolbar {padding: 0px; width: 160px;}
..picker-profile-toolbar .goog-button {margin: 3px; padding: 7px; text-trans=
form: uppercase; font-size: 11px; cursor: pointer; white-space: nowrap;}
..picker-profile-toolbar .goog-button-hover {background-color: rgb(238, 238,=
238);}
..picker-profile-toolbar-icon {opacity: 0.4; margin-right: 8px; vertical-ali=
gn: middle;}
..picker-profile-toolbar-label {vertical-align: middle;}
..picker-profileview {font-size: 13px; padding: 20px;}
..picker-profileview-photo {border: 6px solid rgb(77, 144, 254); width: 96px=
; height: 96px;}
..picker-profileview-text {margin-left: 115px;}
..picker-searchbarimagefilter {margin-right: 5px; padding-top: 2px;}
..picker-searchbarimagefilter-type-button {margin: 0px 5px 0px 0px; vertical=
-align: middle;}
..picker-searchbarimagefilter-colorbox {border: 3px solid transparent; heigh=
t: 19px; margin: 0px; opacity: 0.5; padding: 1px; width: 19px; vertical-ali=
gn: middle;}
..picker-searchbarimagefilter-colorbox-inner {border: 1px solid rgb(153, 153=
, 153); cursor: pointer; height: 19px; margin: -1px 0px 0px -1px; padding: =
0px; width: 19px;}
..picker-gplus .picker-searchbarimagefilter-colorbox-inner {margin: 0px; bor=
der: 0px none;}
..picker-searchbarimagefilter-colorbox[aria-selected=3D"true"] {background-c=
olor: rgb(255, 255, 255); border-color: rgb(77, 144, 254); opacity: 1;}
..picker-webcam-control {overflow: hidden;}
..picker-webcam {padding: 20px; text-align: center; z-index: 2110;}
..picker-webcam-buttons.goog-inline-block {width: auto; position: absolute;}
..picker-webcam .picker-webcam-buttons .jfk-button {z-index: 1;}
..picker-webcam .goog-slider-horizontal {height: 5px; background: rgb(229, 2=
29, 229) none repeat scroll 0% 0%; -moz-user-select: none; border-radius: 3=
px;}
..picker-webcam .goog-slider-horizontal.picker-slider-hover {background: rgb=
(209, 209, 209) none repeat scroll 0% 0%;}
..picker-webcam .goog-slider-horizontal .goog-slider-thumb {display: block; =
position: absolute; top: -7px; left: 0px; width: 15px; height: 15px; z-inde=
x: 1; border: 1px solid rgb(153, 153, 153); background-color: rgb(153, 153,=
153); cursor: col-resize; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); tran=
sition: left 0.1s ease 0s; border-radius: 8px;}
..picker-webcam .goog-slider-horizontal.picker-slider-hover .goog-slider-thu=
mb {background-color: rgb(255, 255, 255);}
..picker-webcam .goog-slider-horizontal .goog-slider-thumb .goog-slider-drag=
ging {background-color: rgb(83, 82, 82);}
..picker-webcam-icon {background: rgb(255, 255, 255) none repeat scroll 0% 0=
%; border: medium none; border-radius: 0px; height: 10px; width: 10px; disp=
lay: inline-block; margin-bottom: -1px; margin-right: 1px;}
..picker-webcam .picker-webcam-play-icon {background: transparent none repea=
t scroll 0% 0%; border-top: 5px solid transparent; border-bottom: 5px solid=
transparent; border-left: 10px solid rgb(51, 51, 51); height: 0px; width: =
0px;}
..picker-webcam .picker-webcam-stop-icon {background: rgb(51, 51, 51) none r=
epeat scroll 0% 0%;}
..picker-webcam .picker-webcam-working-icon {border-radius: 5px;}
..picker-webcam-timer {font-size: 13px; color: rgb(68, 68, 68); width: 80px;=
text-align: right; margin-left: 16px;}
..picker-webcam-working .picker-webcam-timer {background: rgb(245, 245, 245)=
none repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); text-alig=
n: center; position: absolute; top: 0px; padding: 5px 5px 6px; margin-left:=
0px;}
..picker-webcam-volume-button {padding: 6px; border: 1px solid transparent; =
position: absolute; height: 16px; width: 36px; top: 0px;}
..picker-spr-mic {margin-right: 7px;}
..picker-webcam-volume-button.goog-control-hover {border: 1px solid rgb(153,=
153, 153); border-radius: 2px;}
..picker-webcam-volume-meter {margin-right: 2px; margin-bottom: 4px; backgro=
und: rgb(153, 153, 153) none repeat scroll 0% 0%; width: 2px; height: 2px;}
..picker-webcam-volume-meter.picker-webcam-volume-meter-on {height: 7px; bac=
kground: rgb(0, 153, 51) none repeat scroll 0% 0%;}
..picker-webcam-volume-meter.picker-webcam-volume-meter-red.picker-webcam-vo=
lume-meter-on {background: rgb(209, 72, 54) none repeat scroll 0% 0%;}
..picker-youtube-banner-preview {margin: 20px; color: rgb(68, 68, 68);}
..picker-youtube-banner-preview-header {font-size: 20px; font-weight: normal=
;}
..picker-youtube-banner-preview-message {font-size: 13px; margin-top: 15px;}
..picker-youtube-banner-preview-container {margin-right: 20px; display: inli=
ne-block;}
..picker-youtube-banner-preview-icon-header {text-transform: uppercase; colo=
r: rgb(102, 102, 102); font-size: 13px; text-align: center;}
..picker-youtube-banner-preview-icon {background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/docs/picker/images/youtube-banner-sprite-v2.png") no-repeat s=
croll 0% 0%; position: relative;}
..picker-youtube-banner-preview-tv-icon {background-position: 0px 0px; width=
: 271px; height: 165px;}
..picker-youtube-banner-preview-laptop-icon {background-position: -271px 0px=
; width: 294px; height: 168px;}
..picker-youtube-banner-preview-mobile-icon {background-position: -565px 0px=
; width: 85px; height: 164px;}
..picker-youtube-banner-preview-desktop-image ,.picker-youtube-banner-previe=
w-tv-image ,.picker-youtube-banner-preview-mobile-image {position: absolute=
;}
..picker-youtube-banner-preview-desktop-image {top: 29px; left: 65px; width:=
168px; height: 29px;}
..picker-youtube-banner-preview-tv-image {top: 5px; left: 5px; width: 260px;=
height: 144px;}
..picker-youtube-banner-preview-mobile-image {top: 13px; left: 6px; width: 7=
3px; height: 20px;}
..picker-youtube-banner-preview-button-container {position: absolute; left: =
10px; bottom: 10px;}
..picker-youtube-banner-preview-loadingstatusbox {opacity: 0.8; font-size: 0=
px; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-i=
ndex: 2111; background: white url("//ssl.gstatic.com/docs/picker/images/loa=
ding-32-v1.gif") no-repeat scroll center center;}
..picker-youtube-banner-preview-auto-enhance {float: right; margin: 20px;}
..picker-youtube-banner-preview-toggle-label-container {display: inline-bloc=
k;}
..picker-youtube-banner-preview-toggle-label-container .picker-spr-icon-auto=
fix-active {display: inline-block; vertical-align: middle;}
..picker-content.picker-draguploadview {height: 100%; padding: 0px; overflow=
: hidden;}
..picker-upload-button-hidden .picker-draguploadview .picker-photos-upload-d=
ropzone-parent {height: 100%;}
..picker-draguploadview .picker-jfk-tall-progressbar {width: 70%;}
..picker-draguploadview-tip {font-size: 13px; padding: 5px;}
..picker-drag-drop-supported .picker-draguploadview-progress-parent {positio=
n: absolute; height: 50px; top: 50%; margin-top: -25px;}
..picker-draguploadview-progress-parent {position: relative; height: 40px; w=
idth: 100%; top: -20px;}
..picker-draguploadview-msg-bar {position: absolute; top: 10px; width: 80%; =
left: 10%; z-index: 2200;}
..picker-draguploadview-msg-bar .jfk-butterBar-shown {height: 30px;}
..picker-photos-upload-album-bar {z-index: 2102; position: relative;}
..picker-photos-upload-album-bar-cell {height: 1px;}
..picker-photos-upload-dropzone ,.picker-photos-upload-dropzone-cell {width:=
100%; text-align: center; position: relative;}
:first-child + html .picker-photos-upload-dropzone-cell {height: 100%; padd=
ing-top: 100px;}
..picker-upload-button-visible .picker-drag-drop-supported .picker-photos-up=
load-dropzone-cell {border: 4px dashed rgb(221, 221, 221); border-radius: 2=
px;}
..picker-drag-active .picker-upload-button-visible .picker-photos-upload-dro=
pzone-cell {border-color: rgb(77, 144, 254);}
..picker-photos-upload-dropzone-cell .jfk-button {margin: 0px;}
..picker-photos-upload-drop-alt {display: none; padding: 15px 0px 5px; font-=
weight: bold; font-size: 13px; color: rgb(204, 204, 204);}
..picker-photos-upload-drop-here {font-size: 20pt; color: rgb(204, 204, 204)=
; padding: 0px 10px; display: none;}
..picker-drag-active .picker-photos-upload-drop-here {color: rgb(57, 137, 21=
2);}
..picker-drag-drop-supported .picker-photos-upload-drop-alt ,.picker-drag-dr=
op-supported .picker-photos-upload-drop-here {display: block;}
..picker-photos-upload-dropzone-parent {height: 100%; width: 100%; position:=
relative; border-spacing: 20px;}
..picker-upload-button-hidden .picker-photos-upload-dropzone-parent {height:=
auto;}
..picker-photos-upload-dropzone-parent.picker-collapsed {margin: 0px 0px -40=
px;}
..picker-photos-upload-hidden-button {position: absolute; top: -1000px; left=
: -1000px;}
..jfk-butterBar-error .picker-link {color: rgb(255, 255, 255); text-decorati=
on: underline;}
..picker-photo-control-thumbframe {box-shadow: 0px 1px 0px rgb(218, 218, 218=
); width: 158px; height: 188px; background: rgb(255, 255, 255) none repeat =
scroll 0% 0%; border: 1px solid transparent; cursor: pointer;}
..picker-photo-control-thumbframe .picker-photo-control-uploading ,.picker-p=
hoto-control-thumbframe .new-upload-box-error .picker-photos-error-text {bo=
rder: 0px none transparent;}
..picker-upload-control-error .picker-photo-control-thumbframe .picker-photo=
-control-uploading {height: 158px;}
..picker-photosuploadview .new-upload-box .picker-photo-control-thumbframe .=
picker-photo-control-uploading .new-upload-box-error ,.picker-photo-control=
-thumbframe .new-upload-box-error .picker-photos-upload-filename {backgroun=
d: rgb(245, 245, 245) none repeat scroll 0% 0%;}
..new-upload-box .picker-photo-control-thumbframe .new-upload-box-error .pic=
ker-spr-upload-error {margin: 50px 74px 40px 73px;}
..picker-video-control-duration {position: absolute; display: inline-block; =
left: 9px; bottom: 8px; color: rgb(255, 255, 255); background: rgb(199, 199=
, 199) none repeat scroll 0% 0%; border-radius: 20px; font-weight: bold; pa=
dding: 2px 10px 3px 25px; font-size: 11px; text-shadow: 0px 0px 2px rgba(0,=
0, 0, 0.5);}
..picker-photosuploadview .picker-video-control-duration {padding: 2px 10px;=
}
..picker-photo-control-toolbar {background-color: rgb(255, 255, 255); bottom=
: 2px; height: 32px; left: 2px; position: absolute; width: 158px;}
..picker-photo-control-toolbar .picker-spr-checkbox-selected {cursor: pointe=
r; position: relative; right: 62px; top: 4px;}
..picker-photo-control-toolbar .picker-spr-checkbox-active {cursor: pointer;=
position: relative; right: 62px; top: 4px; opacity: 0.2;}
..picker-photo-control-toolbar .picker-spr-checkbox-active.picker-spr-checkb=
ox-active-hover {opacity: 1;}
..picker-photo-control-toolbar .picker-spr-checkbox-selected {display: none;=
}
..picker-photo-control-toolbar .picker-spr-checkbox-active {display: inline-=
block;}
..picker-photosuploadview .picker-photo-control-thumbframe {cursor: default;=
}
..new-upload-box .picker-photos-upload-filename ,.new-upload-box .picker-vid=
eos-upload-loadingthumb {color: rgb(153, 153, 153); font-size: 11px; overfl=
ow: hidden; background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..picker-photosuploadview .new-upload-box .picker-photo-control-uploading {b=
ackground: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..picker-photosuploadview .new-upload-box .picker-photo-control-uploading .n=
ew-upload-box-error {background: rgb(255, 255, 255) none repeat scroll 0% 0=
%;}
..new-upload-box-error .picker-photos-upload-filename ,.new-upload-box-error=
.picker-videos-upload-loadingthumb {color: rgb(153, 153, 153); font-size: =
11px; overflow: hidden; background: rgb(255, 255, 255) none repeat scroll 0=
% 0%;}
..new-upload-box .picker-photos-upload-filename ,.new-upload-box-error .pick=
er-photos-upload-filename {width: 120px; height: 120px; padding: 0px;}
..new-upload-box .picker-upload-filename-inner ,.new-upload-box-error .picke=
r-upload-filename-inner {padding-top: 58px; text-overflow: ellipsis; white-=
space: nowrap; overflow: hidden; font-size: 12px;}
..new-upload-box .picker-spr-photo-icon {display: inline-block; opacity: 0.5=
; position: absolute; left: 51px; top: 40px;}
..new-upload-box-error .picker-spr-photo-icon {display: none;}
..new-upload-box .new-upload-box-error .picker-spr-upload-error {position: a=
bsolute; margin: 40px 55px 40px 50px; top: 0px;}
..nub-loading .picker-spr-upload-error {display: none;}
..picker-upload-control-error .picker-spr-photo-upload-cancel ,.picker-uploa=
d-control-scheduled .picker-spr-photo-upload-cancel {opacity: 0.5; position=
: absolute; right: 8px; bottom: 8px; cursor: pointer;}
..picker-upload-control-running .picker-spr-photo-upload-cancel ,.picker-upl=
oad-control-success .picker-spr-photo-upload-cancel ,.picker-photo-control-=
placeholder .picker-spr-photo-upload-cancel {display: none;}
..picker-upload-control-error .picker-spr-upload-retry {opacity: 0.5; positi=
on: absolute; left: 8px; bottom: 8px; cursor: pointer;}
..picker-upload-control-error .picker-photos-upload-retry-text {position: ab=
solute; left: 19px; bottom: -1px; cursor: pointer; color: rgb(0, 0, 0); fon=
t-size: 12px;}
..picker-upload-control-running .picker-spr-upload-retry ,.picker-upload-con=
trol-success .picker-spr-upload-retry ,.picker-photo-control-placeholder .p=
icker-spr-upload-retry ,.picker-upload-control-scheduled .picker-spr-upload=
-retry {display: none;}
..new-upload-box-error .picker-photos-error-text {position: absolute; top: 0=
px; left: 0px; right: 0px; bottom: 27px; font-weight: bold; font-size: 12px=
; background-color: rgb(238, 238, 238); border: 1px solid rgb(204, 204, 204=
); padding-top: 15px;}
..new-upload-box-error .picker-photos-error-details {position: absolute; top=
: 44px; left: 11px; right: 11px; padding: 2px; background: rgb(238, 238, 23=
8) none repeat scroll 0% 0%; font-size: 12px; font-weight: normal;}
..new-upload-box .picker-photos-upload-controls ,.new-upload-box-error .pick=
er-photos-upload-controls {background: transparent none repeat scroll 0% 0%=
; position: absolute !important; height: 20px; bottom: 0px; left: 0px; text=
-decoration: none; width: 100%;}
..picker-photo-control-preview-content {transition: opacity 250ms ease 0s;}
..picker-photo-control-preview-smartcrop-content {transition: opacity 450ms =
linear 100ms; opacity: 0; position: absolute; top: 0px;}
..picker-edit-toolbar-overlay-container .picker-spr-icon-photos-delete-white=
,.picker-edit-toolbar-overlay-container .picker-spr-icon-rotate-left-white=
,.picker-edit-toolbar-overlay-container .picker-spr-icon-rotate-right-whit=
e {display: none;}
..picker-photosuploadview-albumbar-visible .picker-albumname {position: rela=
tive;}
..picker-photosuploadview .picker-dataview {position: relative; margin: -10p=
x; overflow: visible;}
..picker-photosuploadview.picker-photosuploadview-albumbar-visible .picker-d=
ataview {margin: 10px -10px -10px;}
..picker-photosuploadview .picker-photosgrid .picker-dataview-content ,.pick=
er-photosuploadview .picker-photosgrid-edit {padding: 0px;}
..picker-photosuploadview .picker-dataview-message {display: none;}
..picker-photosuploadview-albumbar-visible .picker-dropzone ,.picker-photosu=
ploadview-albumbar-visible .picker-progress-wrapper {top: 50px;}
..picker-photosuploadview .goog-toolbar-button {cursor: pointer;}
..picker-photosuploadview .picker-photo-control-preview-content {outline: me=
dium none; cursor: default;}
..picker-photosuploadview .picker-photo-control-checked .picker-photo-contro=
l-border {border: 6px solid transparent;}
..picker-localphotosprofilephoto .picker-photo-control-border ,.picker-local=
photosprofilephoto.picker-photo-control-checked .picker-photo-control-borde=
r {border: 4px solid rgb(221, 75, 57); margin: 2px;}
..picker-photosuploadview-progress-wrapper ,.picker-photosuploadview-progres=
s-text ,.picker-photosuploadview-progress {position: absolute; top: 0px; ri=
ght: 0px; bottom: 0px; left: 0px;}
..picker-photosuploadview-progress-text {width: 70%; margin: auto;}
..picker-photosuploadview-progress {height: 9px; width: 70%; margin: auto;}
..picker-photosuploadview-progress-text {height: 41px; padding: 0px 0px 6px =
4px; font-size: 13px;}
..picker-photosuploadview-progress-wrapper .picker-progress-bar {width: 100%=
;}
..picker-photosuploadview-msgbar {position: absolute; top: 10px; width: 80%;=
left: 10%; z-index: 2200;}
..picker-photosuploadview-msgbar .jfk-butterBar-shown {height: 30px;}
..picker-photosuploadview .picker-photo-control-uploading {background: rgb(2=
43, 243, 243) none repeat scroll 0% 0%;}
..picker-photosuploadview .picker-photosgrid .picker-photo-control {padding:=
0px 0px 12px;}
..picker-photosuploadview-progress .progress-bar-horizontal ,.picker-photosu=
ploadview-actionpane .progress-bar-horizontal {height: 9px; border: 1px sol=
id rgb(153, 153, 153); margin: 2px; padding: 1px; background: rgb(255, 255,=
255) none repeat scroll 0% 0%;}
..picker-photosuploadview-progress .picker-progress-bar-spinner.progress-bar=
-horizontal ,.picker-photosuploadview-actionpane .picker-progress-bar-spinn=
er.progress-bar-horizontal {border: 0px none; background: transparent url("=
//ssl.gstatic.com/docs/picker/images/loading-v1.gif") no-repeat scroll 0px =
0px; height: 16px; width: 16px; padding-left: 7px; padding-top: 2px; margin=
: auto auto 5px; opacity: 0.5;}
..picker-photosuploadview-progress .progress-bar-thumb ,.picker-photosupload=
view-actionpane .progress-bar-thumb {height: 100%; background-repeat: repea=
t-x; background-size: 20px 10px; background-color: rgb(77, 144, 254); backg=
round-image: linear-gradient(315deg, transparent, transparent 33%, rgba(0, =
0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 66%, transparent); ba=
ckground-attachment: scroll; animation-duration: 0.8s; animation-iteration-=
count: infinite; animation-timing-function: linear;}
..picker-upload-photo-album-bar {position: absolute; top: 20px; left: 20px; =
height: 30px; padding: 0px;}
..picker-photo-upload-dropzone {position: absolute; top: 50px; left: 0px; ri=
ght: 0px; bottom: 0px;}
..picker-youtube-banner-recommended-size-messages {position: absolute; botto=
m: 20px; right: 20px; padding: 20px; color: rgb(204, 204, 204); text-align:=
right;}
..picker-youtube-banner-channel-art-link {text-decoration: none;}
..picker-docsuploadview-drive-promo {background-color: rgb(229, 229, 229); c=
ursor: default; height: 125px; left: 0px; overflow: hidden; position: absol=
ute; top: 0px; width: 100%; z-index: 1; transition: height 0.218s ease 0s;}
..picker-docsuploadview-with-drive-promo .picker-docsuploadview-drive-promo =
{border-bottom: 1px solid rgb(229, 229, 229);}
..picker-docsuploadview-drive-promo-text {padding-right: 40px; position: abs=
olute; top: 0px;}
..picker-docsuploadview-drive-promo-title {font-size: 18px; padding: 15px 5p=
x 5px 0px; white-space: nowrap;}
..picker-docsuploadview-drive-promo-paragraph {color: rgb(68, 68, 68); font-=
size: 13px; max-width: 650px;}
..picker-docsuploadview-drive-promo-dismiss {padding-top: 5px;}
..picker-docsuploadview-drive-promo-learnmore ,.picker-docsuploadview-drive-=
promo-up-to-link {color: rgb(17, 85, 204); cursor: pointer; text-decoration=
: none; white-space: nowrap;}
..picker-docsuploadview-drive-promo-learnmore.picker-hover ,.picker-docsuplo=
adview-drive-promo-up-to-link.picker-hover {text-decoration: underline;}
..picker-docsuploadview-drive-promo-img {margin: 15px 30px;}
..picker-docsuploadview-drive-promo-close {padding: 10px; position: absolute=
; right: 0px; top: 0px;}
..picker-folderbar {border-bottom: 1px solid rgb(221, 221, 221); height: 49p=
x; position: absolute; top: 0px; left: 0px; width: 100%;}
..picker-folderbar-menu {position: absolute; top: 10px; left: 10px;}
..picker-folderbar-menu .jfk-bubble-content-id {width: 300px;}
..picker-du-folderpopup-buttons .jfk-button {margin-top: 13px;}
..picker-docsuploadview.picker-upload {overflow: hidden; padding: 0px;}
..picker-docsuploadview .picker-dataview ,.picker-docsuploadview .picker-dro=
pzone {top: 50px;}
..picker-docsuploadview-with-drive-promo .picker-dataview ,.picker-docsuploa=
dview-with-drive-promo .picker-dropzone {top: 120px;}
..picker-doc-upload-control-cell {border-bottom: 1px solid rgb(221, 221, 221=
);}
..picker-doc-upload-control-row {height: 50px;}
..picker-doc-upload-control-icon-cell {width: 36px;}
..picker-doc-upload-control-icon {display: block; margin-top: 4px; margin-le=
ft: 10px; padding-top: 3px; width: 16px; height: 16px; background-repeat: n=
o-repeat;}
..picker-doc-upload-control-text ,.picker-doc-upload-control-retry-text ,.pi=
cker-docs-upload-error-dialog {font-size: 13px;}
..picker-doc-upload-control-retry-text {color: rgb(17, 85, 204);}
..picker-doc-upload-control-retry-text .jfk-button {cursor: pointer;}
..picker-doc-upload-control-retry-text .jfk-button-hover {text-decoration: u=
nderline;}
..picker-docsuploadview-uploadmore-button {display: inline-block; margin: 16=
px 20px;}
..picker-doc-upload-control-error-message {color: rgb(204, 51, 51);}
..picker-doc-upload-control-cell .picker-spr-upload-error {display: inline-b=
lock; margin-top: 5px; vertical-align: text-bottom;}
..picker-doc-upload-control-error-message {margin-left: 8px;}
..picker-docs-upload-error-dialog {width: 300px; z-index: 2112;}
..picker-docs-upload-error-dialog-bg {z-index: 2111;}
..picker-docs-upload-error-dialog-button::-moz-focus-inner {border: 0px none=
;}
..picker-doc-upload-control-progress {text-align: right; width: 130px;}
..picker-doc-upload-control-progress .progress-bar-horizontal {height: 9px; =
border: 1px solid rgb(153, 153, 153); margin: 2px; padding: 1px; background=
: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-doc-upload-control-progress .progress-bar-thumb {height: 100%; back=
ground-repeat: repeat-x; background-size: 20px 10px; background-color: rgb(=
77, 144, 254); background-image: linear-gradient(315deg, transparent, trans=
parent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 6=
6%, transparent); background-attachment: scroll; animation-duration: 0.8s; =
animation-iteration-count: infinite; animation-timing-function: linear;}
..picker-doc-upload-control-cancel {width: 45px;}
..picker-doc-upload-control-cancel-x .jfk-button {cursor: pointer; height: a=
uto; margin: 0px 17px; width: auto;}
..picker-doc-upload-control-size {margin-left: 15px; font-size: 12px; color:=
rgb(102, 102, 102);}
..picker-doc-upload-control-name ,.picker-doc-upload-control-size {cursor: d=
efault;}
..picker-doc-upload-control-row.picker-upload-control-scheduled .picker-spr-=
photo-upload-cancel {display: none;}
..picker-doc-upload-control-complete {color: rgb(204, 204, 204);}
..picker-doc-upload-more {margin-left: 10px;}
..picker-doc-upload-control-row.picker-upload-control-error .picker-spr-phot=
o-upload-cancel {position: static; opacity: 1;}
..picker-upload-control-error .progress-bar-horizontal {display: none;}
..picker-drag-indicator-top ,.picker-drag-indicator-left ,.picker-drag-indic=
ator-right ,.picker-drag-indicator-bottom {position: absolute; z-index: 220=
0; background-color: rgb(77, 144, 254);}
..picker-drag-indicator-top ,.picker-drag-indicator-bottom {height: 3px; wid=
th: 100%; left: 0px;}
..picker-drag-indicator-left ,.picker-drag-indicator-right {height: 100%; wi=
dth: 3px; top: 0px;}
..picker-drag-indicator-top {top: 0px;}
..picker-drag-indicator-left {left: 0px;}
..picker-drag-indicator-right {right: 0px;}
..picker-drag-indicator-bottom {bottom: 0px;}
..picker-drag-tooltip {position: absolute; display: table; top: 50%; left: 5=
0%; width: 350px; margin-left: -175px; height: 40px; margin-top: -20px; bac=
kground-color: rgb(77, 144, 254); color: rgb(255, 255, 255); font-weight: b=
old; padding: 10px; font-size: 13px; z-index: 2200; text-align: center; box=
-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); border-radius: 2px;}
..picker-drag-tooltip-inner {display: table-cell; vertical-align: middle;}
..picker-dropzone ,.picker-dropzone-target ,.picker-dropzone-targetcontent ,=
..picker-dropzone-targetcontentwrapper {position: absolute; top: 0px; right:=
0px; bottom: 0px; left: 0px;}
..picker-drag-drop-supported .picker-dropzone-targetpointer {cursor: pointer=
;}
..picker-dropzone.goog-control-focused {border: 1px solid rgb(221, 221, 221)=
;}
..picker-drag-drop-supported .picker-dropzone-text ,.picker-drag-drop-suppor=
ted .picker-dropzone-alttext {display: block;}
..picker-dropzone-or {color: rgb(170, 170, 170); font-size: 14px; padding: 0=
px 0px 16px;}
..picker-dropzone-upload-button {padding: 5px 12px;}
..picker-dropzone-text ,.picker-dropzone-alttext ,.picker-spr-rio-upload-big=
{display: none;}
..picker-dropzone.picker-drag-drop-supported .picker-spr-rio-upload-big {opa=
city: 0.4; display: inline-block;}
..picker-dropzone .picker-dropzone-target {border-width: 3px;}
..picker-drag-active .picker-dropzone-target {background: rgb(245, 245, 245)=
none repeat scroll 0% 0%; border-color: rgb(77, 144, 254);}
..picker-dropzone-targetcontent {text-align: center;}
..picker-dropzone-targetcontentwrapper {margin: auto; height: 30px;}
..picker-dropzone-largetargetcontentwrapper {height: 200px;}
..picker-dropzone-text {color: rgb(170, 170, 170); font-size: 20pt; padding:=
0px 10px;}
..picker-dropzone-alttext {color: rgb(204, 204, 204); font-size: 13px; font-=
weight: bold; padding: 15px 0px 5px;}
..picker-dropzone-targetcontent .jfk-button {cursor: pointer; margin-right: =
0px;}
..picker-drag-drop-notsupported .picker-dropzone-targetcontent .jfk-button {=
cursor: pointer; margin-right: 0px; z-index: -1;}
..picker-upload.picker-inline-upload {border-bottom: 1px solid rgb(229, 229,=
229); height: 119px; position: relative;}
..picker-inline-upload-icon {display: inline-block; left: 20px; opacity: 0.4=
; position: absolute; top: 15px;}
..picker-drag-drop-supported.picker-inline-upload-container {visibility: vis=
ible;}
..picker-inline-upload-container {border: 2px dashed rgb(221, 221, 221); bor=
der-radius: 2px; bottom: 20px; left: 20px; position: absolute; right: 30px;=
top: 20px; visibility: hidden;}
..picker-drag-active .picker-inline-upload-container {border: 2px dashed rgb=
(77, 144, 254);}
..picker-inline-upload-dropzone {height: 100%;}
..picker-inline-upload-dropzone-text {bottom: 26px; color: rgb(170, 170, 170=
); display: inline-block; font-size: 20px; left: 90px; padding-right: 5px; =
position: absolute;}
..picker-drag-active .picker-inline-upload-dropzone-text {color: rgb(57, 137=
, 212);}
..picker-inline-upload-button-container {bottom: 20px; position: absolute; r=
ight: 10px;}
..picker-upload-button-visible .picker-inline-upload-button {visibility: vis=
ible;}
..picker-inline-upload-button-pre-text {color: rgb(170, 170, 170); display: =
inline-block; font-size: 20px; padding-right: 10px;}
..picker-inline-upload .picker-draguploadview-progress-parent {text-align: c=
enter;}
..picker-inline-upload-actionpane-button {float: right; margin-right: 31px;}
..picker-main-container .goog-tree-hide-root {display: none;}
..picker-main-container .goog-tree-item {-moz-user-select: none;}
..picker-main-container .goog-tree-item .selected {-moz-user-select: none; v=
ertical-align: middle; cursor: default; white-space: nowrap; background-col=
or: rgb(77, 144, 254); color: rgb(255, 255, 255); font-weight: bold;}
..picker-main-container .goog-tree-row {padding: 2px 0px 3px 8px; vertical-a=
lign: middle; cursor: default; white-space: nowrap; height: 15px;}
..picker-main-container .goog-tree-item-label {overflow: hidden; white-space=
: nowrap; empty-cells: show; font-size: 13px; font-weight: normal; font-fam=
ily: Roboto,Arial,sans-serif; width: 95%;}
..picker-main-container .goog-tree-expand-icon {background-repeat: no-repeat=
; height: 12px; width: 12px; cursor: pointer; vertical-align: middle;}
..picker-main-container .goog-tree-expand-icon-minus ,.picker-main-container=
.goog-tree-expand-icon-lminus ,.picker-main-container .goog-tree-expand-ic=
on-tminus {background-image: url("//ssl.gstatic.com/docs/picker/images/icon=
s-v9.png"); background-position: -402px center;}
..picker-main-container .goog-tree-expand-icon-plus ,.picker-main-container =
..goog-tree-expand-icon-tplus ,.picker-main-container .goog-tree-expand-icon=
-lplus {background-image: url("//ssl.gstatic.com/docs/picker/images/icons-v=
9.png"); background-position: -384px center;}
..picker-main-container .goog-tree-expand-icon-blank {background-position: c=
enter center; background-repeat: no-repeat; height: 8px;}
..picker-content .goog-tree-root {min-height: 200px; max-height: 300px; over=
flow: auto; border: 1px solid rgb(217, 217, 217);}
..picker-treedoclistview-node-name {font-size: 13px; padding: 2px 3px 3px; f=
ont-weight: normal; vertical-align: middle;}
..picker-treedoclistview-node-message {color: rgb(102, 102, 102); padding-le=
ft: 4px;}
..picker-treedoclistview-node-error {color: rgb(204, 51, 51); padding-left: =
4px;}
..picker-upload {overflow-y: auto; padding: 20px;}
..picker-upload .picker-dataview ,.picker-upload .picker-dropzone {transitio=
n: top 0.218s ease 0s;}
* html .picker-upload ,body .picker-upload {height: 100%; width: 100%;}
..apps-upload-sprite {background-image: url("//ssl.gstatic.com/docs/picker/i=
mages/apps_upload_icons-v1.gif") !important;}
..picker-upload-container.picker-collapsed .picker-upload-button ,.picker-up=
load-container.picker-collapsed .picker-upload-header ,.picker-upload-conta=
iner.picker-collapsed .picker-upload-text {display: none;}
..picker-upload-container.picker-collapsed .upload-uploader-flash-content {p=
osition: absolute; top: -1000px !important; left: -1000px !important;}
..picker-upload-header {font-size: 13px; font-weight: bold; color: rgb(68, 6=
8, 68); margin-bottom: 4px;}
..upload-file-col {padding: 4px;}
..upload-state-default .upload-file-col {padding: 2px;}
..upload-file {border-bottom: 0px none;}
..upload-file .goog-flat-button {color: rgb(153, 153, 153); text-decoration:=
underline; cursor: pointer; margin-right: 5px;}
..upload-file-progress {display: none;}
..upload-file-status {width: 16px; background-position: 20px 20px; backgroun=
d-repeat: no-repeat;}
..upload-state-start .upload-file-status ,.upload-state-upload .upload-file-=
status ,.upload-state-backoff .upload-file-status {width: 16px; height: 16p=
x; background-position: center top;}
..upload-state-complete .upload-file-status {width: 16px; height: 13px; back=
ground-position: center -16px;}
..upload-state-error .upload-file-status {width: 16px; height: 13px; backgro=
und-position: center -31px;}
..upload-state-default .progress-bar-horizontal ,.upload-state-inqueue .prog=
ress-bar-horizontal ,.upload-state-error .progress-bar-horizontal ,.upload-=
state-complete .progress-bar-horizontal ,.upload-state-cancel .upload-file-=
size ,.upload-state-cancel .upload-file-progress ,.upload-state-cancel .upl=
oad-file-actions ,.upload-state-error .upload-file-size {display: none;}
..upload-file-size {text-align: right;}
..upload-file-progress {width: 88px;}
..upload-file-message {font-size: 11px; padding-left: 0.5em; color: rgb(153,=
153, 153);}
..upload-message .progress-bar-horizontal {display: none;}
..upload-file-actions {text-align: right;}
..upload-file-hidden {visibility: hidden; cursor: auto;}
..picker-upload-text {color: rgb(102, 102, 102); font-size: 10px; margin: 5p=
x 0px 4px;}
..picker-upload-text-a {color: rgb(153, 153, 153);}
..upload-uploader {font-size: 13px;}
..upload-uploader-table {width: auto;}
..picker-upload.picker-videoupload {padding: 0px;}
..picker-videoupload .upload-uploader-table {width: 100%;}
..upload-uploader-file-list {width: auto;}
..upload-uploader-hidden {display: none !important;}
..picker-upload-input-flash {font-size: 11px;}
..picker-upload-input-noflash {padding: 8px; font-size: 11px;}
..picker-upload-input-flash {border-top: 1px solid rgb(221, 221, 221); borde=
r-left: 1px solid rgb(221, 221, 221); background-color: rgb(245, 245, 245);=
padding: 4px 11px 2px; margin: 8px; text-align: center; vertical-align: mi=
ddle;}
..picker-upload-input-flash .picker-spr-upload-arrow {margin-right: 5px;}
..picker-upload-input-noflash .upload-uploader-input {font-size: 9px;}
..picker-docsuploadview .picker-upload-header {font-weight: normal; color: r=
gb(0, 0, 0);}
..picker-docsuploadview-title {font-weight: bold; color: rgb(68, 68, 68); ma=
rgin-bottom: 10px; font-size: 13px;}
..picker-doplaruploadview-uploading ,.picker-geouploadview-uploading {font-s=
ize: 13px; margin: 10px;}
..picker-doplaruploadview-error ,.picker-geouploadview-error {font-size: 13p=
x; margin: 10px; color: rgb(204, 51, 51);}
..picker-docsuploadview-checkbox {font-size: 12px; margin: 15px 0px 0px -4px=
;}
..picker-docsuploadview-checkbox-input {margin-right: 7px;}
..picker-docsuploadview-move-to-folder {font-size: 13px; margin: 0px 0px 10p=
x 27px;}
..picker-docsuploadview-folder-header {margin-top: 10px;}
..picker-docsuploadview-icon {background-image: url("//ssl.gstatic.com/docs/=
picker/images/folder_sprite-v1.gif"); background-position: -24px 0px; heigh=
t: 16px; vertical-align: middle; width: 16px;}
..picker-du-folder-icon {height: 11px; vertical-align: middle; width: 11px; =
margin: -1px 0px 0px 5px;}
..picker-docsuploadview-icon {margin-bottom: 3px;}
..picker-docsuploadview-spacing {width: 5px;}
..picker-du-folders-popup {border: 1px solid rgb(221, 221, 221); padding: 13=
px; font-size: 12px; width: 300px; color: rgb(0, 0, 0); background-color: r=
gb(255, 255, 255); position: absolute; z-index: 20; margin: -3px 0px 0px 2p=
x;}
..picker-docsuploadview-dropdown {background-image: url("//ssl.gstatic.com/d=
ocs/picker/images/folder_sprite-v1.gif"); background-position: -40px 0px; w=
idth: 12px; height: 16px; vertical-align: middle; margin: 0px -2px 3px 3px;=
}
..picker-docsuploadview .goog-tree-root {height: 125px; overflow-x: hidden; =
overflow-y: auto;}
..picker-videos-listview .picker-dataview-content {padding: 15px;}
..picker-video-control {border: 5px solid transparent; cursor: pointer; marg=
in: 5px; padding: 2px;}
..picker-video-control-checked {border: 5px solid rgb(77, 144, 254); backgro=
und: rgb(245, 245, 245) none repeat scroll 0% 0%;}
..picker-videoupload .picker-video-control-checked {border: 5px solid rgb(25=
5, 255, 255); background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-video-control-inner {overflow: hidden;}
..picker-video-control-preview {padding: 1px; border: 1px solid rgb(153, 153=
, 153);}
..picker-video-control-thumb {z-index: 3; width: 96px; height: 72px; cursor:=
pointer;}
..picker-video-control-thumb-img {width: 96px; height: 72px; cursor: pointer=
;}
..picker-photos-upload .picker-video-control-thumb ,.picker-photos-upload .p=
icker-video-control-thumb-img {width: 240px; height: 182px;}
..picker-video-control-previewing .picker-video-control-thumb {display: none=
;}
..picker-video-control-star-mask {width: 55px; height: 11px; margin-right: 7=
px; overflow: hidden; vertical-align: middle; line-height: 9pt;}
..picker-video-control-star-mask .picker-spr-video-stars {position: relative=
;}
..picker-video-control .picker-spr-video-play-overlay {position: relative; z=
-index: 2; top: -50%; left: 50%; margin-left: -18px; margin-top: -20px;}
..picker-video-control-metadata {margin-left: 4px;}
..picker-video-control-previewing .picker-video-control-metadata {padding-to=
p: 3px;}
..picker-video-control-title {font-size: 13px; font-weight: bold; color: rgb=
(80, 80, 80); white-space: nowrap; text-overflow: ellipsis; height: 1.3em; =
overflow: hidden;}
..picker-video-control-previewing .picker-video-control-title {font-size: 12=
px;}
..picker-video-control-content {font-size: 12px; height: 3em; line-height: 1=
..5em; margin-bottom: -2px; overflow: hidden; overflow-wrap: break-word;}
..picker-video-control-time {color: rgb(133, 133, 133); font-size: 12px; ver=
tical-align: middle;}
..picker-video-control-previewing .picker-video-control-time {font-size: 11p=
x;}
..picker-video-control-publisher {color: rgb(0, 128, 0); font-size: 12px;}
..picker-video-control-previewing .picker-video-control-publisher {font-size=
: 11px;}
..picker-spr-youtube {margin: 0px 13px 6px 0px;}
..picker-videos-grid .picker-dataview-content {padding-left: 20px;}
..picker-videos-grid .picker-video-grid-control-border {opacity: 0; transiti=
on: opacity 0.218s ease 0s; padding: 5px; position: relative;}
..picker-video-grid-control-checked .picker-video-grid-control-border {borde=
r: 5px solid rgb(66, 133, 244); padding: 0px;}
..picker-video-grid-control-focused .picker-video-grid-control-border {outli=
ne: 1px solid rgb(66, 133, 244);}
..picker-videos-grid .picker-video-grid-control-wrapper {cursor: pointer; di=
splay: inline-block; height: 140px; outline: medium none; text-align: cente=
r; vertical-align: middle; width: 140px;}
..picker-videos-grid .picker-video-grid-control-thumbnail {max-height: 100%;=
max-width: 100%;}
..picker-videos-grid .picker-video-grid-control-hover .picker-video-grid-con=
trol-check {opacity: 0.7;}
..picker-videos-grid .picker-video-grid-control-checked .picker-video-grid-c=
ontrol-check {opacity: 1; left: 5px; top: 5px;}
..picker-videos-grid .picker-video-grid-control-check {opacity: 0; transitio=
n: opacity 0.218s ease 0s; left: 10px; position: absolute; top: 10px; z-ind=
ex: 2104;}
..picker-videos-grid .picker-spr-rio-checkmark-selected {animation: 0.3s lin=
ear 0s normal none 1 running pickerPhotosSelectionOverlayCheckmarkSelectedT=
ransition;}
..picker-video-control-disabled ,.picker-video-grid-control-disabled ,.picke=
r-video-grid-control-unselectable {opacity: 0.3;}
..picker-video-grid-control-unselectable .picker-video-grid-control-check {d=
isplay: none;}
..picker-video-duration-overlay {background: rgb(0, 0, 0) none repeat scroll=
0% 0%; bottom: 5px; color: rgb(255, 255, 255); font-size: 11px; font-weigh=
t: bold; height: 14px; line-height: 14px; opacity: 0.75; padding: 0px 4px; =
position: absolute; right: 5px; vertical-align: top; z-index: 2104;}
..picker-videos-grid .picker-video-grid-control-checked .picker-video-durati=
on-overlay {opacity: 1; bottom: 0px; right: 0px;}
..picker-video-grid-control-title {display: block; font-size: 13px; position=
: relative; height: 13px; line-height: 13px; margin: 2px 0px; overflow: hid=
den; text-align: center; text-overflow: ellipsis; white-space: nowrap;}
..picker-video-grid-control-timestamp {color: rgb(153, 153, 153); display: b=
lock; position: relative; font-size: 11px; height: 11px; line-height: 11px;=
margin: 2px 0px; text-align: center;}
..picker-videos-grid .picker-video-grid-control-preview {display: inline-blo=
ck; margin: 10px; outline: medium none;}
..picker-videos-grid .picker-spr-video-play-overlay {opacity: 0.8; left: 0px=
; top: 0px;}
..picker-video-grid-control-hover .picker-spr-video-play-overlay {opacity: 1=
;}
..picker-video-grid-control-checked .picker-spr-video-play-overlay {opacity:=
1; left: -5px; top: -5px;}
..upload-uploader .picker-photos-upload .progress-bar-horizontal {width: aut=
o; height: 5px; border: medium none; margin: 3px; padding: 0px; background:=
transparent none repeat scroll 0% 0%;}
..upload-uploader .picker-photos-upload .progress-bar-thumb {background: rgb=
(136, 136, 136) none repeat scroll 0% 0%; height: 100%;}
..picker-photos-upload-progress {position: absolute !important; bottom: 3px;=
left: 0px; width: 100%;}
..picker-photos-upload-controls {position: absolute !important; bottom: 3px;=
left: 0px; width: 100%; background: rgb(215, 0, 0) none repeat scroll 0% 0=
%; color: rgb(255, 255, 255);}
..picker-photos-upload-actions {text-decoration: underline; cursor: pointer;=
margin: 5px;}
..picker-photos-upload-message {margin: 5px;}
..picker-videos-upload .picker-video-control {cursor: auto;}
..picker-photos-upload-filename ,.picker-videos-upload-loadingthumb {color: =
rgb(153, 153, 153); background: transparent url("//ssl.gstatic.com/docs/pic=
ker/images/placeholder-v1.gif") repeat scroll 0% 0%;}
..picker-videos-upload-error .picker-videos-upload-loadingthumb {background:=
rgb(215, 0, 0) none repeat scroll 0% 0%;}
..picker-videos-upload-loadingthumb {width: 240px; height: 180px;}
..picker-photos-upload-filename {padding-top: 5px; height: 115px; width: 160=
px;}
..picker-videos-upload-metadata {vertical-align: top; width: 100%;}
..picker-videos-upload-processing {font-size: 12px; color: rgb(170, 170, 170=
);}
..picker-videos-upload-error {font-size: 12px; color: rgb(204, 51, 51);}
..upload-state-complete .picker-photos-upload-filename {background-color: rg=
b(245, 245, 245);}
..picker-photos-upload-rotating ,.upload-state-complete .picker-photos-uploa=
d-filename .picker-photos-upload-loading-icon ,.upload-state-complete .pick=
er-videos-upload-loadingthumb .picker-videos-upload-loading-icon {position:=
absolute !important; top: 50%; left: 50%; background-image: url("//ssl.gst=
atic.com/docs/picker/images/loading-32-v1.gif") !important; height: 32px; w=
idth: 32px; margin: -16px 0px 0px -16px; opacity: 0.3;}
..picker-videos-upload-error.upload-state-complete .picker-videos-upload-loa=
dingthumb .picker-videos-upload-loading-icon {display: none;}
..picker-videos-upload-loadingthumb .picker-videos-upload-loading-icon {posi=
tion: relative !important;}
..upload-state-default .picker-photos-upload-controls ,.upload-state-start .=
picker-photos-upload-controls ,.upload-state-cancel .picker-photos-upload-c=
ontrols ,.upload-state-complete .picker-photos-upload-controls ,.upload-sta=
te-upload .picker-photos-upload-controls ,.upload-state-inqueue .picker-pho=
tos-upload-controls {display: none;}
..picker-videos-upload-control {margin: 2px; border: 6px solid rgb(255, 255,=
255);}
..picker-videos-upload-preview {height: 182px; overflow: hidden; padding: 1p=
x; margin-right: 4px; border: 1px solid rgb(153, 153, 153); position: relat=
ive;}
..picker-photos-upload-preview {opacity: 0.8; overflow: hidden;}
..picker-photos-upload-preview .uploader-thumb-img {border: 1px solid rgb(10=
2, 102, 102); position: relative;}
..picker-photos-upload-description {color: rgb(153, 153, 153); width: 100%; =
height: 1.2em; overflow: hidden; text-align: center; text-overflow: ellipsi=
s; white-space: nowrap; position: absolute;}
..picker-videoupload .upload-state-complete .picker-photos-upload-preview .u=
ploader-thumb-img {border: 1px solid rgb(192, 192, 192); position: relative=
;}
..picker-videoupload .upload-state-complete .picker-photos-upload-preview {o=
pacity: 1; overflow: visible;}
..picker-videoupload .upload-state-default .progress-bar-horizontal ,.picker=
-videoupload .upload-state-inqueue .progress-bar-horizontal ,.picker-videou=
pload .upload-state-error .progress-bar-horizontal ,.picker-videoupload .up=
load-state-cancel .progress-bar-horizontal ,.picker-videoupload .upload-sta=
te-complete .progress-bar-horizontal {display: none;}
..photo-zoomview {position: relative; z-index: 2105;}
:first-child + html .photo-zoomview {background-color: rgb(255, 255, 255); =
padding-top: 3px;}
..picker-zoomview-image {background: rgb(255, 255, 255) none repeat scroll 0=
% 0%; margin: 0px 3px; padding-top: 22px;}
..photo-loading .photo-loading-indicator {display: block; font-size: 20pt; f=
ont-weight: bold; font-family: Roboto,Arial,sans-serif; text-align: center;=
width: 100%; position: absolute; top: 0px; margin: 1em;}
..scaledimage-onscreenpane {display: inline-block; position: relative;}
..upload-uploader-file-grid {margin: 10px 5px 0px;}
..picker-photos-welcome {bottom: 10px;}
..picker-photos-welcome-text {font-size: 13px; padding-left: 15px;}
..picker-photos-welcome-section {padding: 15px 15px 0px;}
..picker-photos-welcome-line {border-bottom: 1px solid rgb(221, 221, 221); p=
adding-top: 20px;}
..picker-photos-welcome-link {color: rgb(153, 153, 153);}
..picker-photos-welcome-icon-top {vertical-align: top;}
..picker-photos-welcome-desc {margin: 10px 0px 20px; font-size: 12px;}
..picker-photos-welcome-source-link {font-weight: bold; color: rgb(17, 85, 2=
04); cursor: pointer;}
..picker-photos-welcome-title {font-weight: bold; color: rgb(0, 0, 0);}
..picker-main-container .picker-photos-welcome .goog-imageless-button {font-=
weight: bold; color: rgb(34, 34, 34);}
..picker-html5-video {background: rgb(0, 0, 0) none repeat scroll 0% 0%;}
..picker-video-upload-processing ,.video-upload-box .picker-photo-control-lo=
ading {height: 270px; width: 360px; background-color: rgb(238, 238, 238);}
..picker-videosgrid .picker-photo-control {margin-top: 20px; margin-left: 20=
px;}
..picker-video-processing-text {position: absolute; bottom: 5px; left: 0px; =
right: 0px; height: 20px; text-align: center; z-index: 2109; opacity: 0.8; =
color: rgb(153, 153, 153); font-size: 12px;}
..picker-video-upload-spinner {z-index: 2109; background-image: url("//ssl.g=
static.com/docs/picker/images/loading-v1.gif"); height: 16px; width: 16px; =
opacity: 0.5; position: absolute; top: 50%; margin-top: -20px; left: 50%; m=
argin-left: -8px;}
..video-upload-box .picker-upload-filename-inner ,.video-upload-box-error .p=
icker-upload-filename-inner ,.picker-video-upload-filename {position: absol=
ute; top: 50%; margin-top: 3px; text-align: center; padding-top: 0px; z-ind=
ex: 2104; height: 14px; width: 120px; text-overflow: ellipsis; white-space:=
nowrap; overflow: hidden; font-size: 12px; color: rgb(153, 153, 153);}
..video-upload-box .picker-spr-video-upload-icon {opacity: 0.5; position: ab=
solute; top: 50%; margin-top: -20px; left: 50%; margin-left: -11px;}
..video-upload-box .picker-photos-upload-filename {background-color: rgb(238=
, 238, 238); background-image: none;}
..video-upload-box .picker-photos-upload-controls {display: none;}
..picker-videosgrid .picker-photo-control-focused ,.picker-videosgrid .picke=
r-photo-control-focused.picker-photo-control ,.picker-videosgrid .picker-ph=
oto-control ,.picker-videosgrid .picker-photo-control.picker-photo-control-=
focused {outline: medium none; border: medium none;}
..picker-remove-video-single {position: relative; margin-left: 600px; margin=
-top: 10px; cursor: pointer;}
..video-upload-box .progress-bar-horizontal {right: 0px; bottom: 0px; left: =
0px; height: 8px; border: 1px solid rgb(153, 153, 153); margin: 0px 8px 8px=
; padding: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; z-=
index: 2109;}
..video-upload-box .progress-bar-thumb {height: 100%; background-repeat: rep=
eat-x; background-size: 20px 10px; background-color: rgb(204, 204, 204); ba=
ckground-attachment: scroll; background-image: linear-gradient(315deg, tran=
sparent, transparent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%,=
transparent 66%, transparent); animation-duration: 0.8s; animation-iterati=
on-count: infinite; animation-timing-function: linear;}
..video-upload-box .picker-spr-close-box-small-off {position: absolute; opac=
ity: 0.5; cursor: pointer; z-index: 2109; top: 5px; right: 5px;}
..video-upload-box .picker-spr-upload-error {position: absolute; top: 50%; m=
argin-top: -20px; left: 50%; margin-left: -8px;}
..picker-videosgrid .picker-edit-toolbar {display: none;}
..picker-videomsgbar.picker-msgbar.jfk-butterBar {width: 180px; z-index: 220=
0 !important;}
..picker-videosgrid .picker-photo-control-preview.picker-video-player {z-ind=
ex: 2103;}
..picker-videosgrid .new-upload-box-error .picker-photos-error-text {bottom:=
0px;}
..picker-html5-player-wrapper ,.picker-video-thumbnail {position: absolute; =
top: 0px; bottom: 0px; left: 0px; right: 0px;}
..picker-ribbon-wrapper {overflow: hidden; position: absolute; top: -3px; le=
ft: -3px; width: 85px; height: 88px;}
..picker-ribbon {position: relative; padding: 6px 0px; left: -24px; top: 24p=
x; width: 120px; font-size: 10px; font-weight: bold; color: rgb(255, 255, 2=
55); text-align: center; text-shadow: 0px 2px 0px rgba(0, 0, 0, 0.5); text-=
transform: uppercase; opacity: 0.9; transform: rotate(-45deg); background-c=
olor: rgb(170, 0, 0); background-image: -moz-linear-gradient(center top , r=
gb(255, 0, 0), rgb(170, 0, 0)); box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);=
}
..goog-inline-block {position: relative; display: inline-block;}
* html .goog-inline-block ,:first-child + html .goog-inline-block ,body .go=
og-inline-block {display: inline;}
..jfk-button {border-radius: 2px; cursor: default; font-size: 11px; font-wei=
ght: bold; text-align: center; white-space: nowrap; margin-right: 16px; hei=
ght: 27px; line-height: 27px; min-width: 54px; outline: 0px none; padding: =
0px 8px;}
..jfk-button-hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
..jfk-button-selected {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..jfk-button .jfk-button-img {margin-top: -3px; vertical-align: middle;}
..jfk-button-label {margin-left: 5px;}
..jfk-button-narrow {min-width: 34px; padding: 0px;}
..jfk-button-collapse-left ,.jfk-button-collapse-right {z-index: 1;}
..jfk-button-collapse-left.jfk-button-disabled {z-index: 0;}
..jfk-button-checked.jfk-button-collapse-left ,.jfk-button-checked.jfk-butto=
n-collapse-right {z-index: 2;}
..jfk-button-collapse-left:focus ,.jfk-button-collapse-right:focus ,.jfk-but=
ton-hover.jfk-button-collapse-left ,.jfk-button-hover.jfk-button-collapse-r=
ight {z-index: 3;}
..jfk-button-collapse-left {margin-left: -1px; border-bottom-left-radius: 0p=
x; border-top-left-radius: 0px;}
..jfk-button-collapse-right {margin-right: 0px; border-top-right-radius: 0px=
; border-bottom-right-radius: 0px;}
..jfk-button.jfk-button-disabled:active {box-shadow: none;}
..jfk-button-action {box-shadow: none; background-color: rgb(77, 144, 254); =
background-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(=
71, 135, 237)); border: 1px solid rgb(48, 121, 237); color: rgb(255, 255, 2=
55);}
..jfk-button-action.jfk-button-hover {box-shadow: none; background-color: rg=
b(53, 122, 232); background-image: -moz-linear-gradient(center top , rgb(77=
, 144, 254), rgb(53, 122, 232)); border: 1px solid rgb(47, 91, 183);}
..jfk-button-action:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) in=
set; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0)=
;}
..jfk-button-action.jfk-button-clear-outline {box-shadow: none; outline: med=
ium none;}
..jfk-button-action:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset=
; background: rgb(53, 122, 232) none repeat scroll 0% 0%; border: 1px solid=
rgb(47, 91, 183);}
..jfk-button-action.jfk-button-disabled {background: rgb(77, 144, 254) none =
repeat scroll 0% 0%; opacity: 0.5;}
..jfk-button-contrast {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..jfk-button-contrast.jfk-button-hover ,.jfk-button-contrast.jfk-button-clea=
r-outline.jfk-button-hover {box-shadow: none; background-color: rgb(248, 24=
8, 248); background-image: -moz-linear-gradient(center top , rgb(248, 248, =
248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); color: rgb=
(51, 51, 51);}
..jfk-button-contrast:active ,.jfk-button-contrast.jfk-button-hover:active {=
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 248,=
248) none repeat scroll 0% 0%;}
..jfk-button-contrast.jfk-button-selected ,.jfk-button-contrast.jfk-button-c=
lear-outline.jfk-button-selected {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..jfk-button-contrast.jfk-button-checked ,.jfk-button-contrast.jfk-button-cl=
ear-outline.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) =
inset; background-color: rgb(238, 238, 238); background-image: -moz-linear-=
gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px =
solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-contrast:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..jfk-button-contrast.jfk-button-clear-outline {border: 1px solid rgb(220, 2=
20, 220); outline: medium none;}
..jfk-button-contrast.jfk-button-disabled {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..jfk-button-contrast .jfk-button-img {opacity: 0.55;}
..jfk-button-contrast.jfk-button-checked .jfk-button-img ,.jfk-button-contra=
st.jfk-button-selected .jfk-button-img ,.jfk-button-contrast.jfk-button-hov=
er .jfk-button-img {opacity: 0.9;}
..jfk-button-contrast.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-default {box-shadow: none; background-color: rgb(61, 148, 0); b=
ackground-image: -moz-linear-gradient(center top , rgb(61, 148, 0), rgb(57,=
138, 0)); border: 1px solid rgb(41, 105, 29); color: rgb(255, 255, 255); t=
ext-shadow: 0px 1px rgba(0, 0, 0, 0.1);}
..jfk-button-default.jfk-button-hover {box-shadow: none; background-color: r=
gb(54, 130, 0); background-image: -moz-linear-gradient(center top , rgb(61,=
148, 0), rgb(54, 130, 0)); border: 1px solid rgb(45, 98, 0); text-shadow: =
0px 1px rgba(0, 0, 0, 0.3);}
..jfk-button-default:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0=
);}
..jfk-button-default.jfk-button-clear-outline {box-shadow: none; outline: me=
dium none;}
..jfk-button-default:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t; background: rgb(54, 130, 0) none repeat scroll 0% 0%; border: 1px solid =
rgb(45, 98, 0);}
..jfk-button-default.jfk-button-disabled {background: rgb(61, 148, 0) none r=
epeat scroll 0% 0%; opacity: 0.5;}
..jfk-button-primary {box-shadow: none; background-color: rgb(209, 72, 54); =
background-image: -moz-linear-gradient(center top , rgb(221, 75, 57), rgb(2=
09, 72, 54)); border: 1px solid transparent; color: rgb(255, 255, 255); tex=
t-shadow: 0px 1px rgba(0, 0, 0, 0.1); text-transform: uppercase;}
..jfk-button-primary.jfk-button-hover {box-shadow: 0px 1px 1px rgba(0, 0, 0,=
0.2); background-color: rgb(197, 55, 39); background-image: -moz-linear-gr=
adient(center top , rgb(221, 75, 57), rgb(197, 55, 39)); border-width: 1px;=
border-style: solid; border-color: rgb(176, 40, 26) rgb(176, 40, 26) rgb(1=
75, 48, 31); -moz-border-top-colors: none; -moz-border-right-colors: none; =
-moz-border-bottom-colors: none; -moz-border-left-colors: none; border-imag=
e: none;}
..jfk-button-primary:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0=
);}
..jfk-button-primary.jfk-button-clear-outline {box-shadow: none; outline: me=
dium none;}
..jfk-button-primary:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t; background-color: rgb(176, 40, 26); background-image: -moz-linear-gradie=
nt(center top , rgb(221, 75, 57), rgb(176, 40, 26)); border: 1px solid rgb(=
153, 42, 27);}
..jfk-button-primary.jfk-button-disabled {background: rgb(209, 72, 54) none =
repeat scroll 0% 0%; opacity: 0.5;}
..jfk-slideToggle {border-radius: 2px; box-shadow: 0px 1px 2px 0px rgba(0, 0=
, 0, 0.1) inset; background-color: rgb(245, 245, 245); background-image: -m=
oz-linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); bo=
rder: 1px solid rgb(204, 204, 204); color: rgb(102, 102, 102); font-weight:=
bold; height: 27px; line-height: 27px; margin-right: 16px; outline: medium=
none; overflow: hidden; padding: 0px; position: relative; width: 94px;}
..jfk-slideToggle-on ,.jfk-slideToggle-off ,.jfk-slideToggle-thumb {display:=
inline-block; text-align: center; text-transform: uppercase; width: 47px;}
..jfk-slideToggle-on {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1) inset; =
background-color: rgb(57, 139, 242); background-image: -moz-linear-gradient=
(center top , rgb(59, 147, 255), rgb(54, 137, 238)); color: rgb(255, 255, 2=
55); height: 27px;}
..jfk-slideToggle-off {border-radius: 2px 2px 0px 0px;}
..jfk-slideToggle-thumb {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); bac=
kground-color: rgb(245, 245, 245); background-image: -moz-linear-gradient(c=
enter top , rgb(248, 248, 248), rgb(241, 241, 241)); transition: all 0.13s =
ease-out 0s; border: 1px solid rgb(204, 204, 204); display: block; height: =
27px; left: -1px; position: absolute; top: -1px;}
..jfk-slideToggle-thumb::after {content: ""; background-image: -moz-linear-g=
radient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-linear=
-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-line=
ar-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-li=
near-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-=
linear-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%); bac=
kground-position: 0px 0px, 0px 2px, 0px 4px, 0px 6px, 0px 8px; background-r=
epeat: repeat-x; background-size: 2px 1px; display: block; height: 9px; lef=
t: 15px; position: absolute; top: 9px; width: 17px;}
..jfk-slideToggle.jfk-slideToggle-checked .jfk-slideToggle-thumb {left: 47px=
;}
..jfk-slideToggle:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-slideToggle.jfk-slideToggle-clearOutline {border: 1px solid rgb(204, 2=
04, 204);}
..jfk-button-standard {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..jfk-button-standard.jfk-button-hover ,.jfk-button-standard.jfk-button-clea=
r-outline.jfk-button-hover {box-shadow: none; background-color: rgb(248, 24=
8, 248); background-image: -moz-linear-gradient(center top , rgb(248, 248, =
248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); color: rgb=
(51, 51, 51);}
..jfk-button-standard:active ,.jfk-button-standard.jfk-button-hover:active {=
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 248,=
248) none repeat scroll 0% 0%; color: rgb(51, 51, 51);}
..jfk-button-standard.jfk-button-selected ,.jfk-button-standard.jfk-button-c=
lear-outline.jfk-button-selected {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..jfk-button-standard.jfk-button-checked ,.jfk-button-standard.jfk-button-cl=
ear-outline.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) =
inset; background-color: rgb(238, 238, 238); background-image: -moz-linear-=
gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px =
solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-standard:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..jfk-button-standard.jfk-button-clear-outline {border: 1px solid rgba(0, 0,=
0, 0.1); outline: medium none;}
..jfk-button-standard.jfk-button-disabled {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..jfk-button-standard .jfk-button-img {opacity: 0.55;}
..jfk-button-standard.jfk-button-checked .jfk-button-img ,.jfk-button-standa=
rd.jfk-button-selected .jfk-button-img ,.jfk-button-standard.jfk-button-hov=
er .jfk-button-img {opacity: 0.9;}
..jfk-button-standard.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-flat {border-radius: 0px; border: 1px solid transparent; font-s=
ize: 13px; font-weight: normal; height: 21px; line-height: 21px; margin-rig=
ht: 1px; min-width: 0px; padding: 0px;}
..jfk-button-flat.jfk-button-hover ,.jfk-button-flat.jfk-button-selected ,.j=
fk-button-flat:focus ,.jfk-button-flat:active {box-shadow: none;}
..jfk-button-flat .jfk-button-img {height: 21px; opacity: 0.55; width: 21px;=
}
..jfk-button-flat .jfk-button-label {display: inline-block; margin: 0px; pad=
ding: 0px 1px;}
..jfk-button-flat.jfk-button-selected .jfk-button-img ,.jfk-button-flat.jfk-=
button-hover .jfk-button-img {opacity: 0.9;}
..jfk-button-flat.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-flat:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-button-flat.jfk-button-clear-outline {border: 1px solid transparent;}
..jfk-button-mini {background-color: rgb(245, 245, 245); background-image: -=
moz-linear-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241)); b=
order: 1px solid rgba(0, 0, 0, 0.1); color: rgb(68, 68, 68); height: 17px; =
line-height: 17px; min-width: 22px; text-shadow: 0px 1px rgba(0, 0, 0, 0.1)=
;}
..jfk-button-mini.jfk-button-hover ,.jfk-button-mini.jfk-button-clear-outlin=
e.jfk-button-hover {background-color: rgb(248, 248, 248); background-image:=
-moz-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));=
border: 1px solid rgb(198, 198, 198); text-shadow: 0px 1px rgba(0, 0, 0, 0=
..3);}
..jfk-button-mini:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..jfk-button-mini.jfk-button-checked ,.jfk-button-mini.jfk-button-clear-outl=
ine.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; b=
ackground-color: rgb(224, 224, 224); background-image: -moz-linear-gradient=
(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px solid rg=
b(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-mini:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-button-mini.jfk-button-clear-outline {border: 1px solid rgb(220, 220, =
220);}
..jfk-button-mini.jfk-button-disabled {background: rgb(255, 255, 255) none r=
epeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(184, =
184, 184);}
..jfk-butterBar {border-radius: 2px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0=
..2); transition: all 0s linear 1s, opacity 1s ease 0s; border-style: solid;=
border-width: 0px; font-size: 11px; height: 0px; opacity: 0; visibility: h=
idden; overflow: hidden; padding: 0px; text-align: center;}
..jfk-butterBar-info {background-color: rgb(249, 237, 190); border-color: rg=
b(240, 195, 109); color: rgb(51, 51, 51);}
..jfk-butterBar-error {background-color: rgb(72, 72, 72); border-color: rgb(=
32, 32, 32); color: rgb(255, 255, 255);}
..jfk-butterBar-promo {background-color: rgb(214, 233, 248); border-color: r=
gb(77, 144, 240); color: rgb(51, 51, 51);}
..jfk-butterBar-warning {background-color: rgb(221, 75, 57); border-color: r=
gb(96, 32, 25); color: rgb(255, 255, 255);}
..jfk-butterBar-shown {transition: opacity 0.218s ease 0s; border-width: 1px=
; min-height: 14px; height: auto; opacity: 1; visibility: visible; padding:=
6px 16px;}
..jfk-butterBar-mini.jfk-butterBar-shown {padding: 2px 16px;}
..picker-dialog {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); position: absolute; box-shadow: 0px 4px=
16px rgba(0, 0, 0, 0.2); z-index: 1021; outline: medium none; padding: 0px=
;}
..picker.modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative; border: 0px none;}
..picker.modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 1001;}
..picker.modal-dialog-title ,.picker.modal-dialog-buttons {display: none;}
..picker-frame {width: 100%; height: 100%; border: 0px none; overflow: hidde=
n;}
..picker-upload-button-visible .picker-drag-drop-supported .picker-photos-up=
load-dropzone-cell {vertical-align: middle;}
..picker-photos-upload-dropzone td {text-align: center;}
..picker .progress-bar-thumb {background-color: rgb(93, 128, 239);}
..goog-tab-bar {margin: 0px; border: 0px none; padding: 0px; list-style: out=
side none none; cursor: default; outline: medium none; background: rgb(235,=
239, 249) none repeat scroll 0% 0%;}
..goog-tab-bar-clear {clear: both; height: 0px; overflow: hidden;}
..goog-tab-bar-start {float: left;}
..goog-tab-bar-end {float: right;}
* html .goog-tab-bar-start ,body .goog-tab-bar-start {margin-right: -3px;}
* html .goog-tab-bar-end ,body .goog-tab-bar-end {margin-left: -3px;}
div.tr_bubble {position: absolute;}
..tr_bubble_link {color: rgb(0, 0, 204); text-decoration: underline; cursor:=
pointer; font-size: 100%;}
..tr_bubble .tr_option-link ,.tr_bubble #tr_delete-image ,.tr_bubble #tr_mod=
ule-options-link {font-size: 83%;}
..tr_bubble .tr_body ,.tr_bubble .tr_t ,.tr_bubble .tr_l ,.tr_bubble .tr_r ,=
..tr_bubble .tr_b {background-color: rgb(224, 236, 255);}
..tr_bubble .tr_body {padding: 0px 19px 4px 4px; white-space: nowrap;}
..tr_bubble .tr_spacer {padding: 1px;}
..tr_bubble .tr_body ,.tr_bubble .tr_td ,.tr_bubble .tr_th {font-size: 83%; =
font-family: Arial,Helvetica,sans-serif;}
..tr_bubble .tr_tr ,.tr_bubble .tr_tl ,.tr_bubble .tr_bl ,.tr_bubble .tr_br =
{background-repeat: no-repeat; height: 0px; width: 2px;}
..tr_bubble .tr_tr {background-image: url("//ssl.gstatic.com/editor/bubble2_=
tr.gif");}
..tr_bubble .tr_tl {background-image: url("//ssl.gstatic.com/editor/bubble2_=
tl.gif");}
..tr_bubble .tr_bl {background-image: url("//ssl.gstatic.com/editor/bubble2_=
bl.gif");}
..tr_bubble .tr_br {background-image: url("//ssl.gstatic.com/editor/bubble2_=
br.gif");}
..tr_bubble .tr_t {border-top: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_b {border-bottom: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_l {border-left: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_r {border-right: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_tr ,.tr_bubble .tr_tl ,.tr_bubble .tr_bl ,.tr_bubble .tr_br =
,.tr_bubble .tr_b ,.tr_bubble .tr_t {line-height: 0; font-size: 1px;}
..tr_bubble_closebox {position: absolute; cursor: default; background: rgba(=
0, 0, 0, 0) url("//ssl.gstatic.com/editor/bubble_closebox.gif") no-repeat s=
croll left top; padding: 0px; margin: 0px; width: 10px; height: 10px; top: =
3px; right: 5px;}
div.tr_bubble_panel {padding: 2px 0px 1px;}
div.tr_bubble_panel_title {display: none;}
div.tr_multi_bubble div.tr_bubble_panel_title {margin-right: 1px; display: =
block; float: left; width: 50px;}
div.tr_multi_bubble div.tr_bubble_panel {padding: 2px 0px 1px; margin-right=
: 50px;}
..ee-content {width: 400px; height: 200px; overflow: auto; padding: 4px 8px;=
background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid=
rgb(51, 102, 153);}
..ee-tex {width: 388px; height: 60px; border: 1px solid rgb(0, 0, 0); margin=
-top: 4px; margin-bottom: 10px; display: block;}
..ee-preview-container {width: 380px; height: 80px; overflow: auto; border: =
1px solid rgb(204, 204, 204); padding: 4px;}
..editable a ,body a {cursor: text;}
..tr_well .tr_tl {background-image: url("//ssl.gstatic.com/editor/well_tl2.g=
if"); background-repeat: no-repeat;}
..tr_well .tr_t {background-image: url("//ssl.gstatic.com/editor/well_top2.g=
if"); background-repeat: repeat-x;}
..tr_well .tr_tr {background-image: url("//ssl.gstatic.com/editor/well_tr.gi=
f"); background-repeat: no-repeat;}
..tr_well .tr_l {background-image: url("//ssl.gstatic.com/editor/well_left.g=
if"); background-repeat: repeat-y;}
..tr_well .tr_r {background-image: url("//ssl.gstatic.com/editor/well_right.=
gif"); background-repeat: repeat-y;}
..tr_well .tr_r2 {background-image: url("//ssl.gstatic.com/editor/well_right=
2.gif"); background-repeat: repeat-y; background-position: right center;}
..tr_well .tr_bl {background-image: url("//ssl.gstatic.com/editor/well_bl.gi=
f"); background-repeat: no-repeat;}
..tr_well .tr_b {background-image: url("//ssl.gstatic.com/editor/well_bottom=
..gif"); background-repeat: repeat-x;}
..tr_well .tr_br {background-image: url("//ssl.gstatic.com/editor/well_br.gi=
f"); background-repeat: no-repeat;}
..tr_toolbar-styles .tr_well {border: medium none; padding: 0px; font-size: =
83%; text-align: center;}
..tr_toolbar-vertical .tr_toolbar-styles .tr_well .tr_separator {height: 5px=
; display: block;}
..tr_toolbar-styles .tr_well .tr_selected-style {background: rgb(250, 209, 9=
9) none repeat scroll 0% 0%;}
..tr_toolbar-styles .tr_well .tr_unselected-style span {color: rgb(97, 97, 1=
88); text-decoration: underline; font-weight: normal; cursor: pointer;}
..tr_toolbar-styles .tr_well .tr_selected-style span {font-weight: bold; cur=
sor: pointer;}
..tr_toolbar-vertical .tr_toolbar-styles {float: left;}
..tr_toolbar-vertical .tr_toolbar-styles .tr_well {width: 7.8em;}
..goog-tab {position: relative; border: 1px solid rgb(51, 102, 153); padding=
: 4px 8px; color: rgb(51, 51, 51); background: rgb(221, 221, 221) none repe=
at scroll 0% 0%; cursor: default;}
..goog-tab-bar-top .goog-tab {margin: 1px 4px 0px 0px; border-bottom: 0px no=
ne; float: left;}
..goog-tab-bar-bottom .goog-tab {margin: 0px 4px 1px 0px; border-top: 0px no=
ne; float: left;}
..goog-tab-bar-start .goog-tab {margin: 0px 0px 4px 1px; border-right: 0px n=
one;}
..goog-tab-bar-end .goog-tab {margin: 0px 1px 4px 0px; border-left: 0px none=
;}
..goog-tab-hover {background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..goog-tab-disabled {color: rgb(255, 255, 255); background: rgb(204, 204, 20=
4) none repeat scroll 0% 0%; border-color: rgb(204, 204, 204);}
..goog-tab-selected {background: rgb(255, 255, 255) none repeat scroll 0% 0%=
!important;}
..goog-tab-bar-top .goog-tab-selected {top: 1px; margin-top: 0px; padding-bo=
ttom: 5px;}
..goog-tab-bar-bottom .goog-tab-selected {top: -1px; margin-bottom: 0px; pad=
ding-top: 5px;}
..goog-tab-bar-start .goog-tab-selected {left: 1px; margin-left: 0px; paddin=
g-right: 9px;}
..goog-tab-bar-end .goog-tab-selected {left: -1px; margin-right: 0px; paddin=
g-left: 9px;}
..tr_tabbed-pane-tabs {line-height: 1.3; vertical-align: top; font-size: 10p=
t;}
..tr_tabbed-pane-tabs p {margin-bottom: 0.7ex; font-size: 10pt;}
..tr_tabbed-pane-tabs div {cursor: pointer; width: 148px;}
..tr_tabbed-pane-tabs .tr_tabbed-pane-tab-label {color: blue; text-decoratio=
n: underline;}
..tr_tabbed-pane-tabs td {font-size: 13px;}
..tr_vertical-tab div {padding: 0.5ex 0px 0.5ex 0.7ex;}
..tr_tabbed-pane {padding: 1.3ex 0px; font-size: 10pt;}
..tr_tabbed-pane-tabs .tr_selected-tab-in-tabbed-pane {background: white non=
e repeat scroll 0% 0%;}
..tr_tabbed-pane-tabs .tr_selected-tab-in-tabbed-pane .tr_tabbed-pane-tab-la=
bel {color: black; font-weight: bold; text-decoration: none;}
..tr_tabbed-pane-tab-content {width: 100%; vertical-align: top; padding: 5px=
7px 1px; background: white none repeat scroll 0% 0%; font-size: 10pt;}
..goog-palette {cursor: default; outline: medium none;}
..goog-palette-table {border: 1px solid rgb(102, 102, 102); border-collapse:=
collapse; margin: 5px;}
..goog-palette-cell {border-width: 0px 1px 0px 0px; border-style: none solid=
none none; border-color: currentcolor rgb(102, 102, 102) currentcolor curr=
entcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -mo=
z-border-bottom-colors: none; -moz-border-left-colors: none; border-image: =
none; cursor: pointer; height: 18px; margin: 0px; text-align: center; verti=
cal-align: middle; width: 18px;}
..goog-palette-cell .goog-palette-colorswatch {border: medium none; font-siz=
e: x-small; height: 18px; position: relative; width: 18px;}
..goog-palette-cell-hover .goog-palette-colorswatch {border: 1px solid rgb(2=
55, 255, 255); height: 16px; width: 16px;}
..goog-palette-cell-selected .goog-palette-colorswatch {background: rgba(0, =
0, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll=
-368px 0px; border: 1px solid rgb(51, 51, 51); color: rgb(255, 255, 255); =
font-weight: bold; height: 16px; width: 16px;}
..goog-palette-customcolor {background-color: rgb(250, 250, 250); border: 1p=
x solid rgb(238, 238, 238); color: rgb(102, 102, 102); font-size: x-small; =
height: 15px; position: relative; width: 15px;}
..goog-palette-cell-hover .goog-palette-customcolor {background-color: rgb(2=
55, 238, 238); border: 1px solid rgb(255, 102, 102); color: rgb(255, 102, 1=
02);}
..goog-inline-block {position: relative; display: inline-block;}
* html .goog-inline-block ,body .goog-inline-block {display: inline;}
:first-child + html .goog-inline-block {display: inline;}
..goog-menu-button {background: rgb(221, 221, 221) url("//ssl.gstatic.com/ed=
itor/button-bg.png") repeat-x scroll left top; border: 0px none; color: rgb=
(0, 0, 0); cursor: pointer; list-style: outside none none; margin: 2px; out=
line: medium none; padding: 0px; text-decoration: none; vertical-align: mid=
dle;}
..goog-menu-button-outer-box ,.goog-menu-button-inner-box {border-style: sol=
id; border-color: rgb(170, 170, 170); vertical-align: top;}
..goog-menu-button-outer-box {margin: 0px; border-width: 1px 0px; padding: 0=
px;}
..goog-menu-button-inner-box {margin: 0px -1px; border-width: 0px 1px; paddi=
ng: 3px 4px;}
* html .goog-menu-button-inner-box ,body .goog-menu-button-inner-box {left:=
-1px;}
* html .goog-menu-button-rtl .goog-menu-button-outer-box ,body .goog-menu-b=
utton-rtl .goog-menu-button-outer-box {left: -1px; right: auto;}
* html .goog-menu-button-rtl .goog-menu-button-inner-box ,body .goog-menu-b=
utton-rtl .goog-menu-button-inner-box {right: auto;}
:first-child + html .goog-menu-button-inner-box {left: -1px;}
:first-child + html .goog-menu-button-rtl .goog-menu-button-inner-box {left=
: 1px; right: auto;}
..goog-menu-button-disabled {background-image: none !important; opacity: 0.3=
;}
..goog-menu-button-disabled .goog-menu-button-outer-box ,.goog-menu-button-d=
isabled .goog-menu-button-inner-box ,.goog-menu-button-disabled .goog-menu-=
button-caption ,.goog-menu-button-disabled .goog-menu-button-dropdown {colo=
r: rgb(51, 51, 51) !important; border-color: rgb(153, 153, 153) !important;=
}
* html .goog-menu-button-disabled ,body .goog-menu-button-disabled {margin:=
2px 1px !important; padding: 0px 1px !important;}
:first-child + html .goog-menu-button-disabled {margin: 2px 1px !important;=
padding: 0px 1px !important;}
..goog-menu-button-hover .goog-menu-button-outer-box ,.goog-menu-button-hove=
r .goog-menu-button-inner-box {border-color: rgb(153, 204, 255) rgb(102, 15=
3, 238) rgb(102, 153, 238) rgb(119, 170, 255) !important;}
..goog-menu-button-active ,.goog-menu-button-open {background-color: rgb(187=
, 187, 187); background-position: left bottom;}
..goog-menu-button-focused .goog-menu-button-outer-box ,.goog-menu-button-fo=
cused .goog-menu-button-inner-box {border-color: orange;}
..goog-menu-button-caption {padding: 0px 4px 0px 0px; vertical-align: top;}
..goog-menu-button-dropdown {height: 15px; width: 7px; background: rgba(0, 0=
, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll =
-388px 0px; vertical-align: top;}
..goog-menu-button-collapse-right ,.goog-menu-button-collapse-right .goog-me=
nu-button-outer-box ,.goog-menu-button-collapse-right .goog-menu-button-inn=
er-box {margin-right: 0px;}
..goog-menu-button-collapse-left ,.goog-menu-button-collapse-left .goog-menu=
-button-outer-box ,.goog-menu-button-collapse-left .goog-menu-button-inner-=
box {margin-left: 0px;}
..goog-menu-button-collapse-left .goog-menu-button-inner-box {border-left: 1=
px solid rgb(255, 255, 255);}
..goog-menu-button-collapse-left.goog-menu-button-checked .goog-menu-button-=
inner-box {border-left: 1px solid rgb(221, 221, 221);}
..goog-color-menu-button-indicator {border-bottom: 4px solid rgb(240, 240, 2=
40);}
..goog-color-menu-button .goog-menu-button-inner-box ,.goog-toolbar-color-me=
nu-button .goog-toolbar-menu-button-inner-box {padding-top: 2px !important;=
padding-bottom: 2px !important;}
..goog-custom-button {margin: 2px; border: 0px none; padding: 0px; font-fami=
ly: Arial,sans-serif; color: rgb(0, 0, 0); background: rgb(221, 221, 221) u=
rl("//ssl.gstatic.com/editor/button-bg.png") repeat-x scroll left top; text=
-decoration: none; list-style: outside none none; vertical-align: middle; c=
ursor: default; outline: medium none;}
..goog-custom-button-outer-box ,.goog-custom-button-inner-box {border-style:=
solid; border-color: rgb(170, 170, 170); vertical-align: top;}
..goog-custom-button-outer-box {margin: 0px; border-width: 1px 0px; padding:=
0px;}
..goog-custom-button-inner-box {margin: 0px -1px; border-width: 0px 1px; pad=
ding: 3px 4px; white-space: nowrap;}
* html .goog-custom-button-inner-box ,body .goog-custom-button-inner-box {l=
eft: -1px;}
* html .goog-custom-button-rtl .goog-custom-button-outer-box ,body .goog-cu=
stom-button-rtl .goog-custom-button-outer-box {left: -1px;}
* html .goog-custom-button-rtl .goog-custom-button-inner-box ,body .goog-cu=
stom-button-rtl .goog-custom-button-inner-box {right: auto;}
:first-child + html .goog-custom-button-inner-box {left: -1px;}
:first-child + html .goog-custom-button-rtl .goog-custom-button-inner-box {=
left: 1px;}
..goog-custom-button-disabled {background-image: none !important; opacity: 0=
..3;}
..goog-custom-button-disabled .goog-custom-button-outer-box ,.goog-custom-bu=
tton-disabled .goog-custom-button-inner-box {color: rgb(51, 51, 51) !import=
ant; border-color: rgb(153, 153, 153) !important;}
* html .goog-custom-button-disabled ,body .goog-custom-button-disabled {mar=
gin: 2px 1px !important; padding: 0px 1px !important;}
:first-child + html .goog-custom-button-disabled {margin: 2px 1px !importan=
t; padding: 0px 1px !important;}
..goog-custom-button-hover .goog-custom-button-outer-box ,.goog-custom-butto=
n-hover .goog-custom-button-inner-box {border-color: rgb(153, 204, 255) rgb=
(102, 153, 238) rgb(102, 153, 238) rgb(119, 170, 255) !important;}
..goog-custom-button-active ,.goog-custom-button-checked {background-color: =
rgb(187, 187, 187); background-position: left bottom;}
..goog-custom-button-focused .goog-custom-button-outer-box ,.goog-custom-but=
ton-focused .goog-custom-button-inner-box {border-color: orange;}
..goog-custom-button-collapse-right ,.goog-custom-button-collapse-right .goo=
g-custom-button-outer-box ,.goog-custom-button-collapse-right .goog-custom-=
button-inner-box {margin-right: 0px;}
..goog-custom-button-collapse-left ,.goog-custom-button-collapse-left .goog-=
custom-button-outer-box ,.goog-custom-button-collapse-left .goog-custom-but=
ton-inner-box {margin-left: 0px;}
..goog-custom-button-collapse-left .goog-custom-button-inner-box {border-lef=
t: 1px solid rgb(255, 255, 255);}
..goog-custom-button-collapse-left.goog-custom-button-checked .goog-custom-b=
utton-inner-box {border-left: 1px solid rgb(221, 221, 221);}
* html .goog-custom-button-collapse-left .goog-custom-button-inner-box ,bod=
y .goog-custom-button-collapse-left .goog-custom-button-inner-box {left: 0p=
x;}
:first-child + html .goog-custom-button-collapse-left .goog-custom-button-i=
nner-box {left: 0px;}
..goog-menu {background: rgb(255, 255, 255) none repeat scroll 0% 0%; border=
-color: rgb(204, 204, 204) rgb(102, 102, 102) rgb(102, 102, 102) rgb(204, 2=
04, 204); border-style: solid; border-width: 1px; cursor: default; font: 13=
px Arial,sans-serif; margin: 0px; outline: medium none; padding: 4px 0px; p=
osition: absolute; z-index: 20000;}
..goog-menuitem {color: rgb(0, 0, 0); font: 13px Arial,sans-serif; list-styl=
e: outside none none; margin: 0px; padding: 4px 7em 4px 28px; white-space: =
nowrap;}
..goog-menuitem.goog-menuitem-rtl {padding-left: 7em; padding-right: 28px;}
..goog-menu-nocheckbox .goog-menuitem ,.goog-menu-noicon .goog-menuitem {pad=
ding-left: 12px;}
..goog-menu-noaccel .goog-menuitem {padding-right: 20px;}
..goog-menuitem-content {color: rgb(0, 0, 0); font: 13px Arial,sans-serif;}
..goog-menuitem-disabled .goog-menuitem-accel ,.goog-menuitem-disabled .goog=
-menuitem-content {color: rgb(204, 204, 204) !important;}
..goog-menuitem-disabled .goog-menuitem-icon {opacity: 0.3;}
..goog-menuitem-highlight ,.goog-menuitem-hover {background-color: rgb(214, =
233, 248); border-color: rgb(214, 233, 248); border-style: dotted; border-w=
idth: 1px 0px; padding-bottom: 3px; padding-top: 3px;}
..goog-menuitem-checkbox ,.goog-menuitem-icon {background-repeat: no-repeat;=
height: 16px; left: 6px; position: absolute; right: auto; vertical-align: =
middle; width: 16px;}
..goog-menuitem-rtl .goog-menuitem-checkbox ,.goog-menuitem-rtl .goog-menuit=
em-icon {left: auto; right: 6px;}
..goog-option-selected .goog-menuitem-checkbox ,.goog-option-selected .goog-=
menuitem-icon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/e=
ditortoolbar.png") no-repeat scroll -512px 0px;}
..goog-menuitem-accel {color: rgb(153, 153, 153); direction: ltr; left: auto=
; padding: 0px 6px; position: absolute; right: 0px; text-align: right;}
..goog-menuitem-rtl .goog-menuitem-accel {left: 0px; right: auto; text-align=
: left;}
..goog-menuitem-mnemonic-hint {text-decoration: underline;}
..goog-menuitem-mnemonic-separator {color: rgb(153, 153, 153); font-size: 12=
px; padding-left: 4px;}
..goog-menuseparator {border-top: 1px solid rgb(204, 204, 204); margin: 4px =
0px; padding: 0px;}
..goog-toolbar {background: rgb(250, 250, 250) url("//ssl.gstatic.com/editor=
/toolbar-bg.png") repeat-x scroll left bottom; border-bottom: 1px solid rgb=
(213, 213, 213); cursor: default; font: 12px Arial,sans-serif; margin: 0px;=
outline: medium none; padding: 2px; position: relative;}
..goog-toolbar-button {margin: 0px 2px; border: 0px none; padding: 0px; font=
-family: Arial,sans-serif; color: rgb(51, 51, 51); text-decoration: none; l=
ist-style: outside none none; vertical-align: middle; cursor: default; outl=
ine: medium none;}
..goog-toolbar-button-outer-box ,.goog-toolbar-button-inner-box {border: 0px=
none; vertical-align: top;}
..goog-toolbar-button-outer-box {margin: 0px; padding: 1px 0px;}
..goog-toolbar-button-inner-box {margin: 0px -1px; padding: 3px 4px;}
* html .goog-toolbar-button-inner-box ,body .goog-toolbar-button-inner-box =
{left: -1px;}
* html .goog-toolbar-button-rtl .goog-toolbar-button-outer-box ,body .goog-=
toolbar-button-rtl .goog-toolbar-button-outer-box {left: -1px;}
* html .goog-toolbar-button-rtl .goog-toolbar-button-inner-box ,body .goog-=
toolbar-button-rtl .goog-toolbar-button-inner-box {right: auto;}
:first-child + html .goog-toolbar-button-inner-box {left: -1px;}
:first-child + html .goog-toolbar-button-rtl .goog-toolbar-button-inner-box=
{left: 1px; right: auto;}
..goog-toolbar-button-disabled {opacity: 0.3;}
..goog-toolbar-button-disabled .goog-toolbar-button-outer-box ,.goog-toolbar=
-button-disabled .goog-toolbar-button-inner-box {color: rgb(51, 51, 51) !im=
portant; border-color: rgb(153, 153, 153) !important;}
* html .goog-toolbar-button-disabled ,body .goog-toolbar-button-disabled {b=
ackground-color: rgb(240, 240, 240); margin: 0px 1px; padding: 0px 1px;}
:first-child + html .goog-toolbar-button-disabled {background-color: rgb(24=
0, 240, 240); margin: 0px 1px; padding: 0px 1px;}
..goog-toolbar-button-hover .goog-toolbar-button-outer-box ,.goog-toolbar-bu=
tton-active .goog-toolbar-button-outer-box ,.goog-toolbar-button-checked .g=
oog-toolbar-button-outer-box ,.goog-toolbar-button-selected .goog-toolbar-b=
utton-outer-box {border-width: 1px 0px; border-style: solid; padding: 0px;}
..goog-toolbar-button-hover .goog-toolbar-button-inner-box ,.goog-toolbar-bu=
tton-active .goog-toolbar-button-inner-box ,.goog-toolbar-button-checked .g=
oog-toolbar-button-inner-box ,.goog-toolbar-button-selected .goog-toolbar-b=
utton-inner-box {border-width: 0px 1px; border-style: solid; padding: 3px;}
..goog-toolbar-button-hover .goog-toolbar-button-outer-box ,.goog-toolbar-bu=
tton-hover .goog-toolbar-button-inner-box {border-color: rgb(161, 186, 223)=
!important;}
..goog-toolbar-button-active ,.goog-toolbar-button-checked ,.goog-toolbar-bu=
tton-selected {background-color: rgb(221, 225, 235) !important;}
..goog-toolbar-button-active .goog-toolbar-button-outer-box ,.goog-toolbar-b=
utton-active .goog-toolbar-button-inner-box ,.goog-toolbar-button-checked .=
goog-toolbar-button-outer-box ,.goog-toolbar-button-checked .goog-toolbar-b=
utton-inner-box ,.goog-toolbar-button-selected .goog-toolbar-button-outer-b=
ox ,.goog-toolbar-button-selected .goog-toolbar-button-inner-box {border-co=
lor: rgb(114, 155, 209);}
..goog-toolbar-button-collapse-right ,.goog-toolbar-button-collapse-right .g=
oog-toolbar-button-outer-box ,.goog-toolbar-button-collapse-right .goog-too=
lbar-button-inner-box {margin-right: 0px;}
..goog-toolbar-button-collapse-left ,.goog-toolbar-button-collapse-left .goo=
g-toolbar-button-outer-box ,.goog-toolbar-button-collapse-left .goog-toolba=
r-button-inner-box {margin-left: 0px;}
* html .goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box ,b=
ody .goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box {left=
: 0px;}
:first-child + html .goog-toolbar-button-collapse-left .goog-toolbar-button=
-inner-box {left: 0px;}
..goog-toolbar-menu-button {margin: 0px 2px; border: 0px none; padding: 0px;=
font-family: Arial,sans-serif; color: rgb(51, 51, 51); text-decoration: no=
ne; list-style: outside none none; vertical-align: middle; cursor: default;=
outline: medium none;}
..goog-toolbar-menu-button-outer-box ,.goog-toolbar-menu-button-inner-box {b=
order: 0px none; vertical-align: top;}
..goog-toolbar-menu-button-outer-box {margin: 0px; padding: 1px 0px;}
..goog-toolbar-menu-button-inner-box {margin: 0px -1px; padding: 3px 4px;}
* html .goog-toolbar-menu-button-inner-box ,body .goog-toolbar-menu-button-=
inner-box {left: -1px;}
* html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-outer-box ,b=
ody .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-outer-box {left=
: -1px;}
* html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-inner-box ,b=
ody .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-inner-box {righ=
t: auto;}
:first-child + html .goog-toolbar-menu-button-inner-box {left: -1px;}
:first-child + html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button=
-inner-box {left: 1px; right: auto;}
..goog-toolbar-menu-button-disabled {opacity: 0.3;}
..goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-outer-box ,.go=
og-toolbar-menu-button-disabled .goog-toolbar-menu-button-inner-box {color:=
rgb(51, 51, 51) !important; border-color: rgb(153, 153, 153) !important;}
* html .goog-toolbar-menu-button-disabled ,body .goog-toolbar-menu-button-d=
isabled {background-color: rgb(240, 240, 240); margin: 0px 1px; padding: 0p=
x 1px;}
:first-child + html .goog-toolbar-menu-button-disabled {background-color: r=
gb(240, 240, 240); margin: 0px 1px; padding: 0px 1px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-outer-box ,.goog-=
toolbar-menu-button-active .goog-toolbar-menu-button-outer-box ,.goog-toolb=
ar-menu-button-open .goog-toolbar-menu-button-outer-box {border-width: 1px =
0px; border-style: solid; padding: 0px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-inner-box ,.goog-=
toolbar-menu-button-active .goog-toolbar-menu-button-inner-box ,.goog-toolb=
ar-menu-button-open .goog-toolbar-menu-button-inner-box {border-width: 0px =
1px; border-style: solid; padding: 3px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-outer-box ,.goog-=
toolbar-menu-button-hover .goog-toolbar-menu-button-inner-box {border-color=
: rgb(161, 186, 223) !important;}
..goog-toolbar-menu-button-active ,.goog-toolbar-menu-button-open {backgroun=
d-color: rgb(221, 225, 235) !important;}
..goog-toolbar-menu-button-active .goog-toolbar-menu-button-outer-box ,.goog=
-toolbar-menu-button-active .goog-toolbar-menu-button-inner-box ,.goog-tool=
bar-menu-button-open .goog-toolbar-menu-button-outer-box ,.goog-toolbar-men=
u-button-open .goog-toolbar-menu-button-inner-box {border-color: rgb(114, 1=
55, 209);}
..goog-toolbar-menu-button-caption {padding: 0px 4px 0px 0px; vertical-align=
: middle;}
..goog-toolbar-menu-button-dropdown {width: 7px; background: rgba(0, 0, 0, 0=
) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll -388px=
0px; vertical-align: middle;}
..goog-toolbar-separator {margin: 0px 2px; border-left: 1px solid rgb(214, 2=
14, 214); border-right: 1px solid rgb(247, 247, 247); padding: 0px; width: =
0px; text-decoration: none; list-style: outside none none; outline: medium =
none; vertical-align: middle; line-height: normal; font-size: 120%; overflo=
w: hidden;}
..goog-toolbar-select .goog-toolbar-menu-button-outer-box {border-width: 1px=
0px; border-style: solid; padding: 0px;}
..goog-toolbar-select .goog-toolbar-menu-button-inner-box {border-width: 0px=
1px; border-style: solid; padding: 3px;}
..goog-toolbar-select .goog-toolbar-menu-button-outer-box ,.goog-toolbar-sel=
ect .goog-toolbar-menu-button-inner-box {border-color: rgb(191, 203, 223);}
..tr-icon {width: 16px; height: 16px; background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/editor/editortoolbar.png") no-repeat scroll 0% 0%; vertical-a=
lign: middle;}
..goog-color-menu-button-indicator .tr-icon {height: 14px;}
..tr-undo ,.goog-toolbar-button-rtl .tr-redo {background-position: 0px cente=
r;}
..tr-redo ,.goog-toolbar-button-rtl .tr-undo {background-position: -16px cen=
ter;}
..tr-fontName .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102); wi=
dth: 16ex; height: 16px; overflow: hidden;}
..tr-fontSize .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102); wi=
dth: 8ex; height: 16px; overflow: hidden;}
..tr-bold {background-position: -32px center;}
..tr-italic {background-position: -48px center;}
..tr-underline {background-position: -64px center;}
..tr-foreColor {height: 14px; background-position: -80px center;}
..tr-backColor {height: 14px; background-position: -96px center;}
..tr-link {font-weight: bold; color: rgb(0, 0, 153); text-decoration: underl=
ine;}
..tr-image {background-position: -112px center;}
..tr-newDrawing {background-position: -592px center;}
..tr-spChar {font-weight: bold; color: rgb(153, 0, 0);}
..tr-indent {background-position: -128px center;}
..tr-rtl-mode .tr-indent {background-position: -400px center;}
..tr-outdent {background-position: -144px center;}
..tr-rtl-mode .tr-outdent {background-position: -416px center;}
..tr-insertUnorderedList {background-position: -160px center;}
..tr-rtl-mode .tr-insertUnorderedList {background-position: -432px center;}
..tr-insertOrderedList {background-position: -176px center;}
..tr-rtl-mode .tr-insertOrderedList {background-position: -448px center;}
..tr-justifyLeft {background-position: -192px center;}
..tr-justifyCenter {background-position: -208px center;}
..tr-justifyRight {background-position: -224px center;}
..tr-justifyFull {background-position: -480px center;}
..tr-BLOCKQUOTE {background-position: -240px center;}
..tr-rtl-mode .tr-BLOCKQUOTE {background-position: -464px center;}
..tr-removeFormat {background-position: -256px center;}
..tr-spell {background-position: -272px center;}
..tr-ltr {background-position: -288px center;}
..tr-rtl {background-position: -304px center;}
..tr-insertModule {background-position: -496px center;}
..tr-strikeThrough {background-position: -544px center;}
..tr-subscript {background-position: -560px center;}
..tr-superscript {background-position: -576px center;}
..tr-equation {background-position: -608px center;}
..tr-editHtml {color: rgb(0, 0, 153);}
..tr-formatBlock .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102);=
width: 12ex; height: 16px; overflow: hidden;}
..goog-menu .goog-palette {outline: medium none; cursor: default;}
..goog-menu .goog-palette-table {margin: 5px; border: 1px solid rgb(102, 102=
, 102); border-collapse: collapse;}
..goog-menu .goog-palette-cell {height: 18px; width: 18px; margin: 0px; bord=
er-width: 0px 1px 0px 0px; border-style: none solid none none; border-color=
: currentcolor rgb(102, 102, 102) currentcolor currentcolor; -moz-border-to=
p-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: =
none; -moz-border-left-colors: none; border-image: none; text-align: center=
; vertical-align: middle; cursor: pointer;}
..goog-menu .goog-palette-cell .goog-palette-colorswatch {position: relative=
; height: 18px; width: 18px; border: medium none; font-size: x-small;}
..goog-menu .goog-palette-cell-hover .goog-palette-colorswatch {height: 16px=
; width: 16px; border: 1px solid rgb(255, 255, 255);}
..goog-menu .goog-palette-cell-selected .goog-palette-colorswatch {height: 1=
6px; width: 16px; border: 1px solid rgb(51, 51, 51); color: rgb(255, 255, 2=
55); font-weight: bold; background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/editortoolbar.png") no-repeat scroll -368px center;}
..goog-menu .goog-palette-customcolor {position: relative; height: 15px; wid=
th: 15px; font-size: x-small; background-color: rgb(250, 250, 250); color: =
rgb(102, 102, 102); border: 1px solid rgb(238, 238, 238);}
..goog-menu .goog-palette-cell-hover .goog-palette-customcolor {background-c=
olor: rgb(255, 238, 238); border: 1px solid rgb(255, 102, 102); color: rgb(=
255, 102, 102);}
..tr_toolbar {font-family: arial; font-size: 90%;}
..container ,.containerhover ,.containeron {float: left; margin: 2px 3px 2px=
0px !important; padding: 0px !important; color: rgb(0, 0, 0); cursor: defa=
ult;}
..desc {margin: 0px !important; line-height: 0.2em !important; background: r=
gba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif") no-repeat=
scroll left top;}
..link {margin: 0px !important; padding: 4px 0px 0px 9px !important; backgro=
und: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif") no-=
repeat scroll left bottom;}
..link em {display: block !important; padding: 0px 8px 6px 0px !important; f=
ont-style: normal; line-height: 1em !important; text-decoration: none; text=
-align: center !important; background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbright_ltr.gif") no-repeat scroll right bottom;}
div.leftpill ,div.leftpillhover ,div.leftpillon {margin-right: 0px !importa=
nt;}
div.leftpill p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edit=
or/bg/cbpillbg.gif") no-repeat scroll right bottom;}
div.middlepill ,div.middlepillhover ,div.middlepillon {margin-right: 0px !i=
mportant;}
div.middlepill {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
bg/cbpillbg.gif") no-repeat scroll right top;}
div.middlepill p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbleftpill_ltr.gif") no-repeat scroll left top;}
div.middlepill p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbleftpill_ltr.gif") no-repeat scroll left bottom;}
div.middlepill p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg.gif") no-repeat scroll right bottom;}
div.rightpill p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/e=
ditor/bg/cbleftpill_ltr.gif") no-repeat scroll left top;}
div.rightpill p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/e=
ditor/bg/cbleftpill_ltr.gif") no-repeat scroll left bottom;}
..container {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/c=
bright_ltr.gif") no-repeat scroll right top;}
..leftpill {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cb=
pillbg.gif") no-repeat scroll right top;}
..containerhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor=
/bg/cbright_h_ltr.gif") no-repeat scroll right top;}
..containerhover .p1 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbleft_h_ltr.gif") no-repeat scroll left top;}
..containerhover .p2 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbleft_h_ltr.gif") no-repeat scroll left bottom;}
..containerhover .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbright_h_ltr.gif") no-repeat scroll right bottom;}
div.middlepillhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg_h.gif") no-repeat scroll right top;}
div.middlepillhover p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left top;}
div.middlepillhover p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left bottom;}
div.middlepillhover p.p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstati=
c.com/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.leftpillhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edit=
or/bg/cbpillbg_h.gif") no-repeat scroll right top;}
div.leftpillhover p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.leftpillhover .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.rightpillhover p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left top;}
div.rightpillhover p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left bottom;}
..containeron {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg=
/cbright_o_ltr.gif") no-repeat scroll right top;}
..containeron .p1 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbleft_o_ltr.gif") no-repeat scroll left top;}
..containeron .p2 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbleft_o_ltr.gif") no-repeat scroll left bottom;}
..containeron .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbright_o_ltr.gif") no-repeat scroll right bottom;}
div.middlepillon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbpillbg_o.gif") no-repeat scroll right top;}
div.middlepillon p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left top;}
div.middlepillon p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left bottom;}
div.middlepillon p.p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/editor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.leftpillon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
bg/cbpillbg_o.gif") no-repeat scroll right top;}
div.leftpillon p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.leftpillon .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.rightpillon p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left top;}
div.rightpillon p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left bottom;}
..container span ,.containerhover span ,.containeron span {background-positi=
on: 0% 50%; padding: 2px 0px 2px 20px !important; margin: -2px 0px !importa=
nt; width: 1px !important; white-space: nowrap !important;}
..container .icon_none ,.containerhover .icon_none ,.containeron .icon_none =
{padding: 2px 0px 2px 2px !important;}
..icon {width: 1.5em !important; font-family: times; line-height: 1.2em !imp=
ortant; font-weight: bold;}
..container .imageOnly ,.containerhover .imageOnly ,.containeron .imageOnly =
{margin-right: -1ex !important; white-space: normal !important; direction: =
ltr;}
..container span.justify ,.containerhover span.justify ,.containeron span.ju=
stify {padding: 0px 0px 0px 12px !important;}
..icon_image {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ico=
ns/icon_image.gif") no-repeat scroll 0% 0%;}
..icon_link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_link.gif") no-repeat scroll 0% 0%;}
..icon_bullet {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_bullet.gif") no-repeat scroll 0% 0%;}
..icon_numbered {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
icons/icon_numbered.gif") no-repeat scroll 0% 0%;}
..icon_outdent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/i=
cons/icon_outdent.gif") no-repeat scroll 0% 0%;}
..icon_indent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_indent.gif") no-repeat scroll 0% 0%;}
..icon_text {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_text.gif") no-repeat scroll 0% 0%;}
..icon_textbg {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_textbg.gif") no-repeat scroll 0% 0%;}
..icon_font {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_font.gif") no-repeat scroll 0% 0%;}
..icon_size {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_size.gif") no-repeat scroll 0% 0%;}
..icon_justleft {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
icons/icon_left.gif") no-repeat scroll 0% 0%;}
..icon_justmiddle {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/icons/icon_middle.gif") no-repeat scroll 0% 0%;}
..icon_justright {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor=
/icons/icon_right.gif") no-repeat scroll 0% 0%;}
..icon_wfield {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_wfield.gif") no-repeat scroll 0% 0%;}
..icon_removeformat {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edi=
tor/icons/icon_removeformatting.gif") no-repeat scroll 0% 0%;}
..icon_blockquote {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/icons/icon_blockquote.gif") no-repeat scroll 0% 0%;}
..icon_gadget {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_gadget.gif") no-repeat scroll 0% 0%;}
..icon_ltr {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icons=
/icon_ltr_dir.gif") no-repeat scroll 0% 0%;}
..icon_rtl {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icons=
/icon_rtl_dir.gif") no-repeat scroll 0% 0%;}
..toolbar_rtl .icon_bullet {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/icons/icon_bullet_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_numbered {background: rgba(0, 0, 0, 0) url("//ssl.gstati=
c.com/editor/icons/icon_numbered_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_outdent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/icons/icon_outdent_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_indent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/icons/icon_indent_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_blockquote {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/editor/icons/icon_blockquote_rtl.gif") no-repeat scroll left center=
;}
..link em b {padding-left: 0.2em !important; background: rgba(0, 0, 0, 0) ur=
l("//ssl.gstatic.com/editor/bg/downarrow.gif") no-repeat scroll 80% 50%;}
..disabled {opacity: 0.5; cursor: default;}
#tr_preloadImages {width: 0px; height: 0px; display: inline;}
..cbleft {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif"=
);}
..cbleft_h {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_h_ltr.=
gif");}
..cbleft_o {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_o_ltr.=
gif");}
..cbleftpill {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpill_=
ltr.gif");}
..cbleftpill_h {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpil=
l_h_ltr.gif");}
..cbleftpill_o {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpil=
l_o_ltr.gif");}
..cbpillbggif {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg.g=
if");}
..cbpillbgpng {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg.p=
ng");}
..cbpillbg_h {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg_h.=
gif");}
..cbright {background-image: url("//ssl.gstatic.com/editor/bg/cbright_ltr.gi=
f");}
..cbright_h {background-image: url("//ssl.gstatic.com/editor/bg/cbright_h_lt=
r.gif");}
..cbright_o {background-image: url("//ssl.gstatic.com/editor/bg/cbright_o_lt=
r.gif");}
..downarrow {background-image: url("//ssl.gstatic.com/editor/bg/downarrow.gi=
f");}
..cbpillbg_o {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg_o.=
gif");}
..tr_popupmenu {position: absolute; z-index: 1000;}
..tr_popupmenu .goog-menu {-moz-user-select: none; background-attachment: sc=
roll; background-color: rgb(195, 217, 255); background-image: none; backgro=
und-repeat: repeat; border-width: 2px; border-style: solid; border-color: r=
gb(232, 241, 255) rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);=
cursor: pointer; padding: 2px;}
..tr_popupmenu .goog-menuitem {background-attachment: scroll; background-col=
or: rgb(195, 217, 255); background-image: none; background-repeat: repeat; =
color: rgb(0, 0, 0);}
..tr_popupmenu .goog-menuitem-highlight {background-color: rgb(85, 112, 204)=
; color: rgb(255, 255, 255);}
..tr_colorpicker {position: absolute; z-index: 1000; background-color: rgb(1=
87, 187, 187);}
..tr_colorpicker .goog-palette {outline: medium none; -moz-user-select: none=
; cursor: default;}
..tr_colorpicker .goog-palette-table {border: 1px solid rgb(102, 102, 102); =
border-collapse: collapse !important; padding: 0px; margin: 0px;}
..tr_colorpicker .goog-palette-cell {height: 13px; width: 15px; margin: 0px;=
border: 0px none; padding: 0px; text-align: center; vertical-align: middle=
;}
..tr_colorpicker .goog-palette-colorswatch {position: relative; height: 13px=
; width: 15px; border: 1px solid rgb(102, 102, 102); font-size: 1px;}
..tr_colorpicker .goog-palette-cell-hover .goog-palette-colorswatch {border:=
1px solid rgb(255, 255, 255);}
..tr_colorpicker .goog-palette-cell-selected .goog-palette-colorswatch {bord=
er: 1px solid rgb(0, 0, 0); color: rgb(255, 255, 255);}
..ac-renderer {border: 1px solid rgb(102, 102, 102); background: rgb(224, 23=
6, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 204); margin: 0px; paddi=
ng: 0px 0px 1px; z-index: 10; position: absolute;}
..ac-renderer div {margin: 2px; cursor: pointer; padding: 0px 10px;}
..ac-renderer div b {color: rgb(0, 0, 255);}
..ac-renderer div.active {background: rgb(195, 217, 255) none repeat scroll =
0% 0%;}
..picker-dialog {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); position: absolute; box-shadow: 0px 4px=
16px rgba(0, 0, 0, 0.2); z-index: 1021; outline: medium none; padding: 0px=
;}
..picker.modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative; border: 0px none;}
..picker.modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 1001;}
..picker.modal-dialog-title ,.picker.modal-dialog-buttons {display: none;}
..picker-frame {width: 100%; height: 100%; border: 0px none; overflow: hidde=
n;}
..goog-toolbar {padding: 6px; border-top: 1px solid rgb(229, 229, 229); bord=
er-bottom: 1px solid rgb(235, 235, 235); background: rgb(245, 245, 245) non=
e repeat scroll 0% 0%;}
..goog-toolbar-button ,.goog-toolbar-menu-button {display: inline-block; tex=
t-align: center; color: rgb(85, 85, 85); font-size: 11px; font-weight: bold=
; height: 27px; padding: 0px 8px; line-height: 27px; transition: all 0.218s=
ease 0s; background-color: rgb(245, 245, 245); background-image: -moz-line=
ar-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241)); -moz-user=
-select: none; cursor: default; border: 1px solid transparent;}
..goog-toolbar-button-hover ,.goog-toolbar-menu-button-hover {border: 1px so=
lid rgb(198, 198, 198); color: rgb(51, 51, 51); transition: all 0s ease 0s;=
background-color: rgb(248, 248, 248); background-image: -moz-linear-gradie=
nt(center top , rgb(248, 248, 248), rgb(241, 241, 241)); box-shadow: 0px 1p=
x 1px rgba(0, 0, 0, 0.1);}
..goog-toolbar-button-active ,.goog-toolbar-menu-button-active {background-c=
olor: rgb(246, 246, 246); background-image: -moz-linear-gradient(center top=
, rgb(246, 246, 246), rgb(241, 241, 241)); box-shadow: 0px 1px 2px rgba(0,=
0, 0, 0.1) inset;}
..goog-toolbar-button-checked ,.goog-toolbar-menu-button-checked {background=
-color: rgb(238, 238, 238); background-image: -moz-linear-gradient(center t=
op , rgb(238, 238, 238), rgb(224, 224, 224)); box-shadow: 0px 1px 2px rgba(=
0, 0, 0, 0.1) inset; border: 1px solid rgb(204, 204, 204); color: rgb(51, 5=
1, 51);}
..goog-toolbar-button-inner-box ,.goog-toolbar-button-outer-box ,.goog-toolb=
ar-menu-button-inner-box ,.goog-toolbar-menu-button-outer-box {border: medi=
um none !important; padding: 0px !important; margin: 0px !important;}
..goog-toolbar-menu-button-inner-box {padding-top: 1px !important;}
..goog-toolbar-menu-button-caption {padding-bottom: 4px; height: auto !impor=
tant; color: rgb(85, 85, 85) !important;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-caption {color: r=
gb(51, 51, 51) !important;}
..goog-toolbar-menu-button-dropdown {position: relative; top: 3px;}
..goog-color-menu-button-indicator {line-height: 0;}
..tr-icon {display: inline-block;}
..tr-dialog {position: absolute; width: 475px; background: rgb(255, 255, 255=
) none repeat scroll 0% 0%; padding: 38px 42px 30px;}
..tr-dialog button {color: rgb(102, 102, 102); font-size: 11px; font-weight:=
bold; text-align: center; margin-right: 16px; white-space: nowrap; height:=
29px; line-height: 27px; min-width: 74px; outline: 0px none; padding: 0px =
8px; border-radius: 2px; cursor: pointer; transition: all 0.218s ease 0s; d=
isplay: inline-block; border: 1px solid rgba(0, 0, 0, 0.1); background-colo=
r: rgb(245, 245, 245); background-image: -moz-linear-gradient(center top , =
rgb(245, 245, 245), rgb(241, 241, 241));}
..tr-dialog button:hover {transition: all 0.218s ease 0s; box-shadow: 0px 1p=
x 1px rgba(0, 0, 0, 0.1); border: 1px solid rgb(198, 198, 198); color: rgb(=
51, 51, 51); background-color: rgb(248, 248, 248); background-image: -moz-l=
inear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));}
..tr-dialog button.goog-buttonset-default {border: 1px solid rgb(48, 121, 23=
7); color: rgb(255, 255, 255); background-color: rgb(77, 144, 254); backgro=
und-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(71, 135=
, 237));}
..tr-dialog button.goog-buttonset-default:hover {color: rgb(255, 255, 255); =
border: 1px solid rgb(47, 91, 183); background-color: rgb(53, 122, 232); ba=
ckground-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(53=
, 122, 232));}
..tr-link-dialog-target-input ,#linkdialog-text {border-width: 1px; border-s=
tyle: solid; border-color: rgb(192, 192, 192) rgb(217, 217, 217) rgb(217, 2=
17, 217); -moz-border-top-colors: none; -moz-border-right-colors: none; -mo=
z-border-bottom-colors: none; -moz-border-left-colors: none; border-image: =
none; vertical-align: top; box-sizing: border-box; border-radius: 1px; disp=
lay: inline-block; background-color: rgb(255, 255, 255); line-height: 27px;=
padding-left: 8px; color: rgb(51, 51, 51); height: 29px;}
..tr-link-dialog-target-input:hover ,#linkdialog-text:hover {border-width: 1=
px; border-style: solid; border-color: rgb(160, 160, 160) rgb(185, 185, 185=
) rgb(185, 185, 185); -moz-border-top-colors: none; -moz-border-right-color=
s: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; bo=
rder-image: none; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..tr-link-dialog-target-input:focus ,#linkdialog-text:focus {box-shadow: 0px=
1px 2px rgba(0, 0, 0, 0.3) inset; outline: medium none; border: 1px solid =
rgb(77, 144, 254);}
..tr-dialog .modal-dialog-title {display: none;}
#linkdialog-text {position: relative; top: -7px; margin-bottom: 12px;}
..tr-tabpane-caption {margin-bottom: 4px;}
..tr-tabpane .goog-tab-bar {background: rgba(0, 0, 0, 0) none repeat scroll =
0% 0%; margin-right: 12px; height: 160px;}
..tr-tabpane .goog-tab {border: medium none; background: rgb(255, 255, 255) =
none repeat scroll 0% 0%; padding: 8px; left: 0px; margin-left: 0px;}
..tr-tabpane .goog-tab-selected {border: medium none; background: rgb(255, 2=
55, 255) none repeat scroll 0% 0%; padding: 8px; left: 0px;}
..tr-tabpane .goog-tab-hover {background: rgb(238, 238, 238) none repeat scr=
oll 0% 0%;}
..tr-tabpane .goog-tab input {margin-left: 0px;}
..tr-dialog .modal-dialog-buttons {margin-top: 24px;}
..tr-dialog .goog-link-button {text-decoration: none; color: rgb(17, 85, 204=
); cursor: pointer; margin-top: 0px !important; margin-bottom: 8px;}
..tr-link-dialog-target-input {display: block; margin: 8px 0px; width: 280px=
!important;}
..tr-link-dialog-explanation-text {line-height: 17px;}
..tr-fontSize .goog-toolbar-menu-button-caption {min-width: 8ex; width: auto=
; overflow: auto; white-space: nowrap;}
plaintext {display: none;}
html {color:rgb(34, 34, 34);visibility:visible;quotes:"=E2=80=9C" "=E2=80=
=9D" "=E2=80=98" "=E2=80=99";list-style-type:disc;list-style-image:none;lis=
t-style-position:outside;page-break-inside:auto;font-family:"Arial","Helvet=
ica",sans-serif;font-style:normal;font-variant:normal;font-weight:400;text-=
indent:0px;text-align:start;text-transform:none;white-space:normal;caption-=
side:top;border-collapse:separate;border-spacing:0px 0px;empty-cells:show;c=
ursor:auto;}
body {position:relative !important;top:0 !important;left:0 !important;right=
:auto !important;display:block !important;visibility:visible !important;fon=
t-family:"Arial","Helvetica",sans-serif !important;font-size:13px !importan=
t;font-weight:400 !important;font-variant:normal !important;font-style:norm=
al !important;color:rgb(34, 34, 34) !important;text-align:start !important;=
text-decoration:none !important;text-indent:0px !important;text-transform:n=
one !important;letter-spacing:normal !important;white-space:normal !importa=
nt;word-spacing:0px !important;}
img {-moz-force-broken-image-icon: 1;}</style><br>Well, in that case it=
9;s not enough. We need the ability to relocate to a destination range that=
is only partially uninitialized, and backwards too. (Consider vector erase=
and insert.) So I would continue to rely on UB regardless.<br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/fa156786-4288-47cf-bbe2-38bac6685dd6%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/fa156786-4288-47cf-bbe2-38bac6685dd6=
%40isocpp.org</a>.<br />
------=_Part_108_2072477158.1542321223904--
------=_Part_107_1723935215.1542321223855--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Thu, 15 Nov 2018 17:43:48 -0500
Raw View
--000000000000109449057abbc9ca
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Thu, Nov 15, 2018 at 5:33 PM <oleerikp@gmail.com> wrote:
> On Thursday, November 15, 2018 at 4:51:11 PM UTC+1, Matthew Woehlke wrote=
:
>>
>> On 14/11/2018 18.17, olee...@gmail.com wrote:
>> > - The suggested semantics seem questionable in the face of a possible
>> > exception in the middle of the loop. But rather than arguing about the
>> > specification, I think it should be dropped from the paper. The expert=
s
>> who
>> > would use this could easily roll their own anyway.
>>
>> I don't think that's true. As I understand it, this function is, in some
>> sense, the sole reason the proposal has value. Specifically, it is
>> specially blessed as being able to actually perform a memcpy but still
>> DTRT WRT the memory model.
>>
>
The intent of P1144R0 is that `memcpy` itself would be the "specially
blessed" library function: it's defined to Do The Right Thing for trivially
relocatable types (by magic; but not really any *more* magic than it
already possesses for trivial types). P1144's `uninitialized_relocate` is a
convenient high-level entry point for when you don't know if it's safe to
memcpy or not and you just want the library to dispatch to the appropriate
low-level function (memcpy, or loop over ctor/dtor).
Without it, "the experts who would use this" must continue to rely on
>> UB, which defeats one of the main objectives of the proposal. (Am I
>> missing something? If so, please correct me!) [...]
>>
>
> Well, in that case it's not enough. We need the ability to relocate to a
> destination range that is only partially uninitialized, and backwards too=
..
> (Consider vector erase and insert.) So I would continue to rely on UB
> regardless.
>
The intent of P1144R0 is that you would be able to use `memcpy` without UB.
It's a bit handwavey... but then so is almost everything related to UB.
(For example: if it's okay to `memcpy` a trivially relocatable type, is it
also okay to type-pun it to an array of char and then copy the chars in a
loop? I'd think "yes", but I wouldn't care if the answer were "no". Even if
we go so far as to say that it's UB even to memcpy trivially relocatable
types, it would still be super useful to have the type-trait that
accurately reports whether memcpy would, physically, accomplish our codegen
goal, even if it is *technically* still UB. :))
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0%2By8tkQPiW_8h5_Krn1Emj3UAY73vw682Ps8KN-i=
kHZZg%40mail.gmail.com.
--000000000000109449057abbc9ca
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thu, Nov 15, 2018 at 5:33 PM <<a href=3D"mailto:olee=
rikp@gmail.com">oleerikp@gmail.com</a>> wrote:<br><div class=3D"gmail_qu=
ote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Thursday, November =
15, 2018 at 4:51:11 PM UTC+1, Matthew Woehlke wrote:<blockquote class=3D"gm=
ail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;p=
adding-left:1ex">On 14/11/2018 18.17, <a rel=3D"nofollow">olee...@gmail.com=
</a> wrote:
<br>> =C2=A0- The suggested semantics seem questionable in the face of a=
possible=20
<br>> exception in the middle of the loop. But rather than arguing about=
the=20
<br>> specification, I think it should be dropped from the paper. The ex=
perts who=20
<br>> would use this could easily roll their own anyway.
<br>
<br>I don't think that's true. As I understand it, this function is=
, in some
<br>sense, the sole reason the proposal has value. Specifically, it is
<br>specially blessed as being able to actually perform a memcpy but still
<br>DTRT WRT the memory model.<br></blockquote></div></blockquote><div><br>=
</div><div>The intent of P1144R0 is that `memcpy` itself would be the "=
;specially blessed" library function: it's defined to Do The Right=
Thing for trivially relocatable types (by magic; but not really any <i>mor=
e</i> magic than it already possesses for trivial types). P1144's `unin=
itialized_relocate` is a convenient high-level entry point for when you don=
't know if it's safe to memcpy or not and you just want the library=
to dispatch to the appropriate low-level function (memcpy, or loop over ct=
or/dtor).</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex">Without it, "the experts wh=
o would use this" must continue to rely on
<br>UB, which defeats one of the main objectives of the proposal. (Am I
<br>missing something? If so, please correct me!) [...]<br></blockquote><br=
>Well, in that case it's not enough. We need the ability to relocate to=
a destination range that is only partially uninitialized, and backwards to=
o. (Consider vector erase and insert.) So I would continue to rely on UB re=
gardless.</div></blockquote><div><br></div><div>The intent of P1144R0 is th=
at you would be able to use `memcpy` without UB. It's a bit handwavey..=
.. but then so is almost everything related to UB. (For example: if it's=
okay to `memcpy` a trivially relocatable type, is it also okay to type-pun=
it to an array of char and then copy the chars in a loop? I'd think &q=
uot;yes", but I wouldn't care if the answer were "no". E=
ven if we go so far as to say that it's UB even to memcpy trivially rel=
ocatable types, it would still be super useful to have the type-trait that =
accurately reports whether memcpy would, physically, accomplish our codegen=
goal, even if it is <i>technically</i> still UB. :))</div><div><br></div><=
div>=E2=80=93Arthur</div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2By8tkQPiW_8h5_Krn1Emj3UAY73v=
w682Ps8KN-ikHZZg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2By8tkQ=
PiW_8h5_Krn1Emj3UAY73vw682Ps8KN-ikHZZg%40mail.gmail.com</a>.<br />
--000000000000109449057abbc9ca--
.
Author: Itaj Sherman <itajsherman@gmail.com>
Date: Fri, 16 Nov 2018 07:43:36 -0800 (PST)
Raw View
------=_Part_1065_1008103380.1542383016155
Content-Type: multipart/alternative;
boundary="----=_Part_1066_277495888.1542383016155"
------=_Part_1066_277495888.1542383016155
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Friday, 16 November 2018 00:43:56 UTC+2, Arthur O'Dwyer wrote:
>
> On Thu, Nov 15, 2018 at 5:33 PM <olee...@gmail.com <javascript:>> wrote:
>
>> On Thursday, November 15, 2018 at 4:51:11 PM UTC+1, Matthew Woehlke wrot=
e:
>>>
>>> On 14/11/2018 18.17, olee...@gmail.com wrote:=20
>>> > - The suggested semantics seem questionable in the face of a possibl=
e=20
>>> > exception in the middle of the loop. But rather than arguing about th=
e=20
>>> > specification, I think it should be dropped from the paper. The=20
>>> experts who=20
>>> > would use this could easily roll their own anyway.=20
>>>
>>> I don't think that's true. As I understand it, this function is, in som=
e=20
>>> sense, the sole reason the proposal has value. Specifically, it is=20
>>> specially blessed as being able to actually perform a memcpy but still=
=20
>>> DTRT WRT the memory model.
>>>
>>
> The intent of P1144R0 is that `memcpy` itself would be the "specially=20
> blessed" library function: it's defined to Do The Right Thing for trivial=
ly=20
> relocatable types (by magic; but not really any *more* magic than it=20
> already possesses for trivial types). P1144's `uninitialized_relocate` is=
a=20
> convenient high-level entry point for when you don't know if it's safe to=
=20
> memcpy or not and you just want the library to dispatch to the appropriat=
e=20
> low-level function (memcpy, or loop over ctor/dtor).
>
> Without it, "the experts who would use this" must continue to rely on=20
>>> UB, which defeats one of the main objectives of the proposal. (Am I=20
>>> missing something? If so, please correct me!) [...]
>>>
>>
>> Well, in that case it's not enough. We need the ability to relocate to a=
=20
>> destination range that is only partially uninitialized, and backwards to=
o.=20
>> (Consider vector erase and insert.) So I would continue to rely on UB=20
>> regardless.
>>
>
> The intent of P1144R0 is that you would be able to use `memcpy` without=
=20
> UB. It's a bit handwavey... but then so is almost everything related to U=
B.=20
> (For example: if it's okay to `memcpy` a trivially relocatable type, is i=
t=20
> also okay to type-pun it to an array of char and then copy the chars in a=
=20
> loop? I'd think "yes", but I wouldn't care if the answer were "no". Even =
if=20
> we go so far as to say that it's UB even to memcpy trivially relocatable=
=20
> types, it would still be super useful to have the type-trait that=20
> accurately reports whether memcpy would, physically, accomplish our codeg=
en=20
> goal, even if it is *technically* still UB. :))
>
>
You should have some function in the standard that says it can do the copy,=
=20
whether memcpy or another, at the least 'implementation defined'.
Otherwise this would be terrible for people (like me) who are not extremely=
=20
versed in the standard but do need to be able to read it.
If I didn't read this conversation, and eventually I read in the standard=
=20
about relocation, but there's no function that can actually do the copy, I=
=20
would just misunderstand it, possibly go look for information, and most=20
possibly not get the right answer.
=20
> =E2=80=93Arthur
>
itaj
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/0d5f657e-ae01-45fe-aaf2-4a41729e9eec%40isocpp.or=
g.
------=_Part_1066_277495888.1542383016155
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Friday, 16 November 2018 00:43:56 UTC+2, Arthur=
O'Dwyer wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr">On Thu, Nov 15, 2018 at 5:33 PM <<a href=3D"javascript:" target=
=3D"_blank" gdf-obfuscated-mailto=3D"7PR08tT1AAAJ" rel=3D"nofollow" onmouse=
down=3D"this.href=3D'javascript:';return true;" onclick=3D"this.hre=
f=3D'javascript:';return true;">olee...@gmail.com</a>> wrote:<br=
><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"marg=
in:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"=
>On Thursday, November 15, 2018 at 4:51:11 PM UTC+1, Matthew Woehlke wrote:=
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;borde=
r-left:1px #ccc solid;padding-left:1ex">On 14/11/2018 18.17, <a rel=3D"nofo=
llow">olee...@gmail.com</a> wrote:
<br>> =C2=A0- The suggested semantics seem questionable in the face of a=
possible=20
<br>> exception in the middle of the loop. But rather than arguing about=
the=20
<br>> specification, I think it should be dropped from the paper. The ex=
perts who=20
<br>> would use this could easily roll their own anyway.
<br>
<br>I don't think that's true. As I understand it, this function is=
, in some
<br>sense, the sole reason the proposal has value. Specifically, it is
<br>specially blessed as being able to actually perform a memcpy but still
<br>DTRT WRT the memory model.<br></blockquote></div></blockquote><div><br>=
</div><div>The intent of P1144R0 is that `memcpy` itself would be the "=
;specially blessed" library function: it's defined to Do The Right=
Thing for trivially relocatable types (by magic; but not really any <i>mor=
e</i> magic than it already possesses for trivial types). P1144's `unin=
itialized_relocate` is a convenient high-level entry point for when you don=
't know if it's safe to memcpy or not and you just want the library=
to dispatch to the appropriate low-level function (memcpy, or loop over ct=
or/dtor).</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex">Without it, "the experts wh=
o would use this" must continue to rely on
<br>UB, which defeats one of the main objectives of the proposal. (Am I
<br>missing something? If so, please correct me!) [...]<br></blockquote><br=
>Well, in that case it's not enough. We need the ability to relocate to=
a destination range that is only partially uninitialized, and backwards to=
o. (Consider vector erase and insert.) So I would continue to rely on UB re=
gardless.</div></blockquote><div><br></div><div>The intent of P1144R0 is th=
at you would be able to use `memcpy` without UB. It's a bit handwavey..=
.. but then so is almost everything related to UB. (For example: if it's=
okay to `memcpy` a trivially relocatable type, is it also okay to type-pun=
it to an array of char and then copy the chars in a loop? I'd think &q=
uot;yes", but I wouldn't care if the answer were "no". E=
ven if we go so far as to say that it's UB even to memcpy trivially rel=
ocatable types, it would still be super useful to have the type-trait that =
accurately reports whether memcpy would, physically, accomplish our codegen=
goal, even if it is <i>technically</i> still UB. :))</div><div><br></div><=
/div></div></blockquote><div><br></div><div><div>You should have some funct=
ion in the standard that says it can do the copy, whether memcpy or another=
, at the least 'implementation defined'.<br>Otherwise this would be=
terrible for people (like me) who are not extremely versed in the standard=
but do need to be able to read it.</div><div>If I didn't read this con=
versation, and eventually I read in the standard about relocation, but ther=
e's no function that can actually do the copy, I would just misundersta=
nd it, possibly go look for information, and most possibly not get the righ=
t answer.<br></div></div><div>=C2=A0<br></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padd=
ing-left: 1ex;"><div dir=3D"ltr"><div class=3D"gmail_quote"><div>=E2=80=93A=
rthur</div></div></div></blockquote><div><br></div><div>=C2=A0itaj</div></d=
iv>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/0d5f657e-ae01-45fe-aaf2-4a41729e9eec%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/0d5f657e-ae01-45fe-aaf2-4a41729e9eec=
%40isocpp.org</a>.<br />
------=_Part_1066_277495888.1542383016155--
------=_Part_1065_1008103380.1542383016155--
.
Author: Nicolas Lesser <blitzrakete@gmail.com>
Date: Fri, 16 Nov 2018 17:06:20 +0100
Raw View
--000000000000cb1838057aca594e
Content-Type: text/plain; charset="UTF-8"
Here's my 2c/.
> EWG1. We approve of the general idea that user-defined classes should be
> able to warrant their own trivial relocatability via a standard mechanism.
>
*F*
>
> EWG2. We approve of the general idea that user-defined classes which
> follow the Rule of Zero
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html>
> should inherit the trivial relocatability of their bases and members.
>
*SF*
>
> EWG3. Nobody should be able to warrant the trivial relocatability of class
> `C` except for class `C` itself (i.e., we do not want to see a
> customization point analogous to `std::hash`).
>
*SF*
>
> EWG4. A class should be able to warrant its own trivial relocatability via
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
*N*
>
> EWG5. A class should be able to warrant its own trivial relocatability via
> some attribute, but not necessarily under that exact name.
>
*N*
>
> EWG6. A class should be able to warrant its own trivial relocatability as
> proposed in this paper, but we prefer to see a contextual keyword rather
> than an attribute.
>
*A*
>
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> added to the `<type_traits>` header, the programmer should be permitted to
> specialize it for program-defined types (i.e., we want to see that trait
> itself become a customization point analogous to `std::hash`).
>
*SA*
>
> EWG8. Trivial relocatability should be assumed by default. Classes such as
> those in Appendix C
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-trivial-samples>
> should indicate their non-trivial relocatability via an opt-in mechanism.
>
*SA*
>
> EWG9. To simplify conditionally trivial relocation
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-conditional>,
> if an attribute with the semantics of `[[trivially_relocatable]]` is added,
> it should take a boolean argument.
>
*N*
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALmDwq1gMeF2efr2q0Px%2BdRmg%2B5msrkL_e8dxrJ7T8w%3DmCRmMQ%40mail.gmail.com.
--000000000000cb1838057aca594e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_quote"><div>Here's my 2c/.</div><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>EWG1. W=
e approve of the general idea that user-defined classes should be able to w=
arrant their own trivial relocatability via a standard mechanism.<br></div>=
</div></blockquote><div><b>F</b>=C2=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">=
<div dir=3D"ltr"><div></div><div><br></div><div>EWG2. We approve of the gen=
eral idea that user-defined classes which follow the <a href=3D"https://web=
..archive.org/web/20130607234833/http://flamingdangerzone.com/cxx11/2012/08/=
15/rule-of-zero.html" target=3D"_blank">Rule of Zero</a> should inherit the=
trivial relocatability of their bases and members.</div></div></blockquote=
><div><b>SF</b>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">=
<div><br></div><div>EWG3. Nobody should be able to warrant the trivial relo=
catability of class `C` except for class `C` itself (i.e., we do not want t=
o see a customization point analogous to `std::hash`).</div></div></blockqu=
ote><div><b>SF</b>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><div><br></div><div>EWG4. A class should be able to warrant its own triv=
ial relocatability via the attribute `[[trivially_relocatable]]`, as propos=
ed in this paper.</div></div></blockquote><div><b>N</b></div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;p=
adding-left:1ex"><div dir=3D"ltr"><div><br></div><div>EWG5. A class should =
be able to warrant its own trivial relocatability via some attribute, but n=
ot necessarily under that exact name.</div></div></blockquote><div><b>N</b>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>E=
WG6. A class should be able to warrant its own trivial relocatability as pr=
oposed in this paper, but we prefer to see a contextual keyword rather than=
an attribute.</div></div></blockquote><div><b>A</b>=C2=A0</div><blockquote=
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>EWG7. If a trait w=
ith the semantics of `is_trivially_relocatable<T>` is added to the `&=
lt;type_traits>` header, the programmer should be permitted to specializ=
e it for program-defined types (i.e., we want to see that trait itself beco=
me a customization point analogous to `std::hash`).</div></div></blockquote=
><div><b>SA</b>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">=
<div><br></div><div>EWG8. Trivial relocatability should be assumed by defau=
lt. Classes such as those in <a href=3D"http://www.open-std.org/jtc1/sc22/w=
g21/docs/papers/2018/p1144r0.html#non-trivial-samples" target=3D"_blank">Ap=
pendix C</a> should indicate their non-trivial relocatability via an opt-in=
mechanism.</div></div></blockquote><div><b>SA</b>=C2=A0</div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;=
padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>EWG9. To simplify <a=
href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.ht=
ml#sample-conditional" target=3D"_blank">conditionally trivial relocation</=
a>, if an attribute with the semantics of `[[trivially_relocatable]]` is ad=
ded, it should take a boolean argument.</div></div></blockquote><div><b>N</=
b>=C2=A0</div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CALmDwq1gMeF2efr2q0Px%2BdRmg%2B5msrkL=
_e8dxrJ7T8w%3DmCRmMQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALmDwq1gMe=
F2efr2q0Px%2BdRmg%2B5msrkL_e8dxrJ7T8w%3DmCRmMQ%40mail.gmail.com</a>.<br />
--000000000000cb1838057aca594e--
.
Author: Thiago Macieira <thiago@macieira.org>
Date: Sun, 18 Nov 2018 10:24:36 -0800
Raw View
This email is just the poll answers. I'm reading the rest of the thread (as
I'm a week late) before providing comments on the paper.
On Sunday, 11 November 2018 17:35:39 PST Arthur O'Dwyer wrote:
> EWG1. We approve of the general idea that user-defined classes should be
> able to warrant their own trivial relocatability via a standard mechanism.
Strong For.
> EWG2. We approve of the general idea that user-defined classes which follow
> the Rule of Zero
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/cxx
> 11/2012/08/15/rule-of-zero.html> should inherit the trivial relocatability
> of their bases and members.
Strong For.
> EWG3. Nobody should be able to warrant the trivial relocatability of class
> `C` except for class `C` itself (i.e., we do not want to see a
> customization point analogous to `std::hash`).
Neutral. I lean towards "For", but I can see why someone may want to do this
specifically on certain translation units or for certain restricted uses, and
having no argument as to why they shouldn't, I can't give an opinion on either
way.
> EWG4. A class should be able to warrant its own trivial relocatability via
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
Strong For.
> EWG5. A class should be able to warrant its own trivial relocatability via
> some attribute, but not necessarily under that exact name.
Strong For.
> EWG6. A class should be able to warrant its own trivial relocatability as
> proposed in this paper, but we prefer to see a contextual keyword rather
> than an attribute.
Neutral.
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is
> added to the `<type_traits>` header, the programmer should be permitted to
> specialize it for program-defined types (i.e., we want to see that trait
> itself become a customization point analogous to `std::hash`).
Against, in spite of EWG3's justification. Even if outside-of-class
declaration of relocatability is permitted, I don't think it should be by
specialisation of the <type_traits> type.
> EWG8. Trivial relocatability should be assumed by default. Classes such as
> those in Appendix C
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non-tr
> ivial-samples> should indicate their non-trivial relocatability via an
> opt-in mechanism.
Strong against.
> EWG9. To simplify conditionally trivial relocation
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample
> -conditional>, if an attribute with the semantics of
> `[[trivially_relocatable]]` is added, it should take a boolean argument.
For.
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)` should
> be added to the `<memory>` header, as proposed in this paper.
No opinion (abstention).
> LEWG11. The type trait `is_relocatable<T>` should be added to the
> `<type_traits>` header, as proposed in this paper.
For. It complements, but as it's defined as just anding two existing traits,
its absence would not hinder any development.
> LEWG12. If `is_relocatable<T>` is added, then we should also add
> `is_nothrow_relocatable<T>`, as proposed in this paper.
Strong for.
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to the
> `<type_traits>` header, under that exact name, as proposed in this paper.
Strong for.
> LEWG14. We approve of a trait with the semantics of
> `is_trivially_relocatable<T>`, but possibly under a different name. (For
> example, `is_bitwise_relocatable`.)
Strong for.
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,
> then the type trait `is_trivially_swappable<T>` should also be added to the
> `<type_traits>` header.
For.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/3045735.GWPld9Axrt%40tjmaciei-mobl1.
.
Author: Thiago Macieira <thiago@macieira.org>
Date: Sun, 18 Nov 2018 11:06:14 -0800
Raw View
On Sunday, 18 November 2018 10:24:36 PST Thiago Macieira wrote:
> > EWG9. To simplify conditionally trivial relocation
> > <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#samp
> > le -conditional>, if an attribute with the semantics of
> > `[[trivially_relocatable]]` is added, it should take a boolean argument.
>
> For.
Sorry, revising to Strong For. See my answer to Edward's email for rationale.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/1575644.0Hv0xUxLB1%40tjmaciei-mobl1.
.
Author: Thiago Macieira <thiago@macieira.org>
Date: Sun, 18 Nov 2018 11:24:26 -0800
Raw View
On Tuesday, 13 November 2018 21:31:40 PST Edward Catmur wrote:
> I'd like to preface my votes with some justification for my views.
>
> Firstly, I believe that the concept of trivial relocatability implies the
> concept of non-trivial relocatability, and not just in the
> move-construct-and-destruct sense, but via some as yet unspecified
> mechanism that does not require two objects to exist at the same time -
> (very) tentatively a memcpy-and-noexcept-repair. This means that we should
> leave open the path toward such a mechanism.
I really don't see how that would exist in a non-limited fashion. The example
of the short string with a pointer to self might be one, but any non-trivial
implementation could fall outside of what the repair operation is permitted to
do. Specifically: is the repair operation allowed to access the moved-from
object, after the memcpy? If not, libstdc++'s new std::string would fall
outside the parameters.
> Secondly, lifetime is *serious* - it accounts for many of the bugs that
> afflict experienced programmers. In particular I'm worried about behavior
> classes that own callbacks (or event handlers), since these are typically
> lambdas capturing `this`, and such classes may well be stored in containers
> and thus subject to relocation.
I'm with Matthew's answer here: such types are either broken or already not
trivially relocatable due to the presence of user-defined copy and/or move
constructors.
> That is, a class should only be able to warrant its own trivial
> relocatability if it *would* be trivially relocatable but for the presence
> of its own user-defined special member functions.
But this is an interesting concept. If I have two classes A and B, with A a
base class of B, a new version of A may change whether it is trivially
relocatable. What does this mean for B?
If A wasn't trivially relocatable but now is, B could benefit from the
improvement but requires manual intervention to declare so. If A was trivially
relocatable and B added the attribute, then this is actually worse: now we're
performing trivial relocations where we shouldn't.
Therefore, it needs to be possible for class B to declare that it is
(trivially) relocatable if its base classes are, in spite of it adding one a
user-defined move constructor or destructor. This is achieavable with an
attribute with parameter, as in:
class [[trivially_relocatable(std::is_trivially_relocatable_v<A>)]] B : A
{ ... };
Of course, immediately upon seeing this, we desire a shorthand for depending
on other types' relocatability. Moreover, if this is going to allow for
complex expressions, it's also a good reason to explore either a contextual
keyword or a different mechanism.
> * RELOCATE is a bikeshed placeholder for a special member;
> * `default` means that the class is trivially relocatable if all its bases
> and members are trivially relocatable, and otherwise is not (there is no
> way to "force" trivial relocatability);
That I disagree with, though not strongly so.
> * `delete` means that the class is not trivially relocatable, even if it
> would otherwise qualify. (The class can still be relocated by
> move-construct-and-destruct.)
What would be the use-case for this? Can you think of an example of such a
class, one that isn't broken when placed in a container or copied around?
> The advantage of this syntax would be that the path to destructive move
> would be open: once the semantics are understood, convert RELOCATE to a
> special member *function* and allow the user to provide a body.
In the previous thread, I was for the destructive move solution. But right
now, I am failing to come up with a reasonable case where we'd need that. We'd
need a syntax for the caller to perform a destructive move, as
x = std::move(y);
won't be it. And
x = function_returning_by_value();
doesn't need it, after mandatory copy elision. So what are the use-cases for
this new syntax? The best I can think of is:
std::string x;
if (condition) {
std::string y = something();
if (condition2)
y += something_else();
x = std::relocate(y);
}
This is a contrived example that can be best solved by removing the y variable
in the first place, but a large & complex function could maybe use to simplify
refactoring. But this opens an even bigger can of worms, as the y variable can
no longer be used after the std::relocate call.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/2265031.aAFEICniEJ%40tjmaciei-mobl1.
.
Author: Thiago Macieira <thiago@macieira.org>
Date: Sun, 18 Nov 2018 11:39:16 -0800
Raw View
On Sunday, 18 November 2018 11:24:26 PST Thiago Macieira wrote:
> And
>
> x = function_returning_by_value();
>
> doesn't need it, after mandatory copy elision.
Correction:
auto x = function_returning_by_value();
In order for the called function to return by value, an area of scratch space
must be provided as an implicit parameter and the callee will construct the
returned value in place. I don't remember if implementations are allowed to
pass the address of a temporary instead of x's, but if they are, we can more
easily solve this by forbidding that technique than adding destructive move.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/2087753.c5FJRkcD8l%40tjmaciei-mobl1.
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Sun, 18 Nov 2018 19:44:01 -0500
Raw View
--000000000000df4825057af9d02d
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Sun, Nov 18, 2018 at 2:24 PM Thiago Macieira <thiago@macieira.org> wrote=
:
> On Tuesday, 13 November 2018 21:31:40 PST Edward Catmur wrote:
> > That is, a class should only be able to warrant its own trivial
> > relocatability if it *would* be trivially relocatable but for the
> presence
> > of its own user-defined special member functions.
>
> But this is an interesting concept. If I have two classes A and B, with A
> a
> base class of B, a new version of A may change whether it is trivially
> relocatable. What does this mean for B? [...snip...]
>
I think the part I snipped was going down a wrong path due to a faulty
assumption somewhere. This weekend I implemented the
[[clang::maybe_trivially_relocatable]] attribute, which is (I think) what
Edward was describing, and also what (I think) John McCall was asking for
on the Clang review <https://reviews.llvm.org/D50119>.
The idea is that there are two levels of "opt-in-ness."
The first level, [[clang::maybe_trivially_relocatable]], means "I warrant
> that even though I may have user-provided, non-defaulted, special member
> functions, I have designed them so that my relocation operation will not =
do
> anything substantially different from memberwise relocation." So if all o=
f
> my member+base subobjects are trivially relocatable (and not mutable and
> not volatile), then I myself will be trivially relocatable.
The second level, [[clang::trivially_relocatable]], means "I warrant that
> even though I may have user-provided, non-defaulted, special member
> functions, and even though I may have non-trivially relocatable (or mutab=
le
> or volatile) subobjects, I have designed them so that my relocation
> operation will not do anything substantially different from memcpy." So I
> myself will be trivially relocatable *no matter* what my subobjects claim
> about themselves.
So, Thiago, I would interpret your scenario with A and B as meaning one or
the other of the following scenarios:
Scenario 1.
struct A { ... };
struct B : public A { int m; }; // Rule of Zero
Scenario 2.
struct A { ... };
struct [[maybe_trivially_relocatable]] B : public A { int m; B(B&&);
~B(); }; // "B's relocate operation is tantamount to memberwise relocation=
"
If A wasn't trivially relocatable but now is, B could benefit from the
> improvement but requires manual intervention to declare so.
I don't see any situation in which this would happen.
In Scenario 1, if A becomes trivially relocatable, then so does B, because
B follows the Rule of Zero.
In Scenario 2, if A becomes trivially relocatable, then so does B, because
B has the "first-level" attribute.
> If A was trivially
> relocatable and B added the attribute, then this is actually worse: now
> we're
> performing trivial relocations where we shouldn't.
>
Here I agree with you (but disagree that it's a problem in practice =E2=80=
=94 in
fact I think it is a "solution" in practice).
Scenario 3:
struct A { ... };
struct [[trivially_relocatable]] B : public A { int m; B(B&&); ~B(); };
// "B's relocate operation is tantamount to memcpy"
Here, B is *taking full responsibility* for its own behavior. If B wants
its behavior to be conditional on A's behavior, then B must express that
logic in code:
struct A { ... };
template<bool> struct B_relocate_base : public A { int m;
B_relocate_base(B_relocate_base&&); ~B_relocate_base(); };
template<> struct [[trivially_relocatable]] B_relocate_base<true> :
public A { int m; B_relocate_base(B_relocate_base&&); ~B_relocate_base(); }=
;
struct B : public B_relocate_base<std::is_trivially_relocatable_v<A>>
{}; // Rule of Zero
This is how I originally implemented my libc++ patch which (as of this
writing) is still live on Godbolt. (I plan to try to replace it with
[[maybe_trivially_relocatable]] in as many places as possible, maybe as
soon as tonight, so that we can get some experience with that.)
This style involves a bit of metaprogramming, and is kind of cumbersome,
but it has the big benefit that we can look at B in isolation and *know*
that it is trivially relocatable in exactly the right cases. For library
types with very deeply nested inheritance graphs, such as `optional` and
`variant`, I think this is important. In fact, I have not figured out any
way to implement `optional` using only the [[maybe_trivially_relocatable]]
attribute. I think it *needs* the power of "second-level"
[[trivially_relocatable]].
Therefore, it needs to be possible for class B to declare that it is
> (trivially) relocatable if its base classes are, in spite of it adding on=
e
> a
> user-defined move constructor or destructor. This is achieavable with an
> attribute with parameter, as in:
>
> class [[trivially_relocatable(std::is_trivially_relocatable_v<A>)]] B :=
A
> { ... };
>
> Of course, immediately upon seeing this, we desire a shorthand for
> depending
> on other types' relocatability. Moreover, if this is going to allow for
> complex expressions, it's also a good reason to explore either a
> contextual
> keyword or a different mechanism.
>
My preferred mechanism is still the one shown above,
`B_relocate_base<bool>`. But you have 100% correctly described the
thought-process that led to that straw poll question about taking a boolean
parameter.
The other reason a boolean parameter might be desired is for things like
template<class T>
class [[maybe_trivially_relocatable]] vector {
some members;
#ifdef _LIBCPP_DEBUG
vector(vector&& rhs) { some instrumentation; }
~vector() { some instrumentation; }
#endif
};
As written, this is wrong.
If we use the explicit __vector_relocate_base trick, then we get the
correct behavior for free.
Using [[maybe_trivially_relocatable]], we'd have to write something like
template<class T>
class
#ifndef _LIBCPP_DEBUG
[[maybe_trivially_relocatable]]
#endif
vector {
some members;
#ifdef _LIBCPP_DEBUG
vector(vector&& rhs) { some instrumentation; }
~vector() { some instrumentation; }
#endif
};
> * RELOCATE is a bikeshed placeholder for a special member;
> > * `default` means that the class is trivially relocatable if all its
> bases
> > and members are trivially relocatable, and otherwise is not (there is n=
o
> > way to "force" trivial relocatability);
>
> That I disagree with, though not strongly so.
>
I now strongly disagree with this, unless somebody can show me how to
implement `std::optional<A>` so that it will inherit the trivial
relocatability of `A`, without any "forcing." I have tried and failed with
libc++'s optional.
Part of the philosophical problem is that `optional` implements
"destructibility" at a completely different level of the inheritance
hierarchy than "move-constructibility." So in order to make all of
`optional`'s base classes trivially relocatable, we essentially have to lie
to the compiler and pretend that e.g. __optional_destructible_base is
"trivially relocatable" when in fact it's not. (In fact, because of the
union, it is not even move-constructible! I think that is the *practical*
problem I'm hitting.) I would strongly prefer to have the most derived
class, `optional`, take responsibility for *all* of its behavior as a
package deal, without having to saddle every base class with a
[[maybe_trivially_relocatable]] attribute which is actually a lie in most
cases.
So, having investigated this [[maybe_trivially_relocatable]] attribute a
little bit, I am currently of the opinion that we still need
[[trivially_relocatable]] (with or without a boolean parameter, but in a
form that is *not* dependent on the kindness of subobjects). At the same
time, [[maybe_trivially_relocatable]] looks like it will make *some*
classes, such as `vector`, a bit easier to write =E2=80=94 if also a bit mo=
re
subtle in cases like that _LIBCPP_DEBUG situation.
=E2=80=93Arthur
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0%2BZmV81%2BE83ZtkVHqswfDLUmu2jjFARi_qFS1%=
3D9SroPPA%40mail.gmail.com.
--000000000000df4825057af9d02d
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div di=
r=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr">On Sun, Nov 18, 2018 at 2:24 PM=
Thiago Macieira <<a href=3D"mailto:thiago@macieira.org" target=3D"_blan=
k">thiago@macieira.org</a>> wrote:<br><div class=3D"gmail_quote"><blockq=
uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-wi=
dth:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-=
left:1ex">On Tuesday, 13 November 2018 21:31:40 PST Edward Catmur wrote:<br=
>
> That is, a class should only be able to warrant its own trivial<br>
> relocatability if it *would* be trivially relocatable but for the pres=
ence<br>
> of its own user-defined special member functions. <br>
<br>
But this is an interesting concept. If I have two classes A and B, with A a=
<br>
base class of B, a new version of A may change whether it is trivially <br>
relocatable. What does this mean for B? [...snip...]<br></blockquote><div><=
br></div><div>I think the part I snipped was going down a wrong path due to=
a faulty assumption somewhere. This weekend I implemented the [[clang::may=
be_trivially_relocatable]] attribute, which is (I think) what Edward was de=
scribing, and also what (I think) John McCall was asking for on <a href=3D"=
https://reviews.llvm.org/D50119" target=3D"_blank">the Clang review</a>.</d=
iv><div><span style=3D"color:rgb(0,0,0);font-family:"Segoe UI",&q=
uot;Segoe UI Emoji","Segoe UI Symbol",Lato,"Helvetica N=
eue",Helvetica,Arial,sans-serif;font-size:13px"><br></span></div></div=
></div><blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:0px=
"><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;=
border-left-color:rgb(204,204,204);padding-left:1ex"><span style=3D"color:r=
gb(0,0,0);font-family:"Segoe UI","Segoe UI Emoji","=
;Segoe UI Symbol",Lato,"Helvetica Neue",Helvetica,Arial,sans=
-serif;font-size:13px">The idea is that there are two levels of "opt-i=
n-ness."</span></blockquote></div></div><div><div class=3D"gmail_quote=
"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204)=
;padding-left:1ex">The first level,=C2=A0<tt class=3D"gmail-m_2904129238705=
570052gmail-remarkup-monospaced" style=3D"background-color:rgba(71,87,120,0=
..0980392);padding:1px 4px;border-top-left-radius:3px;border-top-right-radiu=
s:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;white-sp=
ace:pre-wrap;margin-top:0px">[[clang::maybe_trivially_relocatable]]</tt>, m=
eans "I warrant that even though I may have user-provided, non-default=
ed, special member functions, I have designed them so that my relocation op=
eration will not do anything substantially different from memberwise reloca=
tion." So if all of my member+base subobjects are trivially relocatabl=
e (and not mutable and not volatile), then I myself will be trivially reloc=
atable.</blockquote></div></div><div><div class=3D"gmail_quote"><blockquote=
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:=
1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left=
:1ex">The second level,=C2=A0<tt class=3D"gmail-m_2904129238705570052gmail-=
remarkup-monospaced" style=3D"background-color:rgba(71,87,120,0.0980392);pa=
dding:1px 4px;border-top-left-radius:3px;border-top-right-radius:3px;border=
-bottom-right-radius:3px;border-bottom-left-radius:3px;white-space:pre-wrap=
;margin-top:0px">[[clang::trivially_relocatable]]</tt>, means "I warra=
nt that even though I may have user-provided, non-defaulted, special member=
functions, and even though I may have non-trivially relocatable (or mutabl=
e or volatile) subobjects, I have designed them so that my relocation opera=
tion will not do anything substantially different from memcpy." So I m=
yself will be trivially relocatable=C2=A0<em>no matter</em>=C2=A0what my su=
bobjects claim about themselves.=C2=A0</blockquote></div></div></blockquote=
><div dir=3D"ltr"><div class=3D"gmail_quote"><div><br></div><div>So, Thiago=
, I would interpret your scenario with A and B as meaning one or the other =
of the following scenarios:</div><div><br></div><div>Scenario 1.</div><div>=
=C2=A0 =C2=A0 struct A { ... };</div><div>=C2=A0 =C2=A0 struct B : public A=
{ int m; }; =C2=A0// Rule of Zero</div><div><br></div><div><div>Scenario 2=
..</div><div>=C2=A0 =C2=A0 struct A { ... };</div><div>=C2=A0 =C2=A0 struct =
[[maybe_trivially_relocatable]] B : public A { int m; B(B&&); ~B();=
}; =C2=A0// "B's relocate operation is tantamount to memberwise r=
elocation"</div></div><div><br></div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;bo=
rder-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">=
If A wasn't trivially relocatable but now is, B could benefit from the =
<br>
improvement but requires manual intervention to declare so.</blockquote><di=
v><br></div><div>I don't see any situation in which this would happen.<=
/div><div>In Scenario 1, if A becomes trivially relocatable, then so does B=
, because B follows the Rule of Zero.</div><div>In Scenario 2, if A becomes=
trivially relocatable, then so does B, because B has the "first-level=
" attribute.</div><div>=C2=A0<br></div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-styl=
e:solid;border-left-color:rgb(204,204,204);padding-left:1ex"> If A was triv=
ially <br>
relocatable and B added the attribute, then this is actually worse: now we&=
#39;re <br>
performing trivial relocations where we shouldn't.<br></blockquote><div=
><br></div><div>Here I agree with you (but disagree that it's a problem=
in practice =E2=80=94 in fact I think it is a "solution" in prac=
tice).</div><div>Scenario 3:</div><div>=C2=A0 =C2=A0 struct A { ... };</div=
><div>=C2=A0 =C2=A0 struct [[trivially_relocatable]] B : public A { int m; =
B(B&&); ~B(); }; =C2=A0// "B's relocate operation is tanta=
mount to memcpy"</div><div><br></div><div>Here, B is <b><i>taking full=
responsibility</i></b> for its own behavior. If B wants its behavior to be=
conditional on A's behavior, then B must express that logic in code:</=
div><div><br></div><div>=C2=A0 =C2=A0 struct A { ... };</div><div>=C2=A0 =
=C2=A0 template<bool> struct B_relocate_base : public A { int m; B_re=
locate_base(B_relocate_base&&); ~B_relocate_base(); };</div><div><d=
iv>=C2=A0 =C2=A0 template<> struct [[trivially_relocatable]] B_reloca=
te_base<true> : public A { int m; B_relocate_base(B_relocate_base&=
;&); ~B_relocate_base(); };</div></div><div>=C2=A0 =C2=A0 struct B : pu=
blic B_relocate_base<std::is_trivially_relocatable_v<A>> {}; =
=C2=A0// Rule of Zero</div><div><br></div><div>This is how I originally imp=
lemented my libc++ patch which (as of this writing) is still live on Godbol=
t. (I plan to try to replace it with [[maybe_trivially_relocatable]] in as =
many places as possible, maybe as soon as tonight, so that we can get some =
experience with that.)</div><div><br></div><div>This style involves a bit o=
f metaprogramming, and is kind of cumbersome, but it has the big benefit th=
at we can look at B in isolation and <i>know</i> that it is trivially reloc=
atable in exactly the right cases. For library types with very deeply neste=
d inheritance graphs, such as `optional` and `variant`, I think this is imp=
ortant. In fact, I have not figured out any way to implement `optional` usi=
ng only the [[maybe_trivially_relocatable]] attribute. I think it <i>needs<=
/i> the power of "second-level" [[trivially_relocatable]].</div><=
div><br></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-=
left-color:rgb(204,204,204);padding-left:1ex">
Therefore, it needs to be possible for class B to declare that it is <br>
(trivially) relocatable if its base classes are, in spite of it adding one =
a <br>
user-defined move constructor or destructor. This is achieavable with an <b=
r>
attribute with parameter, as in:<br>
<br>
=C2=A0 class [[trivially_relocatable(std::is_trivially_relocatable_v<A&g=
t;)]] B : A<br>
=C2=A0 { ... };<br>
<br>
Of course, immediately upon seeing this, we desire a shorthand for dependin=
g <br>
on other types' relocatability. Moreover, if this is going to allow for=
<br>
complex expressions, it's also a good reason to explore either a contex=
tual <br>
keyword or a different mechanism.<br></blockquote><div><br></div><div>My pr=
eferred mechanism is still the one shown above, `B_relocate_base<bool>=
;`. But you have 100% correctly described the thought-process that led to t=
hat straw poll question about taking a boolean parameter.</div><div><br></d=
iv><div>The other reason a boolean parameter might be desired is for things=
like</div><div><br></div><div>=C2=A0 =C2=A0 template<class T></div><=
div>=C2=A0 =C2=A0 class [[maybe_trivially_relocatable]] vector {</div><div>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 some members;</div><div>=C2=A0 =C2=A0 #ifdef _L=
IBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 vector(vector&& r=
hs) { some instrumentation; }</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ~vector=
() { some instrumentation; }</div><div>=C2=A0 =C2=A0 #endif</div><div>=C2=
=A0 =C2=A0 };</div><div><br></div><div>As written, this is wrong.</div><div=
>If we use the explicit __vector_relocate_base trick, then we get the corre=
ct behavior for free.</div><div>Using [[maybe_trivially_relocatable]], we&#=
39;d have to write something like</div><div><br></div><div><div>=C2=A0 =C2=
=A0 template<class T></div><div>=C2=A0 =C2=A0 class</div><div>=C2=A0 =
=C2=A0 #ifndef _LIBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 [[maybe_=
trivially_relocatable]]</div><div>=C2=A0 =C2=A0 #endif</div><div>=C2=A0 =C2=
=A0 vector {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 some members;</div><div>=
=C2=A0 =C2=A0 #ifdef _LIBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ve=
ctor(vector&& rhs) { some instrumentation; }</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 ~vector() { some instrumentation; }</div><div>=C2=A0 =C2=
=A0 #endif</div><div>=C2=A0 =C2=A0 };</div></div><div><br></div><div><br></=
div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor=
der-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,20=
4);padding-left:1ex">> * RELOCATE is a bikeshed placeholder for a specia=
l member;<br>
> * `default` means that the class is trivially relocatable if all its b=
ases<br>
> and members are trivially relocatable, and otherwise is not (there is =
no<br>
> way to "force" trivial relocatability);<br>
<br>
That I disagree with, though not strongly so.<br></blockquote><div><br></di=
v><div>I now strongly disagree with this, unless somebody can show me how t=
o implement `std::optional<A>` so that it will inherit the trivial re=
locatability of `A`, without any "forcing." =C2=A0I have tried an=
d failed with libc++'s optional.</div><div>Part of the philosophical pr=
oblem is that `optional` implements "destructibility" at a comple=
tely different level of the inheritance hierarchy than "move-construct=
ibility." So in order to make all of `optional`'s base classes tri=
vially relocatable, we essentially have to lie to the compiler and pretend =
that e.g. __optional_destructible_base is "trivially relocatable"=
when in fact it's not. =C2=A0(In fact, because of the union, it is not=
even move-constructible! I think that is the <i>practical</i> problem I=
9;m hitting.) =C2=A0I would strongly prefer to have the most derived class,=
`optional`, take responsibility for <i>all</i> of its behavior as a packag=
e deal, without having to saddle every base class with a [[maybe_trivially_=
relocatable]] attribute which is actually a lie in most cases.</div><div><b=
r></div><div>So, having investigated this [[maybe_trivially_relocatable]] a=
ttribute a little bit, I am currently of the opinion that we still need [[t=
rivially_relocatable]] (with or without a boolean parameter, but in a form =
that is=C2=A0<i><b>not</b></i> dependent on the kindness of subobjects).=C2=
=A0 At the same time, [[maybe_trivially_relocatable]] looks like it will ma=
ke <i>some</i> classes, such as `vector`, a bit easier to write =E2=80=94 i=
f also a bit more subtle in cases like that _LIBCPP_DEBUG situation.</div><=
div><br></div><div>=E2=80=93Arthur</div></div></div></div></div></div></div=
></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2BZmV81%2BE83ZtkVHqswfDLUmu2j=
jFARi_qFS1%3D9SroPPA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0%2BZ=
mV81%2BE83ZtkVHqswfDLUmu2jjFARi_qFS1%3D9SroPPA%40mail.gmail.com</a>.<br />
--000000000000df4825057af9d02d--
.
Author: mihailnajdenov@gmail.com
Date: Mon, 19 Nov 2018 01:31:03 -0800 (PST)
Raw View
------=_Part_1056_1519387493.1542619863830
Content-Type: multipart/alternative;
boundary="----=_Part_1057_307972162.1542619863831"
------=_Part_1057_307972162.1542619863831
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2018 at 2:44:17 AM UTC+2, Arthur O'Dwyer wrote:
>
> On Sun, Nov 18, 2018 at 2:24 PM Thiago Macieira <thi...@macieira.org=20
> <javascript:>> wrote:
>
>> On Tuesday, 13 November 2018 21:31:40 PST Edward Catmur wrote:
>> > That is, a class should only be able to warrant its own trivial
>> > relocatability if it *would* be trivially relocatable but for the=20
>> presence
>> > of its own user-defined special member functions.=20
>>
>> But this is an interesting concept. If I have two classes A and B, with =
A=20
>> a=20
>> base class of B, a new version of A may change whether it is trivially=
=20
>> relocatable. What does this mean for B? [...snip...]
>>
>
> I think the part I snipped was going down a wrong path due to a faulty=20
> assumption somewhere. This weekend I implemented the=20
> [[clang::maybe_trivially_relocatable]] attribute, which is (I think) what=
=20
> Edward was describing, and also what (I think) John McCall was asking for=
=20
> on the Clang review <https://reviews.llvm.org/D50119>.
>
> The idea is that there are two levels of "opt-in-ness."
>
> The first level, [[clang::maybe_trivially_relocatable]], means "I warrant=
=20
>> that even though I may have user-provided, non-defaulted, special member=
=20
>> functions, I have designed them so that my relocation operation will not=
do=20
>> anything substantially different from memberwise relocation." So if all =
of=20
>> my member+base subobjects are trivially relocatable (and not mutable and=
=20
>> not volatile), then I myself will be trivially relocatable.
>
> The second level, [[clang::trivially_relocatable]], means "I warrant that=
=20
>> even though I may have user-provided, non-defaulted, special member=20
>> functions, and even though I may have non-trivially relocatable (or muta=
ble=20
>> or volatile) subobjects, I have designed them so that my relocation=20
>> operation will not do anything substantially different from memcpy." So =
I=20
>> myself will be trivially relocatable *no matter* what my subobjects=20
>> claim about themselves.=20
>
>
> So, Thiago, I would interpret your scenario with A and B as meaning one o=
r=20
> the other of the following scenarios:
>
> Scenario 1.
> struct A { ... };
> struct B : public A { int m; }; // Rule of Zero
>
> Scenario 2.
> struct A { ... };
> struct [[maybe_trivially_relocatable]] B : public A { int m; B(B&&);=
=20
> ~B(); }; // "B's relocate operation is tantamount to memberwise relocati=
on"
>
>
> If A wasn't trivially relocatable but now is, B could benefit from the=20
>> improvement but requires manual intervention to declare so.
>
>
> I don't see any situation in which this would happen.
> In Scenario 1, if A becomes trivially relocatable, then so does B, becaus=
e=20
> B follows the Rule of Zero.
> In Scenario 2, if A becomes trivially relocatable, then so does B, becaus=
e=20
> B has the "first-level" attribute.
> =20
>
>> If A was trivially=20
>> relocatable and B added the attribute, then this is actually worse: now=
=20
>> we're=20
>> performing trivial relocations where we shouldn't.
>>
>
> Here I agree with you (but disagree that it's a problem in practice =E2=
=80=94 in=20
> fact I think it is a "solution" in practice).
> Scenario 3:
> struct A { ... };
> struct [[trivially_relocatable]] B : public A { int m; B(B&&); ~B();=
=20
> }; // "B's relocate operation is tantamount to memcpy"
>
> Here, B is *taking full responsibility* for its own behavior. If B wants=
=20
> its behavior to be conditional on A's behavior, then B must express that=
=20
> logic in code:
>
But this is also forces A to behave, doesn't it, which might or might not=
=20
be the case.
In reality it is not exactly "for its own behavior", right?
=20
>
> struct A { ... };
> template<bool> struct B_relocate_base : public A { int m;=20
> B_relocate_base(B_relocate_base&&); ~B_relocate_base(); };
> template<> struct [[trivially_relocatable]] B_relocate_base<true> :=
=20
> public A { int m; B_relocate_base(B_relocate_base&&); ~B_relocate_base();=
};
> struct B : public B_relocate_base<std::is_trivially_relocatable_v<A>>=
=20
> {}; // Rule of Zero
>
Ok, but what about members?
So, if I get this straight we have two options:
struct [[maybe_reloc]] A : Base=20
{
A(A&&); ~A();=20
B b;
C c;
D d;
};
and
struct [[reloc]] A : Base=20
{
A(A&&); ~A();=20
B b;
C c;
D d;
};
In the first case you either are correctly (no UB) relocatable or not.=20
Changing relocatability property of any member and base can turn this on=20
and off.
In the second case we force relocatability, taking responsibility for the=
=20
class, its members and bases. Changing relocatability property of any=20
member and base can turn into an UB.
Is this the more or less complete picture (minus conditional attr)?
Now, I do understand the need to force reloc, but can we consider making=20
this more fine grained?=20
This is, an attr / keyword is used to vouch on a object.
struct [[reloc]] A : Base=20
{
A(A&&); ~A();=20
B b;
C c;
D d;
};
This only vouches for our class alone, literally "for its own behavior" -=
=20
the move and the dtor of our class do the right thing.
If any member or base is not trivially relocatable it will be a compile=20
time error (or turn reloc off if go with "maybe" semantics). =20
Now, if we are sure that some of our members and bases do the right thing,=
=20
or that we use them in the right way in our context (the batteries vector)
then we vouch for that base or member alone *not for the all members and=20
bases.*
=20
struct [[reloc]] A : [[reloc]] Base=20
{
A(A&&); ~A();=20
B b;
[[reloc]] C c;
D d;
};
If B and D are trivially relocatable as well we are good to go. If at any=
=20
point B D become non-trivially reloc, we fail to compile. If C or Base=20
become trivial, nothing changes.
Having this model will allow us to safely force, as we only vouching for=20
things we have control over
consider
template<class B, class C, class D>
struct [[maybe_reloc]] A : [[reloc]] Base=20
{
A(A&&); ~A();=20
B b;
C c;
D d;
};
We can allow us to force the base as we have written it, or we know it=20
and/or we use it in the correct way.
We have no control over the members. Yet we might want to be relocatable,=
=20
IFF we can do so.
The above scenario is either not possible under current model, or extremely=
=20
hard and metaprogrammy.
> This is how I originally implemented my libc++ patch which (as of this=20
> writing) is still live on Godbolt. (I plan to try to replace it with=20
> [[maybe_trivially_relocatable]] in as many places as possible, maybe as=
=20
> soon as tonight, so that we can get some experience with that.)
>
> This style involves a bit of metaprogramming, and is kind of cumbersome,=
=20
> but it has the big benefit that we can look at B in isolation and *know*=
=20
> that it is trivially relocatable in exactly the right cases. For library=
=20
> types with very deeply nested inheritance graphs, such as `optional` and=
=20
> `variant`, I think this is important. In fact, I have not figured out any=
=20
> way to implement `optional` using only the [[maybe_trivially_relocatable]=
]=20
> attribute. I think it *needs* the power of "second-level"=20
> [[trivially_relocatable]].
>
>
> Therefore, it needs to be possible for class B to declare that it is=20
>> (trivially) relocatable if its base classes are, in spite of it adding=
=20
>> one a=20
>> user-defined move constructor or destructor. This is achieavable with an=
=20
>> attribute with parameter, as in:
>>
>> class [[trivially_relocatable(std::is_trivially_relocatable_v<A>)]] B =
:=20
>> A
>> { ... };
>>
>> Of course, immediately upon seeing this, we desire a shorthand for=20
>> depending=20
>> on other types' relocatability. Moreover, if this is going to allow for=
=20
>> complex expressions, it's also a good reason to explore either a=20
>> contextual=20
>> keyword or a different mechanism.
>>
>
> My preferred mechanism is still the one shown above,=20
> `B_relocate_base<bool>`. But you have 100% correctly described the=20
> thought-process that led to that straw poll question about taking a boole=
an=20
> parameter.
>
> The other reason a boolean parameter might be desired is for things like
>
> template<class T>
> class [[maybe_trivially_relocatable]] vector {
> some members;
> #ifdef _LIBCPP_DEBUG
> vector(vector&& rhs) { some instrumentation; }
> ~vector() { some instrumentation; }
> #endif
> };
>
> As written, this is wrong.
> If we use the explicit __vector_relocate_base trick, then we get the=20
> correct behavior for free.
> Using [[maybe_trivially_relocatable]], we'd have to write something like
>
> template<class T>
> class
> #ifndef _LIBCPP_DEBUG
> [[maybe_trivially_relocatable]]
> #endif
> vector {
> some members;
> #ifdef _LIBCPP_DEBUG
> vector(vector&& rhs) { some instrumentation; }
> ~vector() { some instrumentation; }
> #endif
> };
>
>
> > * RELOCATE is a bikeshed placeholder for a special member;
>> > * `default` means that the class is trivially relocatable if all its=
=20
>> bases
>> > and members are trivially relocatable, and otherwise is not (there is =
no
>> > way to "force" trivial relocatability);
>>
>> That I disagree with, though not strongly so.
>>
>
> I now strongly disagree with this, unless somebody can show me how to=20
> implement `std::optional<A>` so that it will inherit the trivial=20
> relocatability of `A`, without any "forcing." I have tried and failed wi=
th=20
> libc++'s optional.
> Part of the philosophical problem is that `optional` implements=20
> "destructibility" at a completely different level of the inheritance=20
> hierarchy than "move-constructibility." So in order to make all of=20
> `optional`'s base classes trivially relocatable, we essentially have to l=
ie=20
> to the compiler and pretend that e.g. __optional_destructible_base is=20
> "trivially relocatable" when in fact it's not. (In fact, because of the=
=20
> union, it is not even move-constructible! I think that is the *practical*=
=20
> problem I'm hitting.) I would strongly prefer to have the most derived=
=20
> class, `optional`, take responsibility for *all* of its behavior as a=20
> package deal, without having to saddle every base class with a=20
> [[maybe_trivially_relocatable]] attribute which is actually a lie in most=
=20
> cases.
>
> So, having investigated this [[maybe_trivially_relocatable]] attribute a=
=20
> little bit, I am currently of the opinion that we still need=20
> [[trivially_relocatable]] (with or without a boolean parameter, but in a=
=20
> form that is *not* dependent on the kindness of subobjects). At the same=
=20
> time, [[maybe_trivially_relocatable]] looks like it will make *some*=20
> classes, such as `vector`, a bit easier to write =E2=80=94 if also a bit =
more=20
> subtle in cases like that _LIBCPP_DEBUG situation.
>
> =E2=80=93Arthur
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/02ef1e33-e43b-48f1-8a0d-aa25ac409706%40isocpp.or=
g.
------=_Part_1057_307972162.1542619863831
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, November 19, 2018 at 2:44:17 AM UTC+2, =
Arthur O'Dwyer wrote:<blockquote class=3D"gmail_quote" style=3D"margin:=
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"=
ltr"><div dir=3D"ltr"><div dir=3D"ltr">On Sun, Nov 18, 2018 at 2:24 PM Thia=
go Macieira <<a href=3D"javascript:" target=3D"_blank" gdf-obfuscated-ma=
ilto=3D"DsEfxCPoAQAJ" rel=3D"nofollow" onmousedown=3D"this.href=3D'java=
script:';return true;" onclick=3D"this.href=3D'javascript:';ret=
urn true;">thi...@macieira.org</a>> wrote:<br><div class=3D"gmail_quote"=
><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border=
-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);=
padding-left:1ex">On Tuesday, 13 November 2018 21:31:40 PST Edward Catmur w=
rote:<br>
> That is, a class should only be able to warrant its own trivial<br>
> relocatability if it *would* be trivially relocatable but for the pres=
ence<br>
> of its own user-defined special member functions. <br>
<br>
But this is an interesting concept. If I have two classes A and B, with A a=
<br>
base class of B, a new version of A may change whether it is trivially <br>
relocatable. What does this mean for B? [...snip...]<br></blockquote><div><=
br></div><div>I think the part I snipped was going down a wrong path due to=
a faulty assumption somewhere. This weekend I implemented the [[clang::may=
be_trivially_<wbr>relocatable]] attribute, which is (I think) what Edward w=
as describing, and also what (I think) John McCall was asking for on <a hre=
f=3D"https://reviews.llvm.org/D50119" target=3D"_blank" rel=3D"nofollow" on=
mousedown=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F%2=
Freviews.llvm.org%2FD50119\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFIjE4M66=
C31ZlXrWjXL5IBBgcjOA';return true;" onclick=3D"this.href=3D'https:/=
/www.google.com/url?q\x3dhttps%3A%2F%2Freviews.llvm.org%2FD50119\x26sa\x3dD=
\x26sntz\x3d1\x26usg\x3dAFQjCNFIjE4M66C31ZlXrWjXL5IBBgcjOA';return true=
;">the Clang review</a>.</div><div><span style=3D"color:rgb(0,0,0);font-fam=
ily:"Segoe UI","Segoe UI Emoji","Segoe UI Symbol&q=
uot;,Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1=
3px"><br></span></div></div></div><blockquote style=3D"margin:0px 0px 0px 4=
0px;border:none;padding:0px"><div><div class=3D"gmail_quote"><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px=
;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1e=
x"><span style=3D"color:rgb(0,0,0);font-family:"Segoe UI","S=
egoe UI Emoji","Segoe UI Symbol",Lato,"Helvetica Neue&q=
uot;,Helvetica,Arial,sans-serif;font-size:13px">The idea is that there are =
two levels of "opt-in-ness."</span></blockquote></div></div><div>=
<div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margi=
n:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-le=
ft-color:rgb(204,204,204);padding-left:1ex">The first level,=C2=A0<tt style=
=3D"background-color:rgba(71,87,120,0.0980392);padding:1px 4px;border-top-l=
eft-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;b=
order-bottom-left-radius:3px;white-space:pre-wrap;margin-top:0px">[[clang::=
maybe_<wbr>trivially_relocatable]]</tt>, means "I warrant that even th=
ough I may have user-provided, non-defaulted, special member functions, I h=
ave designed them so that my relocation operation will not do anything subs=
tantially different from memberwise relocation." So if all of my membe=
r+base subobjects are trivially relocatable (and not mutable and not volati=
le), then I myself will be trivially relocatable.</blockquote></div></div><=
div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;borde=
r-left-color:rgb(204,204,204);padding-left:1ex">The second level,=C2=A0<tt =
style=3D"background-color:rgba(71,87,120,0.0980392);padding:1px 4px;border-=
top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:=
3px;border-bottom-left-radius:3px;white-space:pre-wrap;margin-top:0px">[[cl=
ang::trivially_<wbr>relocatable]]</tt>, means "I warrant that even tho=
ugh I may have user-provided, non-defaulted, special member functions, and =
even though I may have non-trivially relocatable (or mutable or volatile) s=
ubobjects, I have designed them so that my relocation operation will not do=
anything substantially different from memcpy." So I myself will be tr=
ivially relocatable=C2=A0<em>no matter</em>=C2=A0what my subobjects claim a=
bout themselves.=C2=A0</blockquote></div></div></blockquote><div dir=3D"ltr=
"><div class=3D"gmail_quote"><div><br></div><div>So, Thiago, I would interp=
ret your scenario with A and B as meaning one or the other of the following=
scenarios:</div><div><br></div><div>Scenario 1.</div><div>=C2=A0 =C2=A0 st=
ruct A { ... };</div><div>=C2=A0 =C2=A0 struct B : public A { int m; }; =C2=
=A0// Rule of Zero</div><div><br></div><div><div>Scenario 2.</div><div>=C2=
=A0 =C2=A0 struct A { ... };</div><div>=C2=A0 =C2=A0 struct [[maybe_trivial=
ly_relocatable]<wbr>] B : public A { int m; B(B&&); ~B(); }; =C2=A0=
// "B's relocate operation is tantamount to memberwise relocation&=
quot;</div></div><div><br></div><div><br></div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-s=
tyle:solid;border-left-color:rgb(204,204,204);padding-left:1ex">If A wasn&#=
39;t trivially relocatable but now is, B could benefit from the <br>
improvement but requires manual intervention to declare so.</blockquote><di=
v><br></div><div>I don't see any situation in which this would happen.<=
/div><div>In Scenario 1, if A becomes trivially relocatable, then so does B=
, because B follows the Rule of Zero.</div><div>In Scenario 2, if A becomes=
trivially relocatable, then so does B, because B has the "first-level=
" attribute.</div><div>=C2=A0<br></div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-styl=
e:solid;border-left-color:rgb(204,204,204);padding-left:1ex"> If A was triv=
ially <br>
relocatable and B added the attribute, then this is actually worse: now we&=
#39;re <br>
performing trivial relocations where we shouldn't.<br></blockquote><div=
><br></div><div>Here I agree with you (but disagree that it's a problem=
in practice =E2=80=94 in fact I think it is a "solution" in prac=
tice).</div><div>Scenario 3:</div><div>=C2=A0 =C2=A0 struct A { ... };</div=
><div>=C2=A0 =C2=A0 struct [[trivially_relocatable]] B : public A { int m; =
B(B&&); ~B(); }; =C2=A0// "B's relocate operation is tanta=
mount to memcpy"</div><div><br></div><div>Here, B is <b><i>taking full=
responsibility</i></b> for its own behavior. If B wants its behavior to be=
conditional on A's behavior, then B must express that logic in code:</=
div></div></div></div></div></div></div></div></div></blockquote><div><br><=
/div><div>But this is also forces A to behave, doesn't it, which might =
or might not be the case.</div><div>In reality it is not exactly "for =
its own behavior", right?</div><div>=C2=A0</div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><=
div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div cla=
ss=3D"gmail_quote"><div><br></div><div>=C2=A0 =C2=A0 struct A { ... };</div=
><div>=C2=A0 =C2=A0 template<bool> struct B_relocate_base : public A =
{ int m; B_relocate_base(B_relocate_<wbr>base&&); ~B_relocate_base(=
); };</div><div><div>=C2=A0 =C2=A0 template<> struct [[trivially_relo=
catable]] B_relocate_base<true> : public A { int m; B_relocate_base(B=
_relocate_<wbr>base&&); ~B_relocate_base(); };</div></div><div>=C2=
=A0 =C2=A0 struct B : public B_relocate_base<std::is_<wbr>trivially_relo=
catable_v<A>> {}; =C2=A0// Rule of Zero</div></div></div></div></d=
iv></div></div></div></div></blockquote><div><br></div><div>Ok, but what ab=
out members?</div><div><br></div><div>So, if I get this straight we have tw=
o options:</div><div><br></div><div>struct [[maybe_reloc]] A : Base=C2=A0</=
div><div>{</div><div>=C2=A0 A(A&&); ~A();=C2=A0</div><div>=C2=A0 B =
b;</div><div>=C2=A0 C c;</div><div>=C2=A0 D d;</div><div>};</div><div><br><=
/div><div>and</div><div><br></div><div><div>struct [[reloc]] A : Base=C2=A0=
</div><div>{</div><div>=C2=A0 A(A&&); ~A();=C2=A0</div><div>=C2=A0 =
B b;</div><div>=C2=A0 C c;</div><div>=C2=A0 D d;</div><div>};</div></div><d=
iv><br></div><div>In the first case you either are correctly (no UB) reloca=
table or not. Changing relocatability=C2=A0property of any member and base =
can turn this on and off.</div><div>In the second case we force=C2=A0reloca=
tability, taking responsibility for the class, its members and bases. Chang=
ing relocatability=C2=A0property of any member and base can turn into an UB=
..</div><div><br></div><div>Is this the more or less complete picture (minus=
conditional attr)?</div><div><br></div><div><br></div><div>Now, I do under=
stand the need to force reloc, but can we consider making this more fine gr=
ained?=C2=A0</div><div><br></div><div>This is, an attr / keyword is used to=
vouch on a object.</div><div><br></div><div>struct [[reloc]] A : Base=C2=
=A0</div><div>{</div><div>=C2=A0 A(A&&); ~A();=C2=A0</div><div>=C2=
=A0 B b;</div><div>=C2=A0 C c;</div><div>=C2=A0 D d;</div><div>};</div><div=
><br></div><div>This only vouches for our class alone, literally "for =
its own behavior" - the move and the dtor of our class do the right th=
ing.</div><div>If any member or base is not trivially relocatable it will b=
e a compile time error (or turn reloc off if go with "maybe" sema=
ntics).=C2=A0 =C2=A0</div><div><br></div><div>Now, if we are sure that some=
of our members and bases do the right thing, or that we use them in the ri=
ght way in our context (the batteries vector)</div><div>then we vouch for t=
hat base or member alone<i> </i><b>not for the all members and bases.</b></=
div><div><br></div><div>=C2=A0</div><div><div>struct [[reloc]] A :=C2=A0 [[=
reloc]]=C2=A0Base=C2=A0</div><div>{</div><div>=C2=A0 A(A&&); ~A();=
=C2=A0</div><div>=C2=A0 B b;</div><div>=C2=A0 [[reloc]]=C2=A0C c;</div><div=
>=C2=A0 D d;</div><div>};</div></div><div><br></div><div>If B and D are tri=
vially relocatable as well we are good to go. If at any point B D become no=
n-trivially reloc, we fail to compile. If C or Base become trivial, nothing=
changes.</div><div><br></div><div>Having this model will allow us to safel=
y force, as we only vouching for things we have control over</div><div><br>=
</div><div>consider</div><div><br></div><div>template<class B, class C, =
class D></div><div><div>struct [[maybe_reloc]] A :=C2=A0 [[reloc]]=C2=A0=
Base=C2=A0</div><div>{</div><div>=C2=A0 A(A&&); ~A();=C2=A0</div><d=
iv>=C2=A0 B b;</div><div>=C2=A0 C c;</div><div>=C2=A0 D d;</div><div>};</di=
v></div><div><br></div><div>We can allow us to force the base as we have wr=
itten it, or we know it and/or we use it in the correct way.</div><div>We h=
ave no control over the members. Yet we might want to be relocatable, IFF w=
e can do so.</div><div><br></div><div>The above scenario is either not poss=
ible under current model, or extremely hard and metaprogrammy.</div><div><b=
r></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div =
dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"=
ltr"><div dir=3D"ltr"><div class=3D"gmail_quote"><div><br></div><div>This i=
s how I originally implemented my libc++ patch which (as of this writing) i=
s still live on Godbolt. (I plan to try to replace it with [[maybe_triviall=
y_relocatable]<wbr>] in as many places as possible, maybe as soon as tonigh=
t, so that we can get some experience with that.)</div><div><br></div><div>=
This style involves a bit of metaprogramming, and is kind of cumbersome, bu=
t it has the big benefit that we can look at B in isolation and <i>know</i>=
that it is trivially relocatable in exactly the right cases. For library t=
ypes with very deeply nested inheritance graphs, such as `optional` and `va=
riant`, I think this is important. In fact, I have not figured out any way =
to implement `optional` using only the [[maybe_trivially_relocatable]<wbr>]=
attribute. I think it <i>needs</i> the power of "second-level" [=
[trivially_relocatable]].</div><div><br></div><div><br></div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px=
;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1e=
x">
Therefore, it needs to be possible for class B to declare that it is <br>
(trivially) relocatable if its base classes are, in spite of it adding one =
a <br>
user-defined move constructor or destructor. This is achieavable with an <b=
r>
attribute with parameter, as in:<br>
<br>
=C2=A0 class [[trivially_relocatable(std::<wbr>is_trivially_relocatable_v&l=
t;A>)<wbr>]] B : A<br>
=C2=A0 { ... };<br>
<br>
Of course, immediately upon seeing this, we desire a shorthand for dependin=
g <br>
on other types' relocatability. Moreover, if this is going to allow for=
<br>
complex expressions, it's also a good reason to explore either a contex=
tual <br>
keyword or a different mechanism.<br></blockquote><div><br></div><div>My pr=
eferred mechanism is still the one shown above, `B_relocate_base<bool>=
;`. But you have 100% correctly described the thought-process that led to t=
hat straw poll question about taking a boolean parameter.</div><div><br></d=
iv><div>The other reason a boolean parameter might be desired is for things=
like</div><div><br></div><div>=C2=A0 =C2=A0 template<class T></div><=
div>=C2=A0 =C2=A0 class [[maybe_trivially_relocatable]<wbr>] vector {</div>=
<div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 some members;</div><div>=C2=A0 =C2=A0 #ifd=
ef _LIBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 vector(vector&&a=
mp; rhs) { some instrumentation; }</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ~v=
ector() { some instrumentation; }</div><div>=C2=A0 =C2=A0 #endif</div><div>=
=C2=A0 =C2=A0 };</div><div><br></div><div>As written, this is wrong.</div><=
div>If we use the explicit __vector_relocate_base trick, then we get the co=
rrect behavior for free.</div><div>Using [[maybe_trivially_relocatable]<wbr=
>], we'd have to write something like</div><div><br></div><div><div>=C2=
=A0 =C2=A0 template<class T></div><div>=C2=A0 =C2=A0 class</div><div>=
=C2=A0 =C2=A0 #ifndef _LIBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 [=
[maybe_trivially_relocatable]<wbr>]</div><div>=C2=A0 =C2=A0 #endif</div><di=
v>=C2=A0 =C2=A0 vector {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 some members=
;</div><div>=C2=A0 =C2=A0 #ifdef _LIBCPP_DEBUG</div><div>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 vector(vector&& rhs) { some instrumentation; }</div><div=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ~vector() { some instrumentation; }</div><div>=
=C2=A0 =C2=A0 #endif</div><div>=C2=A0 =C2=A0 };</div></div><div><br></div><=
div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(=
204,204,204);padding-left:1ex">> * RELOCATE is a bikeshed placeholder fo=
r a special member;<br>
> * `default` means that the class is trivially relocatable if all its b=
ases<br>
> and members are trivially relocatable, and otherwise is not (there is =
no<br>
> way to "force" trivial relocatability);<br>
<br>
That I disagree with, though not strongly so.<br></blockquote><div><br></di=
v><div>I now strongly disagree with this, unless somebody can show me how t=
o implement `std::optional<A>` so that it will inherit the trivial re=
locatability of `A`, without any "forcing." =C2=A0I have tried an=
d failed with libc++'s optional.</div><div>Part of the philosophical pr=
oblem is that `optional` implements "destructibility" at a comple=
tely different level of the inheritance hierarchy than "move-construct=
ibility." So in order to make all of `optional`'s base classes tri=
vially relocatable, we essentially have to lie to the compiler and pretend =
that e.g. __optional_destructible_base is "trivially relocatable"=
when in fact it's not. =C2=A0(In fact, because of the union, it is not=
even move-constructible! I think that is the <i>practical</i> problem I=
9;m hitting.) =C2=A0I would strongly prefer to have the most derived class,=
`optional`, take responsibility for <i>all</i> of its behavior as a packag=
e deal, without having to saddle every base class with a [[maybe_trivially_=
relocatable]<wbr>] attribute which is actually a lie in most cases.</div><d=
iv><br></div><div>So, having investigated this [[maybe_trivially_relocatabl=
e]<wbr>] attribute a little bit, I am currently of the opinion that we stil=
l need [[trivially_relocatable]] (with or without a boolean parameter, but =
in a form that is=C2=A0<i><b>not</b></i> dependent on the kindness of subob=
jects).=C2=A0 At the same time, [[maybe_trivially_relocatable]<wbr>] looks =
like it will make <i>some</i> classes, such as `vector`, a bit easier to wr=
ite =E2=80=94 if also a bit more subtle in cases like that _LIBCPP_DEBUG si=
tuation.</div><div><br></div><div>=E2=80=93Arthur</div></div></div></div></=
div></div></div></div></div>
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/02ef1e33-e43b-48f1-8a0d-aa25ac409706%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/02ef1e33-e43b-48f1-8a0d-aa25ac409706=
%40isocpp.org</a>.<br />
------=_Part_1057_307972162.1542619863831--
------=_Part_1056_1519387493.1542619863830--
.
Author: "Arthur O'Dwyer" <arthur.j.odwyer@gmail.com>
Date: Wed, 21 Nov 2018 22:49:55 -0500
Raw View
--0000000000008937ba057b38c21f
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
For the record, here are my own !votes. Some of my views have evolved since
P1144R0.
My original suggestions, recorded with parentheses in P1144R0, were
SF SF SF SF SF
N SA SA A SF
SF SF SF SF N
The !votes I have actually recorded for myself in P1144R1 are
SF SF SF SF SF
A SA SA N F
N F SF SF N
- Having implemented parts of the libc++ patch multiple times with
different syntaxes (see the Clang patch discussion
<https://reviews.llvm.org/D50119> for details), I am now more favorably
disposed toward the idea of an attribute with a boolean parameter.
- I am less comfortable now with P1144R0's idea that a type could be
simultaneously "trivially relocatable" and "not nothrow relocatable." It
doesn't present any practical difficulties for library vendors, but it
feels weird. I am amenable to the idea of removing the is_relocatable and
is_nothrow_relocatable type traits.
=E2=80=93Arthur
On Mon, Nov 12, 2018 at 11:54 AM <florian.csdt@gmail.com> wrote:
> Le lundi 12 novembre 2018 02:35:40 UTC+1, Arthur O'Dwyer a =C3=A9crit :
>>
>> P1144R0 "Object relocation in terms of move plus destroy"
>> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>
>> was presented to SG17 (EWGI) in San Diego. (Thanks to Corentin Jabot for
>> trying to make it happen!) The paper lists the following straw polls tha=
t
>> *could* have been taken. None of these polls were taken, and no feedback
>> was given on the paper in San Diego.
>>
>> So I'd like to get *your* opinions! Please reply in this thread with
>> your !votes on any or all of the following statements, in the traditiona=
l
>> WG21 straw poll format: "Strongly For" the statement as written; "For" i=
t;
>> "Neutral" (as in, you considered the question and your expert opinion is
>> that you are neutral on it =E2=80=94 please do not use this option as a =
synonym for
>> *abstaining* due to *lack* of an opinion); "Against" the statement as
>> written; or "Strongly Against" it.
>>
>> The polls will remain open for one week, until Sunday 2018-11-18. If you
>> don't want your !votes to be public, you can always email them to me
>> privately.
>> I will tally the ballots and report the results in P1144R1, which will
>> appear in the post-San-Diego mailing (submission deadline: 2018-11-26).
>>
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/CADvuK0L2p-Wuokn3%3D%3D6%2BkyE76dtvC78JQuz6CNEc3=
3t9yZ97GA%40mail.gmail.com.
--0000000000008937ba057b38c21f
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">For the record, here are my own !votes. S=
ome of my views have evolved since P1144R0.<div>My original suggestions, re=
corded with parentheses in P1144R0, were</div><div>SF SF SF SF SF</div><div=
>N SA SA A SF</div><div>SF SF SF SF N</div><div><br></div><div>The !votes I=
have actually recorded for myself in P1144R1 are</div><div><div>SF SF SF S=
F SF</div><div>A SA SA N F</div><div>N F SF SF N</div></div><div><br></div>=
<div>- Having implemented parts of the libc++ patch multiple times with dif=
ferent syntaxes (see the <a href=3D"https://reviews.llvm.org/D50119">Clang =
patch discussion</a> for details), I am now more favorably disposed toward =
the idea of an attribute with a boolean parameter.</div><div>- I am less co=
mfortable now with P1144R0's idea that a type could be simultaneously &=
quot;trivially relocatable" and "not nothrow relocatable." I=
t doesn't present any practical difficulties for library vendors, but i=
t feels weird. I am amenable to the idea of removing the is_relocatable and=
is_nothrow_relocatable type traits.</div><div><br></div><div>=E2=80=93Arth=
ur</div><div><br></div></div><br><div class=3D"gmail_quote"><div dir=3D"ltr=
">On Mon, Nov 12, 2018 at 11:54 AM <<a href=3D"mailto:florian.csdt@gmail=
..com">florian.csdt@gmail.com</a>> wrote:</div><blockquote class=3D"gmail=
_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:=
1ex"><div dir=3D"ltr">Le lundi 12 novembre 2018 02:35:40 UTC+1, Arthur O=
9;Dwyer a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"margi=
n:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/papers=
/2018/p1144r0.html" rel=3D"nofollow" target=3D"_blank">P1144R0 "Object=
relocation in terms of move plus destroy"</a> was presented to SG17 (=
EWGI) in San Diego. (Thanks to Corentin Jabot for trying to make it happen!=
) The paper lists the following straw polls that <i><b>could</b></i> have b=
een taken. None of these polls were taken, and no feedback was given on the=
paper in San Diego.</div><div><br></div><div>So I'd like to get <i>you=
r</i> opinions!=C2=A0 Please reply in this thread with your !votes on any o=
r all of the following statements, in the traditional WG21 straw poll forma=
t: "Strongly For" the statement as written; "For" it; &=
quot;Neutral" (as in, you considered the question and your expert opin=
ion is that you are neutral on it =E2=80=94 please do not use this option a=
s a synonym for=C2=A0<i>abstaining</i> due to <i>lack</i> of an opinion); &=
quot;Against" the statement as written; or "Strongly Against"=
; it.</div><div><br></div><div>The polls will remain open for one week, unt=
il Sunday 2018-11-18. If you don't want your !votes to be public, you c=
an always email them to me privately.</div><div>I will tally the ballots an=
d report the results in P1144R1, which will appear in the post-San-Diego ma=
iling (submission deadline: 2018-11-26).</div></div></blockquote></div>
</blockquote></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CADvuK0L2p-Wuokn3%3D%3D6%2BkyE76dtvC7=
8JQuz6CNEc33t9yZ97GA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CADvuK0L2p-=
Wuokn3%3D%3D6%2BkyE76dtvC78JQuz6CNEc33t9yZ97GA%40mail.gmail.com</a>.<br />
--0000000000008937ba057b38c21f--
.
Author: oleerikp@gmail.com
Date: Thu, 22 Nov 2018 02:08:46 -0800 (PST)
Raw View
------=_Part_161_213444.1542881326983
Content-Type: multipart/alternative;
boundary="----=_Part_162_2073315132.1542881326984"
------=_Part_162_2073315132.1542881326984
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Monday, November 19, 2018 at 1:44:17 AM UTC+1, Arthur O'Dwyer wrote:
>
>
> > * RELOCATE is a bikeshed placeholder for a special member;
>> > * `default` means that the class is trivially relocatable if all its=
=20
>> bases
>> > and members are trivially relocatable, and otherwise is not (there is =
no
>> > way to "force" trivial relocatability);
>>
>> That I disagree with, though not strongly so.
>>
>
> I now strongly disagree with this, unless somebody can show me how to=20
> implement `std::optional<A>` so that it will inherit the trivial=20
> relocatability of `A`, without any "forcing." I have tried and failed wi=
th=20
> libc++'s optional.
> Part of the philosophical problem is that `optional` implements=20
> "destructibility" at a completely different level of the inheritance=20
> hierarchy than "move-constructibility." So in order to make all of=20
> `optional`'s base classes trivially relocatable, we essentially have to l=
ie=20
> to the compiler and pretend that e.g. __optional_destructible_base is=20
> "trivially relocatable" when in fact it's not. (In fact, because of the=
=20
> union, it is not even move-constructible! I think that is the *practical*=
=20
> problem I'm hitting.) I would strongly prefer to have the most derived=
=20
> class, `optional`, take responsibility for *all* of its behavior as a=20
> package deal, without having to saddle every base class with a=20
> [[maybe_trivially_relocatable]] attribute which is actually a lie in most=
=20
> cases.
>
> So, having investigated this [[maybe_trivially_relocatable]] attribute a=
=20
> little bit, I am currently of the opinion that we still need=20
> [[trivially_relocatable]] (with or without a boolean parameter, but in a=
=20
> form that is *not* dependent on the kindness of subobjects). At the same=
=20
> time, [[maybe_trivially_relocatable]] looks like it will make *some*=20
> classes, such as `vector`, a bit easier to write =E2=80=94 if also a bit =
more=20
> subtle in cases like that _LIBCPP_DEBUG situation.
>
> =E2=80=93Arthur
>
=20
I'm concerned that if we can't reach something close to consensus here, the=
=20
chances won't be much better in the committee.
A standard attribute that forces trivial relocatability regardless of=20
subobjects? That sounds like a non-starter to me. But the standard library=
=20
doesn't need to limit itself to using standard C++. std::optional could use=
=20
a compiler specific attribute, or specialize is_trivially_relocatable even=
=20
if users aren't allowed to do that.
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/186d1283-d16f-4245-bffc-a87082e6244a%40isocpp.or=
g.
------=_Part_162_2073315132.1542881326984
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br>On Monday, November 19, 2018 at 1:44:17 AM UTC+1, Arth=
ur O'Dwyer wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr=
"><div dir=3D"ltr"><br><div dir=3D"ltr"><div class=3D"gmail_quote"><blockqu=
ote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left-wid=
th:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-l=
eft:1ex">> * RELOCATE is a bikeshed placeholder for a special member;<br=
>
> * `default` means that the class is trivially relocatable if all its b=
ases<br>
> and members are trivially relocatable, and otherwise is not (there is =
no<br>
> way to "force" trivial relocatability);<br>
<br>
That I disagree with, though not strongly so.<br></blockquote><div><br></di=
v><div>I now strongly disagree with this, unless somebody can show me how t=
o implement `std::optional<A>` so that it will inherit the trivial re=
locatability of `A`, without any "forcing." =C2=A0I have tried an=
d failed with libc++'s optional.</div><div>Part of the philosophical pr=
oblem is that `optional` implements "destructibility" at a comple=
tely different level of the inheritance hierarchy than "move-construct=
ibility." So in order to make all of `optional`'s base classes tri=
vially relocatable, we essentially have to lie to the compiler and pretend =
that e.g. __optional_destructible_base is "trivially relocatable"=
when in fact it's not. =C2=A0(In fact, because of the union, it is not=
even move-constructible! I think that is the <i>practical</i> problem I=
9;m hitting.) =C2=A0I would strongly prefer to have the most derived class,=
`optional`, take responsibility for <i>all</i> of its behavior as a packag=
e deal, without having to saddle every base class with a [[maybe_trivially_=
relocatable]<wbr>] attribute which is actually a lie in most cases.</div><d=
iv><br></div><div>So, having investigated this [[maybe_trivially_relocatabl=
e]<wbr>] attribute a little bit, I am currently of the opinion that we stil=
l need [[trivially_relocatable]] (with or without a boolean parameter, but =
in a form that is=C2=A0<i><b>not</b></i> dependent on the kindness of subob=
jects).=C2=A0 At the same time, [[maybe_trivially_relocatable]<wbr>] looks =
like it will make <i>some</i> classes, such as `vector`, a bit easier to wr=
ite =E2=80=94 if also a bit more subtle in cases like that _LIBCPP_DEBUG si=
tuation.</div><div><br></div><div>=E2=80=93Arthur</div></div></div></div></=
div></div></div></div></div></blockquote><div>=C2=A0</div><div>I'm conc=
erned that if we can't reach something close to consensus here, the cha=
nces won't be much better in the committee.<br></div><div><br></div><di=
v>A standard attribute that forces trivial relocatability regardless of sub=
objects? That sounds like a non-starter to me. But the standard library doe=
sn't need to limit itself to using standard C++. std::optional could us=
e a compiler specific attribute, or specialize is_trivially_relocatable eve=
n if users aren't allowed to do that.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/186d1283-d16f-4245-bffc-a87082e6244a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/186d1283-d16f-4245-bffc-a87082e6244a=
%40isocpp.org</a>.<br />
------=_Part_162_2073315132.1542881326984--
------=_Part_161_213444.1542881326983--
.
Author: Chris Gunn <cwize1@gmail.com>
Date: Fri, 23 Nov 2018 23:05:51 -0800 (PST)
Raw View
------=_Part_665_533266609.1543043151386
Content-Type: multipart/alternative;
boundary="----=_Part_666_804736705.1543043151386"
------=_Part_666_804736705.1543043151386
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Out of interest, did you consider the alternative option of adding an=20
entirely new set of special functions?
Unfortunately, the existing r-value reference syntax didn't leave any room=
=20
for further extensions. But we could create an alternative syntax for=20
r-values references, like this:
void foo(T &rvalue bar);
Then this new syntax could then be extended for move+destroy:
void foo(T &deadvalue bar);
Also, it might be a good idea to allow multiple reference annotations to be=
=20
specified at the same time, for when the implementation of the r-value=20
reference function and destroy+move function are identical:
void foo(T &rvalue deadvalue bar);
Though, I have somewhat of an ulterior motive for making this suggestion.=
=20
Specifically, if we were to also add a similar reference annotation for=20
const references, like this:
void foo(T &constvalue bar);
Then we could also do this:
void foo(T &constvalue rvalue bar);
So that we could avoid annoying boilerplate when the const-reference and=20
r-value reference versions of a function can be identical.
That being said, this would be somewhat of a radical departure from=20
existing C++ syntax. And it would require creating new keywords. So I am=20
not sure it is a realistic suggestion. But it was fun to think about. :-)
On Sunday, 11 November 2018 17:35:40 UTC-8, Arthur O'Dwyer wrote:
>
> P1144R0 "Object relocation in terms of move plus destroy"=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>=20
> was presented to SG17 (EWGI) in San Diego. (Thanks to Corentin Jabot for=
=20
> trying to make it happen!) The paper lists the following straw polls that=
=20
> *could* have been taken. None of these polls were taken, and no feedback=
=20
> was given on the paper in San Diego.
>
> So I'd like to get *your* opinions! Please reply in this thread with=20
> your !votes on any or all of the following statements, in the traditional=
=20
> WG21 straw poll format: "Strongly For" the statement as written; "For" it=
;=20
> "Neutral" (as in, you considered the question and your expert opinion is=
=20
> that you are neutral on it =E2=80=94 please do not use this option as a s=
ynonym for=20
> *abstaining* due to *lack* of an opinion); "Against" the statement as=20
> written; or "Strongly Against" it.
>
> The polls will remain open for one week, until Sunday 2018-11-18. If you=
=20
> don't want your !votes to be public, you can always email them to me=20
> privately.
> I will tally the ballots and report the results in P1144R1, which will=20
> appear in the post-San-Diego mailing (submission deadline: 2018-11-26).
>
> Here are the polls. Please vote in any or all of them, but *only after=20
> reading the paper=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html>.*=
=20
> When a poll says "...as proposed in this paper," it's referring to the=20
> formal wording from P1144R0. You would have to read that formal wording t=
o=20
> know what's being asked!
> ---------------------------------------
>
> EWG1. We approve of the general idea that user-defined classes should be=
=20
> able to warrant their own trivial relocatability via a standard mechanism=
..
>
> EWG2. We approve of the general idea that user-defined classes which=20
> follow the Rule of Zero=20
> <https://web.archive.org/web/20130607234833/http://flamingdangerzone.com/=
cxx11/2012/08/15/rule-of-zero.html>=20
> should inherit the trivial relocatability of their bases and members.
>
> EWG3. Nobody should be able to warrant the trivial relocatability of clas=
s=20
> `C` except for class `C` itself (i.e., we do not want to see a=20
> customization point analogous to `std::hash`).
>
> EWG4. A class should be able to warrant its own trivial relocatability vi=
a=20
> the attribute `[[trivially_relocatable]]`, as proposed in this paper.
>
> EWG5. A class should be able to warrant its own trivial relocatability vi=
a=20
> some attribute, but not necessarily under that exact name.
>
> EWG6. A class should be able to warrant its own trivial relocatability as=
=20
> proposed in this paper, but we prefer to see a contextual keyword rather=
=20
> than an attribute.
>
> EWG7. If a trait with the semantics of `is_trivially_relocatable<T>` is=
=20
> added to the `<type_traits>` header, the programmer should be permitted t=
o=20
> specialize it for program-defined types (i.e., we want to see that trait=
=20
> itself become a customization point analogous to `std::hash`).
>
> EWG8. Trivial relocatability should be assumed by default. Classes such a=
s=20
> those in Appendix C=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#non=
-trivial-samples>=20
> should indicate their non-trivial relocatability via an opt-in mechanism.
>
> EWG9. To simplify conditionally trivial relocation=20
> <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sam=
ple-conditional>,=20
> if an attribute with the semantics of `[[trivially_relocatable]]` is adde=
d,=20
> it should take a boolean argument.
>
> LEWG10. The algorithm `uninitialized_relocate(first, last, d_first)`=20
> should be added to the `<memory>` header, as proposed in this paper.
>
> LEWG11. The type trait `is_relocatable<T>` should be added to the=20
> `<type_traits>` header, as proposed in this paper.
>
> LEWG12. If `is_relocatable<T>` is added, then we should also add=20
> `is_nothrow_relocatable<T>`, as proposed in this paper.
>
> LEWG13. The type trait `is_trivially_relocatable<T>` should be added to=
=20
> the `<type_traits>` header, under that exact name, as proposed in this=20
> paper.
>
> LEWG14. We approve of a trait with the semantics of=20
> `is_trivially_relocatable<T>`, but possibly under a different name. (For=
=20
> example, `is_bitwise_relocatable`.)
>
> LEWG15. If `is_trivially_relocatable<T>` is added, under that exact name,=
=20
> then the type trait `is_trivially_swappable<T>` should also be added to t=
he=20
> `<type_traits>` header.
>
> -----------------------
>
> Discussion and comments on P1144R0 is also welcome =E2=80=94 preferably i=
n the=20
> original discussion thread=20
> <https://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBw=
AJ>,=20
> or via private email, but if it winds up in this thread, I'm okay with th=
at.
>
> Thanks,
> Arthur
>
--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/050982cf-8b07-4703-a897-3f19e7f054ac%40isocpp.or=
g.
------=_Part_666_804736705.1543043151386
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Out of interest, did you consider the alternative opt=
ion of adding an entirely new set of special functions?</div><div><br></div=
><div>Unfortunately, the existing r-value reference syntax didn't leave=
any room for further extensions. But we could create an alternative syntax=
for r-values references, like this:</div><div><br></div><div style=3D"marg=
in-left: 40px;">void foo(T &rvalue bar);</div><div style=3D"margin-left=
: 40px;"><br></div><div>Then this new syntax could then be extended for mov=
e+destroy:</div><div><br></div><div style=3D"margin-left: 40px;">void foo(T=
&deadvalue bar);</div><div style=3D"margin-left: 40px;"><br></div><div=
>Also, it might be a good idea to allow multiple reference annotations to b=
e specified at the same time, for when the implementation of the r-value re=
ference function and destroy+move function are identical:</div><div><br></d=
iv><div style=3D"margin-left: 40px;">void foo(T &rvalue deadvalue bar);=
</div><div style=3D"margin-left: 40px;"><br></div><div>Though, I have somew=
hat of an ulterior motive for making this suggestion. Specifically, if we w=
ere to also add a similar reference annotation for const references, like t=
his:</div><div><br></div><div style=3D"margin-left: 40px;">void foo(T &=
constvalue bar);</div><div><br></div><div>Then we could also do this:</div>=
<div><br></div><div style=3D"margin-left: 40px;">void foo(T &constvalue=
rvalue bar);</div><div style=3D"margin-left: 40px;"><br></div><div>So that=
we could avoid annoying boilerplate when the const-reference and r-value r=
eference versions of a function can be identical.</div><br><div>That being =
said, this would be somewhat of a radical departure from existing C++ synta=
x. And it would require creating new keywords. So I am not sure it is a rea=
listic suggestion. But it was fun to think about. :-)<br></div><br>On Sunda=
y, 11 November 2018 17:35:40 UTC-8, Arthur O'Dwyer wrote:<blockquote c=
lass=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px=
#ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><a href=3D"http://www=
..open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html" target=3D"_blan=
k" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com/u=
rl?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%=
2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWtoE=
1XzwyGq8CvGsJpA';return true;" onclick=3D"this.href=3D'http://www.g=
oogle.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdoc=
s%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHr=
uSIPUznWtoE1XzwyGq8CvGsJpA';return true;">P1144R0 "Object relocati=
on in terms of move plus destroy"</a> was presented to SG17 (EWGI) in =
San Diego. (Thanks to Corentin Jabot for trying to make it happen!) The pap=
er lists the following straw polls that <i><b>could</b></i> have been taken=
.. None of these polls were taken, and no feedback was given on the paper in=
San Diego.</div><div><br></div><div>So I'd like to get <i>your</i> opi=
nions! =C2=A0Please reply in this thread with your !votes on any or all of =
the following statements, in the traditional WG21 straw poll format: "=
Strongly For" the statement as written; "For" it; "Neut=
ral" (as in, you considered the question and your expert opinion is th=
at you are neutral on it =E2=80=94 please do not use this option as a synon=
ym for=C2=A0<i>abstaining</i> due to <i>lack</i> of an opinion); "Agai=
nst" the statement as written; or "Strongly Against" it.</di=
v><div><br></div><div>The polls will remain open for one week, until Sunday=
2018-11-18. If you don't want your !votes to be public, you can always=
email them to me privately.</div><div>I will tally the ballots and report =
the results in P1144R1, which will appear in the post-San-Diego mailing (su=
bmission deadline: 2018-11-26).</div><div><br></div><div>Here are the polls=
.. Please vote in any or all of them, but <b>only after <a href=3D"http://ww=
w.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html" target=3D"_bla=
nk" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com/=
url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers=
%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHruSIPUznWto=
E1XzwyGq8CvGsJpA';return true;" onclick=3D"this.href=3D'http://www.=
google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdo=
cs%2Fpapers%2F2018%2Fp1144r0.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH=
ruSIPUznWtoE1XzwyGq8CvGsJpA';return true;">reading the paper</a>.</b> W=
hen a poll says "...as proposed in this paper," it's referrin=
g to the formal wording from P1144R0. You would have to read that formal wo=
rding to know what's being asked!</div><div>---------------------------=
---<wbr>---------</div><div><br></div><div>EWG1. We approve of the general =
idea that user-defined classes should be able to warrant their own trivial =
relocatability via a standard mechanism.</div><div><br></div><div>EWG2. We =
approve of the general idea that user-defined classes which follow the <a h=
ref=3D"https://web.archive.org/web/20130607234833/http://flamingdangerzone.=
com/cxx11/2012/08/15/rule-of-zero.html" target=3D"_blank" rel=3D"nofollow" =
onmousedown=3D"this.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F=
%2Fweb.archive.org%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.=
com%2Fcxx11%2F2012%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x2=
6usg\x3dAFQjCNG0-oV_GpdnIP-4dWgeb4q0MdCEvA';return true;" onclick=3D"th=
is.href=3D'https://www.google.com/url?q\x3dhttps%3A%2F%2Fweb.archive.or=
g%2Fweb%2F20130607234833%2Fhttp%3A%2F%2Fflamingdangerzone.com%2Fcxx11%2F201=
2%2F08%2F15%2Frule-of-zero.html\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNG0-=
oV_GpdnIP-4dWgeb4q0MdCEvA';return true;">Rule of Zero</a> should inheri=
t the trivial relocatability of their bases and members.</div><div><br></di=
v><div>EWG3. Nobody should be able to warrant the trivial relocatability of=
class `C` except for class `C` itself (i.e., we do not want to see a custo=
mization point analogous to `std::hash`).</div><div><br></div><div>EWG4. A =
class should be able to warrant its own trivial relocatability via the attr=
ibute `[[trivially_relocatable]]`, as proposed in this paper.</div><div><br=
></div><div>EWG5. A class should be able to warrant its own trivial relocat=
ability via some attribute, but not necessarily under that exact name.</div=
><div><br></div><div>EWG6. A class should be able to warrant its own trivia=
l relocatability as proposed in this paper, but we prefer to see a contextu=
al keyword rather than an attribute.</div><div><br></div><div>EWG7. If a tr=
ait with the semantics of `is_trivially_relocatable<T>` is added to t=
he `<type_traits>` header, the programmer should be permitted to spec=
ialize it for program-defined types (i.e., we want to see that trait itself=
become a customization point analogous to `std::hash`).</div><div><br></di=
v><div>EWG8. Trivial relocatability should be assumed by default. Classes s=
uch as those in <a href=3D"http://www.open-std.org/jtc1/sc22/wg21/docs/pape=
rs/2018/p1144r0.html#non-trivial-samples" target=3D"_blank" rel=3D"nofollow=
" onmousedown=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F=
%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.h=
tml%23non-trivial-samples\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IY=
Ic7NQLChnFEyQ6nVN7A';return true;" onclick=3D"this.href=3D'http://w=
ww.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg21%2=
Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23non-trivial-samples\x26sa\x3dD\x26sn=
tz\x3d1\x26usg\x3dAFQjCNHR7eXJ5IYIc7NQLChnFEyQ6nVN7A';return true;">App=
endix C</a> should indicate their non-trivial relocatability via an opt-in =
mechanism.</div><div><br></div><div>EWG9. To simplify <a href=3D"http://www=
..open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1144r0.html#sample-condition=
al" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http=
://www.google.com/url?q\x3dhttp%3A%2F%2Fwww.open-std.org%2Fjtc1%2Fsc22%2Fwg=
21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23sample-conditional\x26sa\x3dD\x2=
6sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96leOeCAJ5_EdtQ';return true;" =
onclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp%3A%2F%2Fwww=
..open-std.org%2Fjtc1%2Fsc22%2Fwg21%2Fdocs%2Fpapers%2F2018%2Fp1144r0.html%23=
sample-conditional\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGGuiHGVkvG3DD96l=
eOeCAJ5_EdtQ';return true;">conditionally trivial relocation</a>, if an=
attribute with the semantics of `[[trivially_relocatable]]` is added, it s=
hould take a boolean argument.</div><div><br></div><div>LEWG10. The algorit=
hm `uninitialized_relocate(first, last, d_first)` should be added to the `&=
lt;memory>` header, as proposed in this paper.</div><div><br></div><div>=
LEWG11. The type trait `is_relocatable<T>` should be added to the `&l=
t;type_traits>` header, as proposed in this paper.</div><div><br></div><=
div>LEWG12. If `is_relocatable<T>` is added, then we should also add =
`is_nothrow_relocatable<T>`, as proposed in this paper.</div><div><br=
></div><div>LEWG13. The type trait `is_trivially_relocatable<T>` shou=
ld be added to the `<type_traits>` header, under that exact name, as =
proposed in this paper.</div><div><br></div><div>LEWG14. We approve of a tr=
ait with the semantics of `is_trivially_relocatable<T>`, but possibly=
under a different name. (For example, `is_bitwise_relocatable`.)</div><div=
><br></div><div>LEWG15. If `is_trivially_relocatable<T>` is added, un=
der that exact name, then the type trait `is_trivially_swappable<T>` =
should also be added to the `<type_traits>` header.</div><div><br></d=
iv><div>-----------------------</div><div><br></div><div>Discussion and com=
ments on P1144R0 is also welcome =E2=80=94 preferably=C2=A0<a href=3D"https=
://groups.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ" targ=
et=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'https://grou=
ps.google.com/a/isocpp.org/d/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ';return =
true;" onclick=3D"this.href=3D'https://groups.google.com/a/isocpp.org/d=
/msg/sg14/6mAbZOTdVjk/wYaO5wQzBwAJ';return true;">in the original discu=
ssion thread</a>, or via private email, but if it winds up in this thread, =
I'm okay with that.</div><div><br></div><div>Thanks,</div><div>Arthur</=
div></div></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/050982cf-8b07-4703-a897-3f19e7f054ac%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/050982cf-8b07-4703-a897-3f19e7f054ac=
%40isocpp.org</a>.<br />
------=_Part_666_804736705.1543043151386--
------=_Part_665_533266609.1543043151386--
.
Author: Thiago Macieira <thiago@macieira.org>
Date: Sat, 24 Nov 2018 09:31:38 -0800
Raw View
On Friday, 23 November 2018 23:05:51 PST Chris Gunn wrote:
> Unfortunately, the existing r-value reference syntax didn't leave any room
> for further extensions. But we could create an alternative syntax for
> r-values references, like this:
>
> void foo(T &rvalue bar);
>
> Then this new syntax could then be extended for move+destroy:
>
> void foo(T &deadvalue bar);
Before we talk about syntax, we have to talk about why we would need it. Can
you describe what could be done with this syntax that cannot under what has
been proposed so far, with just traits and attributes?
I think it boils down to the question of whether we need to have a non-trivial
relocate operation that is faster than move + destroy.
--
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
Software Architect - Intel Open Source Technology Center
--
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/46763742.jusMnzpLIY%40tjmaciei-mobl1.
.