vanilla-wow-addons – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | ------------------------------------------------------------------------------------------------------ |
2 | -- Necrosis LdC |
||
3 | -- |
||
4 | -- Créateur initial (US) : Infernal (http://www.revolvus.com/games/interface/necrosis/) |
||
5 | -- Implémentation de base (FR) : Tilienna Thorondor |
||
6 | -- Reprise du projet : Lomig & Nyx des Larmes de Cenarius, Kael'Thas |
||
7 | -- |
||
8 | -- Skins et voix Françaises : Eliah, Ner'zhul |
||
9 | -- Version Allemande par Arne Meier et Halisstra, Lothar |
||
10 | -- Remerciements spéciaux pour Sadyre (JoL) |
||
11 | -- Version 28.06.2006-1 |
||
12 | ------------------------------------------------------------------------------------------------------ |
||
13 | |||
14 | |||
15 | |||
16 | ------------------------------------------------------------------------------------------------------ |
||
17 | -- FONCTION D'INITIALISATION |
||
18 | ------------------------------------------------------------------------------------------------------ |
||
19 | |||
20 | function Necrosis_Initialize() |
||
21 | |||
22 | -- Initilialisation des Textes (VO / VF / VA) |
||
23 | if NecrosisConfig ~= {} then |
||
24 | if (NecrosisConfig.NecrosisLanguage == "enUS") or (NecrosisConfig.NecrosisLanguage == "enGB") then |
||
25 | Necrosis_Localization_Dialog_En(); |
||
26 | elseif (NecrosisConfig.NecrosisLanguage == "deDE") then |
||
27 | Necrosis_Localization_Dialog_De(); |
||
28 | else |
||
29 | Necrosis_Localization_Dialog_Fr(); |
||
30 | end |
||
31 | elseif GetLocale() == "enUS" or GetLocale() == "enGB" then |
||
32 | Necrosis_Localization_Dialog_En(); |
||
33 | elseif GetLocale() == "deDE" then |
||
34 | Necrosis_Localization_Dialog_De(); |
||
35 | else |
||
36 | Necrosis_Localization_Dialog_Fr(); |
||
37 | end |
||
38 | |||
39 | |||
40 | -- On initialise ! Si le joueur n'est pas Démoniste, on cache Necrosis (chuuuut !) |
||
41 | -- On indique aussi que Nécrosis est initialisé maintenant |
||
42 | if UnitClass("player") ~= NECROSIS_UNIT_WARLOCK then |
||
43 | HideUIPanel(NecrosisShardMenu); |
||
44 | HideUIPanel(NecrosisSpellTimerButton); |
||
45 | HideUIPanel(NecrosisButton); |
||
46 | HideUIPanel(NecrosisPetMenuButton); |
||
47 | HideUIPanel(NecrosisBuffMenuButton); |
||
48 | HideUIPanel(NecrosisCurseMenuButton); |
||
49 | HideUIPanel(NecrosisMountButton); |
||
50 | HideUIPanel(NecrosisFirestoneButton); |
||
51 | HideUIPanel(NecrosisSpellstoneButton); |
||
52 | HideUIPanel(NecrosisHealthstoneButton); |
||
53 | HideUIPanel(NecrosisSoulstoneButton); |
||
54 | HideUIPanel(NecrosisAntiFearButton); |
||
55 | HideUIPanel(NecrosisShadowTranceButton); |
||
56 | else |
||
57 | -- On charge (ou on crée) la configuration pour le joueur et on l'affiche sur la console |
||
58 | if NecrosisConfig == nil or NecrosisConfig.Version ~= Default_NecrosisConfig.Version then |
||
59 | NecrosisConfig = {}; |
||
60 | NecrosisConfig = Default_NecrosisConfig; |
||
61 | Necrosis_Msg(NECROSIS_MESSAGE.Interface.DefaultConfig, "USER"); |
||
62 | NecrosisButton:ClearAllPoints(); |
||
63 | NecrosisShadowTranceButton:ClearAllPoints(); |
||
64 | NecrosisAntiFearButton:ClearAllPoints(); |
||
65 | NecrosisSpellTimerButton:ClearAllPoints(); |
||
66 | NecrosisButton:SetPoint("CENTER", "UIParent", "CENTER",0,-100); |
||
67 | NecrosisShadowTranceButton:SetPoint("CENTER", "UIParent", "CENTER",100,-30); |
||
68 | NecrosisAntiFearButton:SetPoint("CENTER", "UIParent", "CENTER",100,30); |
||
69 | NecrosisSpellTimerButton:SetPoint("CENTER", "UIParent", "CENTER",120,340); |
||
70 | |||
71 | else |
||
72 | Necrosis_Msg(NECROSIS_MESSAGE.Interface.UserConfig, "USER"); |
||
73 | end |
||
74 | |||
75 | ----------------------------------------------------------- |
||
76 | -- Exécution des fonctions de démarrage |
||
77 | ----------------------------------------------------------- |
||
78 | |||
79 | -- Affichage d'un message sur la console |
||
80 | Necrosis_Msg(NECROSIS_MESSAGE.Interface.Welcome, "USER"); |
||
81 | -- Création de la liste des sorts disponibles |
||
82 | Necrosis_SpellSetup(); |
||
83 | -- Création de la liste des emplacements des fragments |
||
84 | Necrosis_SoulshardSetup(); |
||
85 | -- Inventaire des pierres et des fragments possédés par le Démoniste |
||
86 | Necrosis_BagExplore(); |
||
87 | -- Création des menus de buff et d'invocation |
||
88 | Necrosis_CreateMenu(); |
||
89 | |||
90 | -- Lecture de la configuration dans le SavedVariables.lua, écriture dans les variables définies |
||
91 | if (NecrosisConfig.SoulshardSort) then NecrosisSoulshardSort_Button:SetChecked(1); end |
||
92 | if (NecrosisConfig.SoulshardDestroy) then NecrosisSoulshardDestroy_Button:SetChecked(1); end |
||
93 | if (NecrosisConfig.ShadowTranceAlert) then NecrosisShadowTranceAlert_Button:SetChecked(1); end |
||
94 | if (NecrosisConfig.ShowSpellTimers) then NecrosisShowSpellTimers_Button:SetChecked(1); end |
||
95 | if (NecrosisConfig.AntiFearAlert) then NecrosisAntiFearAlert_Button:SetChecked(1); end |
||
96 | if (NecrosisConfig.NecrosisLockServ) then NecrosisIconsLock_Button:SetChecked(1); end |
||
97 | if (NecrosisConfig.StonePosition[1]) then NecrosisShowFirestone_Button:SetChecked(1); end |
||
98 | if (NecrosisConfig.StonePosition[2]) then NecrosisShowSpellstone_Button:SetChecked(1); end |
||
99 | if (NecrosisConfig.StonePosition[3]) then NecrosisShowHealthStone_Button:SetChecked(1); end |
||
100 | if (NecrosisConfig.StonePosition[4]) then NecrosisShowSoulstone_Button:SetChecked(1); end |
||
101 | if (NecrosisConfig.StonePosition[5]) then NecrosisShowBuffMenu_Button:SetChecked(1); end |
||
102 | if (NecrosisConfig.StonePosition[6]) then NecrosisShowMount_Button:SetChecked(1); end |
||
103 | if (NecrosisConfig.StonePosition[7]) then NecrosisShowPetMenu_Button:SetChecked(1); end |
||
104 | if (NecrosisConfig.StonePosition[8]) then NecrosisShowCurseMenu_Button:SetChecked(1); end |
||
105 | if (NecrosisConfig.NecrosisToolTip) then NecrosisShowTooltips_Button:SetChecked(1); end |
||
106 | if (NecrosisConfig.Sound) then NecrosisSound_Button:SetChecked(1); end |
||
107 | if (NecrosisConfig.ShowCount) then NecrosisShowCount_Button:SetChecked(1); end |
||
108 | if (NecrosisConfig.BuffMenuPos == -34) then NecrosisBuffMenu_Button:SetChecked(1); end |
||
109 | if (NecrosisConfig.PetMenuPos == -34) then NecrosisPetMenu_Button:SetChecked(1); end |
||
110 | if (NecrosisConfig.CurseMenuPos == -34) then NecrosisCurseMenu_Button:SetChecked(1); end |
||
111 | if (NecrosisConfig.NoDragAll) then NecrosisLock_Button:SetChecked(1); end |
||
112 | if (NecrosisConfig.SpellTimerPos == -1) then NecrosisSTimer_Button:SetChecked(1); end |
||
113 | if (NecrosisConfig.ChatMsg) then NecrosisShowMessage_Button:SetChecked(1); end |
||
114 | if (NecrosisConfig.DemonSummon) then NecrosisShowDemonSummon_Button:SetChecked(1); end |
||
115 | if (NecrosisConfig.SteedSummon) then NecrosisShowSteedSummon_Button:SetChecked(1); end |
||
116 | if not (NecrosisConfig.ChatType) then NecrosisChatType_Button:SetChecked(1); end |
||
117 | if (NecrosisConfig.Graphical) then NecrosisGraphicalTimer_Button:SetChecked(1); end |
||
118 | if not (NecrosisConfig.Yellow) then NecrosisTimerColor_Button:SetChecked(1); end |
||
119 | if (NecrosisConfig.SensListe == -1) then NecrosisTimerDirection_Button:SetChecked(1); end |
||
120 | |||
121 | -- Paramètres des glissières |
||
122 | NecrosisButtonRotate_Slider:SetValue(NecrosisConfig.NecrosisAngle); |
||
123 | NecrosisButtonRotate_SliderLow:SetText("0"); |
||
124 | NecrosisButtonRotate_SliderHigh:SetText("360"); |
||
125 | |||
126 | if NecrosisConfig.NecrosisLanguage == "deDE" then |
||
127 | NecrosisLanguage_Slider:SetValue(3); |
||
128 | elseif NecrosisConfig.NecrosisLanguage == "enUS" then |
||
129 | NecrosisLanguage_Slider:SetValue(2); |
||
130 | else |
||
131 | NecrosisLanguage_Slider:SetValue(1); |
||
132 | end |
||
133 | NecrosisLanguage_SliderText:SetText("Langue / Language / Sprache"); |
||
134 | NecrosisLanguage_SliderLow:SetText(""); |
||
135 | NecrosisLanguage_SliderHigh:SetText("") |
||
136 | |||
137 | NecrosisBag_Slider:SetValue(4 - NecrosisConfig.SoulshardContainer); |
||
138 | NecrosisBag_SliderLow:SetText("5"); |
||
139 | NecrosisBag_SliderHigh:SetText("1"); |
||
140 | |||
141 | NecrosisCountType_Slider:SetValue(NecrosisConfig.CountType); |
||
142 | NecrosisCountType_SliderLow:SetText(""); |
||
143 | NecrosisCountType_SliderHigh:SetText(""); |
||
144 | |||
145 | NecrosisCircle_Slider:SetValue(NecrosisConfig.Circle); |
||
146 | NecrosisCircle_SliderLow:SetText(""); |
||
147 | NecrosisCircle_SliderHigh:SetText(""); |
||
148 | |||
149 | ShadowTranceScale_Slider:SetValue(NecrosisConfig.ShadowTranceScale); |
||
150 | ShadowTranceScale_SliderLow:SetText("50%"); |
||
151 | ShadowTranceScale_SliderHigh:SetText("150%"); |
||
152 | |||
153 | if (NecrosisConfig.NecrosisColor == "Rose") then |
||
154 | NecrosisColor_Slider:SetValue(1); |
||
155 | elseif (NecrosisConfig.NecrosisColor == "Bleu") then |
||
156 | NecrosisColor_Slider:SetValue(2); |
||
157 | elseif (NecrosisConfig.NecrosisColor == "Orange") then |
||
158 | NecrosisColor_Slider:SetValue(3); |
||
159 | elseif (NecrosisConfig.NecrosisColor == "Turquoise") then |
||
160 | NecrosisColor_Slider:SetValue(4); |
||
161 | elseif (NecrosisConfig.NecrosisColor == "Violet") then |
||
162 | NecrosisColor_Slider:SetValue(5); |
||
163 | else |
||
164 | NecrosisColor_Slider:SetValue(6); |
||
165 | end |
||
166 | NecrosisColor_SliderLow:SetText(""); |
||
167 | NecrosisColor_SliderHigh:SetText(""); |
||
168 | |||
169 | NecrosisButtonScale_Slider:SetValue(NecrosisConfig.NecrosisButtonScale); |
||
170 | NecrosisButtonScale_SliderLow:SetText("50 %"); |
||
171 | NecrosisButtonScale_SliderHigh:SetText("150 %"); |
||
172 | |||
173 | NecrosisBanishScale_Slider:SetValue(NecrosisConfig.BanishScale); |
||
174 | NecrosisBanishScale_SliderLow:SetText("100 %"); |
||
175 | NecrosisBanishScale_SliderHigh:SetText("200 %"); |
||
176 | |||
177 | -- On règle la taille de la pierre et des boutons suivant les réglages du SavedVariables |
||
178 | NecrosisButton:SetScale(NecrosisConfig.NecrosisButtonScale/100); |
||
179 | NecrosisShadowTranceButton:SetScale(NecrosisConfig.ShadowTranceScale/100); |
||
180 | NecrosisAntiFearButton:SetScale(NecrosisConfig.ShadowTranceScale/100); |
||
181 | NecrosisBuffMenu9:SetScale(NecrosisConfig.BanishScale/100); |
||
182 | |||
183 | -- On définit l'affichage des Timers à gauche ou à droite du bouton |
||
184 | NecrosisListSpells:ClearAllPoints(); |
||
185 | NecrosisListSpells:SetJustifyH(NecrosisConfig.SpellTimerJust); |
||
186 | NecrosisListSpells:SetPoint("TOP"..NecrosisConfig.SpellTimerJust, "NecrosisSpellTimerButton", "CENTER", NecrosisConfig.SpellTimerPos * 23, 5); |
||
187 | ShowUIPanel(NecrosisButton); |
||
188 | |||
189 | -- On définit également l'affichage des tooltips pour ces timers à gauche ou à droite du bouton |
||
190 | if NecrosisConfig.SpellTimerJust == -23 then |
||
191 | AnchorSpellTimerTooltip = "ANCHOR_LEFT"; |
||
192 | else |
||
193 | AnchorSpellTimerTooltip = "ANCHOR_RIGHT"; |
||
194 | end |
||
195 | |||
196 | -- On vérifie que les fragments sont dans le sac défini par le Démoniste |
||
197 | Necrosis_SoulshardSwitch("CHECK"); |
||
198 | |||
199 | -- Le Shard est-il vérouillé sur l'interface ? |
||
200 | if NecrosisConfig.NoDragAll then |
||
201 | Necrosis_NoDrag(); |
||
202 | NecrosisButton:RegisterForDrag(""); |
||
203 | NecrosisSpellTimerButton:RegisterForDrag(""); |
||
204 | else |
||
205 | Necrosis_Drag(); |
||
206 | NecrosisButton:RegisterForDrag("LeftButton"); |
||
207 | NecrosisSpellTimerButton:RegisterForDrag("LeftButton"); |
||
208 | end |
||
209 | |||
210 | -- Les boutons sont-ils vérouillés sur le Shard ? |
||
211 | Necrosis_ButtonSetup(); |
||
212 | |||
213 | -- Si le démoniste a une arme une main d'équipée, on lui équipe le premier objet lié main gauche |
||
214 | Necrosis_MoneyToggle(); |
||
215 | NecrosisTooltip:SetInventoryItem("player", 16); |
||
216 | local itemName = tostring(NecrosisTooltipTextLeft2:GetText()); |
||
217 | if itemName == "Soulbound" then |
||
218 | itemName = tostring(NecrosisTooltipTextLeft3:GetText()); |
||
219 | end |
||
220 | Necrosis_MoneyToggle(); |
||
221 | if not GetInventoryItemLink("player", 17) and not string.find(itemName, NECROSIS_ITEM.Twohand) then |
||
222 | Necrosis_SwitchOffHand(NECROSIS_ITEM.Offhand); |
||
223 | end |
||
224 | |||
225 | -- Initialisation des fichiers de langues -- Mise en place éventuelle du SMS |
||
226 | Necrosis_LanguageInitialize(); |
||
227 | if NecrosisConfig.SM then |
||
228 | NECROSIS_SOULSTONE_ALERT_MESSAGE = NECROSIS_SHORT_MESSAGES[1]; |
||
229 | NECROSIS_INVOCATION_MESSAGES = NECROSIS_SHORT_MESSAGES[2]; |
||
230 | end |
||
231 | end |
||
232 | end |
||
233 | |||
234 | function Necrosis_LanguageInitialize() |
||
235 | |||
236 | -- Localisation du speech.lua |
||
237 | NecrosisLocalization(); |
||
238 | |||
239 | -- Localisation du XML |
||
240 | NecrosisVersion:SetText(NecrosisData.Label); |
||
241 | NecrosisShardsInventory_Section:SetText(NECROSIS_CONFIGURATION.ShardMenu); |
||
242 | NecrosisShardsCount_Section:SetText(NECROSIS_CONFIGURATION.ShardMenu2); |
||
243 | NecrosisSoulshardSort_Option:SetText(NECROSIS_CONFIGURATION.ShardMove); |
||
244 | NecrosisSoulshardDestroy_Option:SetText(NECROSIS_CONFIGURATION.ShardDestroy); |
||
245 | |||
246 | NecrosisMessageSpell_Section:SetText(NECROSIS_CONFIGURATION.SpellMenu1); |
||
247 | NecrosisMessagePlayer_Section:SetText(NECROSIS_CONFIGURATION.SpellMenu2); |
||
248 | NecrosisShadowTranceAlert_Option:SetText(NECROSIS_CONFIGURATION.TranseWarning); |
||
249 | NecrosisAntiFearAlert_Option:SetText(NECROSIS_CONFIGURATION.AntiFearWarning); |
||
250 | |||
251 | NecrosisShowTrance_Option:SetText(NECROSIS_CONFIGURATION.TranceButtonView); |
||
252 | NecrosisIconsLock_Option:SetText(NECROSIS_CONFIGURATION.ButtonLock); |
||
253 | |||
254 | NecrosisShowFirestone_Option:SetText(NECROSIS_CONFIGURATION.Show.Firestone); |
||
255 | NecrosisShowSpellstone_Option:SetText(NECROSIS_CONFIGURATION.Show.Spellstone); |
||
256 | NecrosisShowHealthStone_Option:SetText(NECROSIS_CONFIGURATION.Show.Healthstone); |
||
257 | NecrosisShowSoulstone_Option:SetText(NECROSIS_CONFIGURATION.Show.Soulstone); |
||
258 | NecrosisShowMount_Option:SetText(NECROSIS_CONFIGURATION.Show.Steed); |
||
259 | NecrosisShowBuffMenu_Option:SetText(NECROSIS_CONFIGURATION.Show.Buff); |
||
260 | NecrosisShowPetMenu_Option:SetText(NECROSIS_CONFIGURATION.Show.Demon); |
||
261 | NecrosisShowCurseMenu_Option:SetText(NECROSIS_CONFIGURATION.Show.Curse); |
||
262 | NecrosisShowTooltips_Option:SetText(NECROSIS_CONFIGURATION.Show.Tooltips); |
||
263 | |||
264 | NecrosisShowSpellTimers_Option:SetText(NECROSIS_CONFIGURATION.SpellTime); |
||
265 | NecrosisGraphicalTimer_Section:SetText(NECROSIS_CONFIGURATION.TimerMenu); |
||
266 | NecrosisGraphicalTimer_Option:SetText(NECROSIS_CONFIGURATION.GraphicalTimer); |
||
267 | NecrosisTimerColor_Option:SetText(NECROSIS_CONFIGURATION.TimerColor); |
||
268 | NecrosisTimerDirection_Option:SetText(NECROSIS_CONFIGURATION.TimerDirection); |
||
269 | |||
270 | NecrosisLock_Option:SetText(NECROSIS_CONFIGURATION.MainLock); |
||
271 | NecrosisBuffMenu_Option:SetText(NECROSIS_CONFIGURATION.BuffMenu); |
||
272 | NecrosisPetMenu_Option:SetText(NECROSIS_CONFIGURATION.PetMenu); |
||
273 | NecrosisCurseMenu_Option:SetText(NECROSIS_CONFIGURATION.CurseMenu); |
||
274 | NecrosisShowCount_Option:SetText(NECROSIS_CONFIGURATION.ShowCount); |
||
275 | NecrosisSTimer_Option:SetText(NECROSIS_CONFIGURATION.STimerLeft); |
||
276 | |||
277 | NecrosisSound_Option:SetText(NECROSIS_CONFIGURATION.Sound); |
||
278 | NecrosisShowMessage_Option:SetText(NECROSIS_CONFIGURATION.ShowMessage); |
||
279 | NecrosisShowSteedSummon_Option:SetText(NECROSIS_CONFIGURATION.ShowSteedSummon); |
||
280 | NecrosisShowDemonSummon_Option:SetText(NECROSIS_CONFIGURATION.ShowDemonSummon); |
||
281 | NecrosisChatType_Option:SetText(NECROSIS_CONFIGURATION.ChatType); |
||
282 | |||
283 | NecrosisButtonRotate_SliderText:SetText(NECROSIS_CONFIGURATION.MainRotation); |
||
284 | NecrosisCountType_SliderText:SetText(NECROSIS_CONFIGURATION.CountType); |
||
285 | NecrosisCircle_SliderText:SetText(NECROSIS_CONFIGURATION.Circle); |
||
286 | NecrosisBag_SliderText:SetText(NECROSIS_CONFIGURATION.BagSelect); |
||
287 | NecrosisButtonScale_SliderText:SetText(NECROSIS_CONFIGURATION.NecrosisSize); |
||
288 | NecrosisBanishScale_SliderText:SetText(NECROSIS_CONFIGURATION.BanishSize); |
||
289 | ShadowTranceScale_SliderText:SetText(NECROSIS_CONFIGURATION.TranseSize); |
||
290 | NecrosisColor_SliderText:SetText(NECROSIS_CONFIGURATION.Skin); |
||
291 | |||
292 | end |
||
293 | |||
294 | |||
295 | |||
296 | ------------------------------------------------------------------------------------------------------ |
||
297 | -- FONCTION GERANT LA COMMANDE CONSOLE /NECRO |
||
298 | ------------------------------------------------------------------------------------------------------ |
||
299 | |||
300 | function Necrosis_SlashHandler(arg1) |
||
301 | -- Blah blah blah, le joueur est-il bien un Démoniste ? On finira par le savoir ! |
||
302 | if UnitClass("player") ~= NECROSIS_UNIT_WARLOCK then |
||
303 | return; |
||
304 | end |
||
305 | if string.find(string.lower(arg1), "recall") then |
||
306 | NecrosisButton:ClearAllPoints(); |
||
307 | NecrosisButton:SetPoint("CENTER", "UIParent", "CENTER",0,0); |
||
308 | NecrosisSpellTimerButton:ClearAllPoints(); |
||
309 | NecrosisSpellTimerButton:SetPoint("CENTER", "UIParent", "CENTER",0,0); |
||
310 | NecrosisAntiFearButton:ClearAllPoints(); |
||
311 | NecrosisAntiFearButton:SetPoint("CENTER", "UIParent", "CENTER",20,0); |
||
312 | NecrosisShadowTranceButton:ClearAllPoints(); |
||
313 | NecrosisShadowTranceButton:SetPoint("CENTER", "UIParent", "CENTER",-20,0); |
||
314 | elseif string.find(string.lower(arg1), "sm") then |
||
315 | if NECROSIS_SOULSTONE_ALERT_MESSAGE == NECROSIS_SHORT_MESSAGES[1] then |
||
316 | NecrosisConfig.SM = false; |
||
317 | NecrosisLocalization(); |
||
318 | Necrosis_Msg("Short Messages : <red>Off", "USER"); |
||
319 | else |
||
320 | NecrosisConfig.SM = true; |
||
321 | NECROSIS_SOULSTONE_ALERT_MESSAGE = NECROSIS_SHORT_MESSAGES[1]; |
||
322 | NECROSIS_INVOCATION_MESSAGES = NECROSIS_SHORT_MESSAGES[2]; |
||
323 | Necrosis_Msg("Short Messages : <brightGreen>On", "USER"); |
||
324 | end |
||
325 | elseif string.find(string.lower(arg1), "cast") then |
||
326 | NecrosisSpellCast(string.lower(arg1)); |
||
327 | else |
||
328 | if NECROSIS_MESSAGE.Help ~= nil then |
||
329 | for i = 1, table.getn(NECROSIS_MESSAGE.Help), 1 do |
||
330 | Necrosis_Msg(NECROSIS_MESSAGE.Help[i], "USER"); |
||
331 | end |
||
332 | end |
||
333 | Necrosis_Toggle(); |
||
334 | end |
||
335 | end |