Caml1999I037uv (Parmatch-parmatch_caseZ;'pattern@@A'pattern@@ 3typing/parmatch.mli\\@@E@)has_guard@@$boolE@@@]]@@#F@,needs_refute@@@@@~^^@@/G@@@A@Y@@@@@![bb"b.1@@@@5D@A@*typed_case[@)Typedtree$case(category@@@@I/general_pattern@@@@@@@@@DfyyEfy@@XI@@,untyped_case\@)Parsetree$case@@@ 'pattern@@@@@@@@@agbg@@uL@@-const_compare]@(Asttypes(constant@@@@ (constant@@@#intA@@@@@@@@ii(@@M@@&le_pat^@`'pattern@@@@g'pattern@@@@@@@@@@@pp@@N@@'le_pats_@$listK'pattern@@@@@@@'pattern@@@@@@@@@@@@@@sQQsQ@@O@@Ӡ&Compat`@@%equalq@*Data_types7constructor_description@@@y@ 7constructor_description@@@z@@@{@@|@@}@z D J}  @@P@@@&compatr@'pattern@@@m@'pattern@@@n@@@o@@p@@q@    @@Q@@'compatss@j'pattern@@@r@@@s@v'pattern@@@t@@@u@@@v@@w@@x@+@  ,@  D@@?R@@@@/w  0A E M@CS@@@ %Emptya##exnG@@@A&_none_@@A@PT@B@#lubb@'pattern@@@@"'pattern@@@''pattern@@@@@@@@XE ` `YE ` @@lU@@$lubsc@;'pattern@@@@@@@ȠG'pattern@@@@@@ҠQ'pattern@@@@@@@@@@@I  I  J@@V@@(get_minsd@@!a@@@@@@@@@@@@@@@@@@@@@M  M  @@W@@(set_argse@'pattern@@@@'pattern@@@@@@'pattern@@@@@@@@@@@S a aS a @@X@@-pat_of_constrf@'pattern@@@@7constructor_description@@@'pattern@@@@@@@@U  U  @@Y@@0complete_constrsg@,pattern_data7constructor_description@@@@@@@Z'7constructor_description@@@@@@d17constructor_description@@@@@@@@@@@V  Y B b@@)Z@@,pats_of_typeh@#Env!t@@@@%Types)type_expr@@@ 'pattern@@@@@@@@@@@<f33=f3h@@P^@@1pressure_variantsi@'!t@@@@''pattern@@@@@@$unitF@@@@@@@@_hjj`i@@s_@@ (pressure_variants_in_computation_patternj@J!t@@@@ˠJ/general_patternO+computation@@@@@@@@@)@@@@@@@@jk@@`@@-check_partialk@@g'pattern@@@&optionLr'pattern@@@@@@@@@(Location!t@@@@ {z%value@@@@@@@@@@@@'partial@@@@@@@@@@tv@@a@@,check_unusedl@@@@@@'pattern@@@H'pattern@@@@@@@@@@@E%value@@@@@@@@@@@@@@@@@@@@xy]@@b@@+irrefutablem@'pattern@@@ @@@@@@|zz|z@@+c@@(inactiven'partial'partial@@@@'pattern@@@'@@@@@@@@45@@Hd@@8check_ambiguous_bindingso@$case%value@@@@@@@@@@@@@@@ST@@ge@@0some_private_tagp%label@@@@addbd@@uf@@@V(Parmatch07~Oo(Warnings0mJɒkgrs-Stdlib__Uchar056uf4[_+Stdlib__Sys0 -ռ鱦s5/.Stdlib__String0Vê>)Longident0s `7mɕc(Location0a7cK_H%9)Load_path0I@18 ~,Identifiable0 {d\FX'`%Ident0">WA+9*X*Format_doc0]mWϓ:Mݠ#Env0zV L{YWI*Data_types0I'Ue`wq]Ѡ*Cmi_format0c˯7͗ԩmݠ0CamlinternalLazy0&͂7 Pˆ8CamlinternalFormatBasics0%FU(Q/Tu5Build_path_prefix_map0z HkGs(Asttypes0>n{T8cئ@@@Caml1999T037l/EA3C(Parmatch*ocaml.text&_none_@@A 6 Detection of partial matches and unused match cases. 3typing/parmatch.mliP77P7r@@@@@@3@@@@@@#intA;@@@A@@@@@:@A@$charB;@@A@@@@@>@A@&stringQ;@@ A@@@@@B@@@%bytesC;@@ A@@@@@F@@@%floatD;@@A@@@@@J@@@$boolE;@@%falsec@@T@$trued@@Z@@@A@@@@@[@A@$unitF;@@"()e@@e@@@A@@@@@f@A@ #exnG;@@@A@@@@@j@@@#effH;@@O@A@A@@@@@@s@@@,continuationI;@@Q@@P@B@A@nY@@@@@@@@@%arrayJ;@@R@A@A@@@@@@@@@ $listK;@@S@A"[]f@@@"::g@@@T@@@ @@A@Y@@@@@@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@A@@@@@@@@%int32N;@@A@@@@@@@@%int64O;@@A@@@@@@@@&lazy_tP;@@X@AJA@Y@@@@@@@@5extension_constructorR;@@A@@@@@@@@*floatarrayS;@@A@@@@@@@@&iarrayT;@@Y@A[A@Y@@@@@@@@*atomic_locU;@@Z@AdA@@@@@@@@@.Assert_failure`#@@@@@J@@@@@@@@[@@A=ocaml.warn_on_literal_pattern @ @0Division_by_zero]#@@@A  @+End_of_file\#$@@@A@'FailureY#,@'@@A!$$@0Invalid_argumentX#5@0@@A*$-#-@-Match_failureV#>@@=@9@;@@a@@A;5>4>@)Not_foundZ#O@@@AC=F<F@-Out_of_memoryW#W@@@AKENDN@.Stack_overflow^#_@@@ASMVLV@.Sys_blocked_io_#g@@@A[U^T^@)Sys_error[#o@j@@Ad^g]g@:Undefined_recursive_modulea#x@@w@s@u@@h@@Auoxnx@:Continuation_already_takenb#@@@A}wv@&Stdlib@Axࠐ(Asttypes(AsttypesRtyRt@@A3@ @ARtt@@@ࠐ)Typedtree)TypedtreeSS@@A3@ @AS@@@ࠐ%Types%TypesTT@@A3@ @AT@@@ࠐ*Data_types*Data_typesUU@@A3@ @AU@@@A+-parmatch_caseA[bp[b}@А'pattern@-3@;@@,@A@A@G@B@@@[bbb.1@)ocaml.doc󐠠 Most checks in this file need not access all information about a case, and just need a few pieces of information. [parmatch_case] is those few pieces of information. WZ_a@@@@@@@@@ D@@A[bg[bo@@BA@;&@A'pattern@@-B@.\\@@E@)has_guard@@@@@2 ]]@@&F@,needs_refute@@@@@5^^@9 ] true if the program text claims the case is unreachable, a la [function _ -> .] '_(a'-@@@@@@@@G@@@A@Y@@@@@MJ@@:@#3301\@/@@Ш@А'pattern9a8\9\@@>@@/f@<@#883@]@2@@Ш@г;$boolI]J]@@Cu@@F@@3x@B@#>>9R^@*@@Ш@гA$bool[^\^@@I@@L@@6@H~pFE@EE@@@E@E@@A@{@@@@@@@@+*typed_caseBd3Bd3L@А(category@D3@@Ad38d3A@@@; @A@AΠ /general_patternC@E@@@G@@@I@@@@@d33d3w@@@@H@@@Aг-parmatch_cased3j @гd3Zd3i@А(category0d3Pd3Y@@@&3 @@@+4@@@@5@*typed_casefy}fy@б@г@$casefyfy@А(category@rC@k3@UdQ@Afyfy@@@ @@@m @@гo*typed_casefyfy@А(categoryfyfy@@@"@@@o @@@@@p!@@@fyy@@I@@@@',untyped_caseS gg@б@г)Parsetree$case)Parsetreegg@ "g#g@@@@@@3%$$%%%%%@Kf*@A @@гf-parmatch_case2g3g@г$'pattern)Parsetree@gAg@ DgEg@@@@@@" @@@ @@@'@@@-@@*5 @@@Ug#@@mL@@%@@0-const_compareT`iai @б@г(constantki li@@ @@@3mllmmmmm@Ii@A@@б@г(constant|i}i!@@ @@@@@г\#inti%i(@@ @@@@@@@@!@@@'@@$* @@@i@ [const_compare c1 c2] compares the actual values represented by [c1] and [c2], while simply using [Stdlib.compare] would compare the representations. cf. MPR#5758 j))n@@@@@@@M@@@@@@@@@C&le_patUpp@б@г3'patternpp@@ @@@3@\q8@A@@б@гD'patternpp@@ @@@@@г$boolpp@@ @@@@@@@@!@@@'@@$* @@@p@ A [le_pat p q] means: forall V, V matches q implies V matches p q  q O@@@@@@@N@@@!@@@@@@C'le_patsVsQUsQ\@б@г$list!sQg"sQk@г'pattern+sQ_,sQf@@ @@@3-,,-----@f{B@A@@@ @@@ @@б@г$listAsQwBsQ{@г'patternKsQoLsQv@@ @@@ @@@@@@% @@г$bool]sQ^sQ@@ @@@2@@@@@5@@@5@@8> @@@ksQQ@ F [le_pats (p1 .. pm) (q1 .. qn)] means: forall i <= m, [le_pat pi qi] xtyt@@@@@@@O@@@@@@@@@W&CompatZCw  $w  *@S@@Т@@y 7 <y 7 =@Б%equalWz D Nz D S@б@г7constructor_description*Data_types{ V `{ V j@ { V k{ V @@@@@@3@X@A @@б@г7constructor_description*Data_types|  |  @ |  |  @@@@@@ @@г$bool}  }  @@ @@@'@@@@@*@@@0@@-8 @@@z D J@@P@@@@3@R@@3@6T @A3@8@Ay 7 @~  @@Б&compatX    @б@г~'pattern    @@ @@@3@W@A@@б@г'pattern!  "  @@ @@@@@г점$bool.  /  @@ @@@@@@@@ @@@&@@#) @@@<  @@TQ@@@@)'compatsYG@  H@  @б@гΠ$listR@  (S@  ,@г'pattern\@  ]@  '@@ @@@3^]]^^^^^@a)@A@@@ @@@ @@б@г$listr@  8s@  <@г'pattern|@  0}@  7@@ @@@ @@@@@@% @@гL$bool@  @@  D@@ @@@2@@@@@5@@@5@@8> @@@@  @@R@@@@>@g@` @@3@Cb @A3@@A~  A E M@@@y 7 ;@@ F Exported compatibility functor, abstracted over constructor equality vv @@@@@@@w  @@%Empty[DC O YC O ^@#@@@AC O O@@T@@@@@@3@H@@8@@@E@@0/@//@@@/@/@,V@A @#lub\E ` dE ` g@б@гj'patternE ` jE ` q@@ @@@3@1?9@A@@б@г{'patternE ` uE ` |@@ @@@@@г'patternE ` E ` @@ @@@@@@@@!@@@'@@$* @@@)E ` `@H [lub p q] is a pattern that matches all values matched by [p] and [q]. May raise [Empty], when [p] and [q] are not compatible. 6F  7G  @@@@@@@OU@@@XJ@@@@@@C$lubs]MI  NI  @б@гԠ$listXI  &YI  *@г'patternbI  cI  %@@ @@@3dccddddd@f{B@A@@@ @@@ @@б@г$listxI  6yI  :@г'patternI  .I  5@@ @@@ @@@@@@% @@г$listI  FI  J@г 'patternI  >I  E@@ @@@ <@@@@@@ A @@@#@@ D*@@@D@@ GM@@@I  @А [ [lubs [p1; ...; pn] [q1; ...; qk]], where [n < k], is [[lub p1 q1; ...; lub pk qk]]. J K KK  @@@@@@@V@@-@Ґ@@@@@@f(get_mins^M  M  @б@б@А!a@E@3@}6@AM  M  @@б@А!a M  M  @@г$boolM  M  @@ @@@@@@!@@@@@$@@ @@б@г$list M   M  @А!a4/M  M  @@@:@@@6 @@г$list!M  "M  @А!aID(M  )M  @@@O@@@K @@@@@N@@@4@@Q5M  @@@8M  @@PW@@@@X(set_args_CS a eDS a m@б@г'patternNS a pOS a w@@ @@@3POOPPPPP@q@A@@б@г۠$list_S a `S a @г'patterniS a {jS a @@ @@@@@@@@@  @@г$list{S a |S a @г'patternS a S a @@ @@@7@@@@@@ < @@@#@@!?*@@@E@@"BH@@@S a a@ u This function recombines one pattern and its arguments: For instance: (_,_)::p1::p2::rem -> (p1, p2)::rem O  R ^ `@@@@@@@X@@-@@@@@@@a-pat_of_constr`U  U  @б@г4'patternU  U  @@ @@@#3@z8@A@@б@г7constructor_descriptionU  U  @@ @@@$@@гR'patternU  U  @@ @@@%@@@@@&!@@@'@@'$* @@@U  @@ Y@@@@*0complete_constrsaV  V  @б@гv,pattern_data W   W  @гZ7constructor_descriptionW  W  @@ @@@(3@Mb)@A@@@ @@@* @@б@г$list)X  :*X  >@гz7constructor_description3X  "4X  9@@ @@@+ @@@@@@-% @@г$listEY B ^FY B b@г7constructor_descriptionOY B FPY B ]@@ @@@.<@@@@@@0A @@@#@@1D*@@@D@@2GM@@@bV  @@zZ@@@@M,pats_of_typemf37nf3C@б@г#Env!t#Env~f3Ff3I@ f3Jf3K@@@@@@" 3@q*@A @@б@г)type_exprf3Of3X@@ @@@"!@@г$listf3df3h@г'patternf3\f3c@@ @@@""(@@@@@@"$- @@@"@@"%0%@@@6@@"&3>@@@f33@ݐ  [pats_of_type] builds a list of patterns from a given expected type, for explosion of wildcard patterns in Typecore.type_pat. There are four interesting cases: - the type is empty ([]) - no further explosion is necessary ([Pat_any]) - a single pattern is generated, from a record or tuple type or a single-variant type ([tp]) - a list of patterns, in the case that all branches are GADT constructors ([tp1; ..; tpn]). [ d de/2@@@@@@@^@@-@ߐ@@@@@@R1pressure_variantshjnhj@б@гu!t#Envii@ ii@@@@@@"'3@tA@A @@б@г$list i i@г~'pattern i i@@ @@@"(@@@@@@"*  @@гР$unit #i $i@@ @@@"+-@@@@@",0@@@6@@"-3> @@@ 1hjj@@ I_@@@@9 (pressure_variants_in_computation_pattern <j =j@б@г!t#Env Kk Lk@  Ok Pk@@@@@@".3 R Q Q R R R R R@[y(@A @@б@гݠ$list ak bk@г/general_pattern kk lk@г+computation uk vk@@ @@@"/%@@@@@@"1* @@@&@@@"3/#@@г 9$unit k k@@ @@@"4<@@@@@"5? @@@E@@"6BM @@@ j@@ `@@@@H-check_partialN t t@б@б@г'pattern u u@@ @@@"73        @c!@A@@г &option u u@г8'pattern u u@@ @@@"8@@@@@@": @@@$@@";!'@@б@г(Location!t(Location u u@  u u@@@@@@%; @@б@г x$list u u@г*typed_case u u@г}%value u u@@ @@@%^@@@@@@%c @@@&@@@%h#@@г'partial 'v (v@@ @@@%u@@@@@%x @@@C@@%{K @@@_@@%~ 6u@@@ 9t@X  [check_partial pred loc caselist] and [check_unused refute pred caselist] are called with a function [pred] which will be given counter-example candidates: they may be partially ill-typed, and have to be type-checked to extract a valid counter-example. [pred] returns a valid counter-example or [None]. [refute] indicates that [check_unused] was called on a refutation clause.  Fm Gs@@@@@@@ _a@@"@h Z@@@@@@,check_unusedO ]x ^x@б@б@г ($bool jy ky@@ @@@%3 l k k l l l l l@:@A@@б@г'pattern {y" |y)@@ @@@%@@г 砐&option y5 y;@г'pattern y- y4@@ @@@%(@@@@@@%- @@@"@@%0%@@@6@@%39@@б@г ($list yQ yU@г6*typed_case yF yP@г -%value y@ yE@@ @@@%V@@@@@@%[ @@@&@@@%`#@@г $unit yY y]@@ @@@%m@@@@@%p @@@B@@%s y @@@ x@@ b@@@@z+irrefutableP |z~ |z@б@г i'pattern |z |z@@ @@@%3        @@A@@г ɠ$bool |z |z@@ @@@%@@@@@%@@@ |zz @@ .c@@ @@(inactiveQ ! "@б'partialг 'partial . /@@ @@@%3 0 / / 0 0 0 0 0@3H!@A@@б@г 'pattern ? @@@ @@@%@@г $bool L M@@ @@@%@@@@@%!@@2'@@%$ X @@@ [@ z An inactive pattern is a pattern, matching against which can be duplicated, erased or delayed without change in observable behavior of the program. Patterns containing (lazy _) subpatterns or reads of mutable fields are active.  h~ i@@@@@@@ d@@@  |@@@@@@D8check_ambiguous_bindingsR  @б@г $list   @г $case   @г %value  @@ @@@%3        @qL@A@@@ @@@% @@@(@@@% %@@г d$unit  @@ @@@%@@@@@%"@@@  @@ e@@ @@"0some_private_tagS dh dx@г V%label d{ d@@ @@@%3        @9b@A@@@ dd @@ f@@ @@@ ; @A @@  @  @@ @@@% @  @@ @@@%   @@A@  @@  @@ A@ 2@ m - $@@@% m l -@@@%@@@%@%@@%@ @ @ @@@@%@@@%@@@%@@%@@@@ @@@%@ @@@%@@@%@@%@@%@@v@ q@@@%@ f@@@%]@@@%@@%@@%@LJ<@-@( !@@@%@@@%@  @@@%@@@%@@@%@@%@@%@@@@T@@@@%@@@@%@@@%@@%@@%@@@@qU@ m@@@%@ c@@@%Z@@@%@@%@@%@I@G@CV@? 8@@@%@@@%@) "@@@%@@@%@@@%@@%@@%@@@@ @@# @@@A@B@@ @@@%@ "@@@% &@@@%@@%@@%@~@o@j 2c@@@%@@@%@T <M@@@%@@@%@ D9@@@%@@@%@@%@@%@%#@@@@@@@%@@%@@%@ޠ@@@%͠ @@@%@@%@@%@@@@ d@@@%@ m@@@%@@@% u@@@%@@@%@@%@@%@om_@P@ K@@@&@ _@@@@% 7@@@%@@%@@%@'@%@!@  p@@@&@@@&@ z@@@&@@@& @@@&@@@&@@&@@&@@@@@@@&@ @@@&  @@@& @@@& @@& @@& @@t@on@@@&@[ T@@@&@@@&G@@@&@@&@@&@6@4@0@+*@@@&@   @@@&@@@&@@@&@@@&@@&@@&@@@@@ @@@&)Ҡ @@@&(@@@&'@@&&@@@@&%@   @@@&"@@@&$@@@&#@&!@@@&  "@@@&@@&@@&@@&@zxj@[@@V@@@&7@ 2J@@@&6A 9:@@@&5@@@&4@@&3@@&2@' > = K@@@&/@@@&1@@@&0@&.@@@&-@@@&,@@&+@@&*@@@@ Z@@@&:@@@&9@@&8@@@ f@@@&?@ l@@@&>@@@&=@@&<@@&;@@@ {z t@@@&D@@@&C@@@&Ba@@@&A@@&@@S@Q@M H@@@&E@<@:@@3@AT?@A@ H************************************************************************!A@@"A@L@ H 'BMM(BM@ H OCaml -C.C@ H 3D4D3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt 9E44:E4@ H ?F@F@ H Copyright 1996 Institut National de Recherche en Informatique et EGFG@ H en Automatique. KHLHg@ H QIhhRIh@ H All rights reserved. This file is distributed under the terms of WJXJ@ H the GNU Lesser General Public License version 2.1, with the ]K^KN@ H special exception on linking described in the file LICENSE. cLOOdLO@ H iMjM@ H************************************************************************oNpN5@ 7* Detection of partial matches and unused match cases. u * Most checks in this file need not access all information about a case, and just need a few pieces of information. [parmatch_case] is those few pieces of information.  ^* true if the program text claims the case is unreachable, a la [function _ -> .]  T * [const_compare c1 c2] compares the actual values represented by [c1] and [c2], while simply using [Stdlib.compare] would compare the representations. cf. MPR#5758  ڠ B* [le_pat p q] means: forall V, V matches q implies V matches p  G* [le_pats (p1 .. pm) (q1 .. qn)] means: forall i <= m, [le_pat pi qi]  G* Exported compatibility functor, abstracted over constructor equality ̠ * [lub p q] is a pattern that matches all values matched by [p] and [q]. May raise [Empty], when [p] and [q] are not compatible. T \* [lubs [p1; ...; pn] [q1; ...; qk]], where [n < k], is [[lub p1 q1; ...; lub pk qk]]. Ϡ v* This function recombines one pattern and its arguments: For instance: (_,_)::p1::p2::rem -> (p1, p2)::rem 렠 * [pats_of_type] builds a list of patterns from a given expected type, for explosion of wildcard patterns in Typecore.type_pat. There are four interesting cases: - the type is empty ([]) - no further explosion is necessary ([Pat_any]) - a single pattern is generated, from a record or tuple type or a single-variant type ([tp]) - a list of patterns, in the case that all branches are GADT constructors ([tp1; ..; tpn]). Ƞ * [check_partial pred loc caselist] and [check_unused refute pred caselist] are called with a function [pred] which will be given counter-example candidates: they may be partially ill-typed, and have to be type-checked to extract a valid counter-example. [pred] returns a valid counter-example or [None]. [refute] indicates that [check_unused] was called on a refutation clause. P6 Irrefutability tests {__{_y@ * An inactive pattern is a pattern, matching against which can be duplicated, erased or delayed without change in observable behavior of the program. Patterns containing (lazy _) subpatterns or reads of mutable fields are active. 75 Ambiguous bindings. @ F The tag used for open polymorphic variant types with an abstract row c@@-./boot/ocamlc)-nostdlib"-I&./boot*-use-prims2runtime/primitives"-g0-strict-sequence*-principal(-absname"-w8+a-4-9-40-41-42-44-45-48+-warn-error"+a*-bin-annot/-strict-formats"-I&typing"-I%utils"-I'parsing"-I&typing"-I(bytecomp"-I,file_formats"-I&lambda"-I*middle_end"-I2middle_end/closure"-I2middle_end/flambda"-I=middle_end/flambda/base_types"-I'asmcomp"-I&driver"-I(toplevel"-I%tools"-I'runtime"-I1otherlibs/dynlink"-I-otherlibs/str"-I4otherlibs/systhreads"-I.otherlibs/unix"-I8otherlibs/runtime_events"-c =/builds/workspace/precheck/flambda/false/label/ocaml-linux-32 >10/.-,+*)('&%$#"! @@0gyoj2suZyT3@@@ 0>n{T8cئ5Build_path_prefix_map0z HkGs8CamlinternalFormatBasics0%FU(Q/Tu0CamlinternalLazy0&͂7 Pˆ*Cmi_format0c˯7͗ԩmݠ*Data_types0I'Ue`wq]Ѡ#Env0zV L{YWI*Format_doc0]mWϓ:Mݠ%Ident0">WA+9*X,Identifiable0 {d\FX'`)Load_path0I@18 ~(Location0a7cK_H%9)Longident0s `7mɕc$Misc0ob]6>Vê>+Outcometree0kX%d5Q/+f07~Oo)Parsetree0T鿁ۘ7Qu$Path0Y2kf֯J._Ϡ)Primitive0²~$xzT෠%Shape0oNՄBH&Stdlib0Lku]8_٠.Stdlib__Buffer08APF< t..Stdlib__Digest0l!LHgErζ .Stdlib__Domain0:M;׉<O$Ġ.Stdlib__Either0Vy`u~c à.Stdlib__Format0ܚ#G7m|/Stdlib__Hashtbl0ѱN][/!,Stdlib__Lazy0* -S$.)"0D.Stdlib__Lexing0e<.V +Stdlib__Map0L5xE|O0~,J-.Stdlib__Result06 ]/J+Stdlib__Seq0nwzG&amg+Stdlib__Set0\$;7 .Stdlib__String0s.Type_immediacy0A^abOhՠ.0ekG |t%Types0^Y~# )Unit_info0ڀh%(/Value_rec_types0`4xiVC(Warnings0mJɒkgr