PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
// Copyright 2014 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package driver import ( "fmt" "io" "regexp" "sort" "strconv" "strings" "github.com/google/pprof/internal/plugin" "github.com/google/pprof/internal/report" "github.com/google/pprof/profile" ) var commentStart = "//:" // Sentinel for comments on options var tailDigitsRE = regexp.MustCompile("[0-9]+$") // interactive starts a shell to read pprof commands. func interactive(p *profile.Profile, o *plugin.Options) error { // Enter command processing loop. o.UI.SetAutoComplete(newCompleter(functionNames(p))) configure("compact_labels", "true") configHelp["sample_index"] += fmt.Sprintf("Or use sample_index=name, with name in %v.\n", sampleTypes(p)) // Do not wait for the visualizer to complete, to allow multiple // graphs to be visualized simultaneously. interactiveMode = true shortcuts := profileShortcuts(p) copier := makeProfileCopier(p) greetings(p, o.UI) for { input, err := o.UI.ReadLine("(pprof) ") if err != nil { if err != io.EOF { return err } if input == "" { return nil } } for _, input := range shortcuts.expand(input) { // Process assignments of the form variable=value if s := strings.SplitN(input, "=", 2); len(s) > 0 { name := strings.TrimSpace(s[0]) var value string if len(s) == 2 { value = s[1] if comment := strings.LastIndex(value, commentStart); comment != -1 { value = value[:comment] } value = strings.TrimSpace(value) } if isConfigurable(name) { // All non-bool options require inputs if len(s) == 1 && !isBoolConfig(name) { o.UI.PrintErr(fmt.Errorf("please specify a value, e.g. %s=", name)) continue } if name == "sample_index" { // Error check sample_index=xxx to ensure xxx is a valid sample type. index, err := p.SampleIndexByName(value) if err != nil { o.UI.PrintErr(err) continue } if index < 0 || index >= len(p.SampleType) { o.UI.PrintErr(fmt.Errorf("invalid sample_index %q", value)) continue } value = p.SampleType[index].Type } if err := configure(name, value); err != nil { o.UI.PrintErr(err) } continue } } tokens := strings.Fields(input) if len(tokens) == 0 { continue } switch tokens[0] { case "o", "options": printCurrentOptions(p, o.UI) continue case "exit", "quit", "q": return nil case "help": commandHelp(strings.Join(tokens[1:], " "), o.UI) continue } args, cfg, err := parseCommandLine(tokens) if err == nil { err = generateReportWrapper(copier.newCopy(), args, cfg, o) } if err != nil { o.UI.PrintErr(err) } } } } var generateReportWrapper = generateReport // For testing purposes. // greetings prints a brief welcome and some overall profile // information before accepting interactive commands. func greetings(p *profile.Profile, ui plugin.UI) { numLabelUnits := identifyNumLabelUnits(p, ui) ropt, err := reportOptions(p, numLabelUnits, currentConfig()) if err == nil { rpt := report.New(p, ropt) ui.Print(strings.Join(report.ProfileLabels(rpt), "\n")) if rpt.Total() == 0 && len(p.SampleType) > 1 { ui.Print(`No samples were found with the default sample value type.`) ui.Print(`Try "sample_index" command to analyze different sample values.`, "\n") } } ui.Print(`Entering interactive mode (type "help" for commands, "o" for options)`) } // shortcuts represents composite commands that expand into a sequence // of other commands. type shortcuts map[string][]string func (a shortcuts) expand(input string) []string { input = strings.TrimSpace(input) if a != nil { if r, ok := a[input]; ok { return r } } return []string{input} } var pprofShortcuts = shortcuts{ ":": []string{"focus=", "ignore=", "hide=", "tagfocus=", "tagignore="}, } // profileShortcuts creates macros for convenience and backward compatibility. func profileShortcuts(p *profile.Profile) shortcuts { s := pprofShortcuts // Add shortcuts for sample types for _, st := range p.SampleType { command := fmt.Sprintf("sample_index=%s", st.Type) s[st.Type] = []string{command} s["total_"+st.Type] = []string{"mean=0", command} s["mean_"+st.Type] = []string{"mean=1", command} } return s } func sampleTypes(p *profile.Profile) []string { types := make([]string, len(p.SampleType)) for i, t := range p.SampleType { types[i] = t.Type } return types } func printCurrentOptions(p *profile.Profile, ui plugin.UI) { var args []string current := currentConfig() for _, f := range configFields { n := f.name v := current.get(f) comment := "" switch { case len(f.choices) > 0: values := append([]string{}, f.choices...) sort.Strings(values) comment = "[" + strings.Join(values, " | ") + "]" case n == "sample_index": st := sampleTypes(p) if v == "" { // Apply default (last sample index). v = st[len(st)-1] } // Add comments for all sample types in profile. comment = "[" + strings.Join(st, " | ") + "]" case n == "source_path": continue case n == "nodecount" && v == "-1": comment = "default" case v == "": // Add quotes for empty values. v = `""` } if comment != "" { comment = commentStart + " " + comment } args = append(args, fmt.Sprintf(" %-25s = %-20s %s", n, v, comment)) } sort.Strings(args) ui.Print(strings.Join(args, "\n")) } // parseCommandLine parses a command and returns the pprof command to // execute and the configuration to use for the report. func parseCommandLine(input []string) ([]string, config, error) { cmd, args := input[:1], input[1:] name := cmd[0] c := pprofCommands[name] if c == nil { // Attempt splitting digits on abbreviated commands (eg top10) if d := tailDigitsRE.FindString(name); d != "" && d != name { name = name[:len(name)-len(d)] cmd[0], args = name, append([]string{d}, args...) c = pprofCommands[name] } } if c == nil { if _, ok := configHelp[name]; ok { value := "" if len(args) > 0 { value = args[0] } return nil, config{}, fmt.Errorf("did you mean: %s=%s", name, value) } return nil, config{}, fmt.Errorf("unrecognized command: %q", name) } if c.hasParam { if len(args) == 0 { return nil, config{}, fmt.Errorf("command %s requires an argument", name) } cmd = append(cmd, args[0]) args = args[1:] } // Copy config since options set in the command line should not persist. vcopy := currentConfig() var focus, ignore string for i := 0; i < len(args); i++ { t := args[i] if n, err := strconv.ParseInt(t, 10, 32); err == nil { vcopy.NodeCount = int(n) continue } switch t[0] { case '>': outputFile := t[1:] if outputFile == "" { i++ if i >= len(args) { return nil, config{}, fmt.Errorf("unexpected end of line after >") } outputFile = args[i] } vcopy.Output = outputFile case '-': if t == "--cum" || t == "-cum" { vcopy.Sort = "cum" continue } ignore = catRegex(ignore, t[1:]) default: focus = catRegex(focus, t) } } if name == "tags" { if focus != "" { vcopy.TagFocus = focus } if ignore != "" { vcopy.TagIgnore = ignore } } else { if focus != "" { vcopy.Focus = focus } if ignore != "" { vcopy.Ignore = ignore } } if vcopy.NodeCount == -1 && (name == "text" || name == "top") { vcopy.NodeCount = 10 } return cmd, vcopy, nil } func catRegex(a, b string) string { if a != "" && b != "" { return a + "|" + b } return a + b } // commandHelp displays help and usage information for all Commands // and Variables or a specific Command or Variable. func commandHelp(args string, ui plugin.UI) { if args == "" { help := usage(false) help = help + ` : Clear focus/ignore/hide/tagfocus/tagignore type "help " for more information ` ui.Print(help) return } if c := pprofCommands[args]; c != nil { ui.Print(c.help(args)) return } if help, ok := configHelp[args]; ok { ui.Print(help + "\n") return } ui.PrintErr("Unknown command: " + args) } // newCompleter creates an autocompletion function for a set of commands. func newCompleter(fns []string) func(string) string { return func(line string) string { switch tokens := strings.Fields(line); len(tokens) { case 0: // Nothing to complete case 1: // Single token -- complete command name if match := matchVariableOrCommand(tokens[0]); match != "" { return match } case 2: if tokens[0] == "help" { if match := matchVariableOrCommand(tokens[1]); match != "" { return tokens[0] + " " + match } return line } fallthrough default: // Multiple tokens -- complete using functions, except for tags if cmd := pprofCommands[tokens[0]]; cmd != nil && tokens[0] != "tags" { lastTokenIdx := len(tokens) - 1 lastToken := tokens[lastTokenIdx] if strings.HasPrefix(lastToken, "-") { lastToken = "-" + functionCompleter(lastToken[1:], fns) } else { lastToken = functionCompleter(lastToken, fns) } return strings.Join(append(tokens[:lastTokenIdx], lastToken), " ") } } return line } } // matchVariableOrCommand attempts to match a string token to the prefix of a Command. func matchVariableOrCommand(token string) string { token = strings.ToLower(token) var matches []string for cmd := range pprofCommands { if strings.HasPrefix(cmd, token) { matches = append(matches, cmd) } } matches = append(matches, completeConfig(token)...) if len(matches) == 1 { return matches[0] } return "" } // functionCompleter replaces provided substring with a function // name retrieved from a profile if a single match exists. Otherwise, // it returns unchanged substring. It defaults to no-op if the profile // is not specified. func functionCompleter(substring string, fns []string) string { found := "" for _, fName := range fns { if strings.Contains(fName, substring) { if found != "" { return substring } found = fName } } if found != "" { return found } return substring } func functionNames(p *profile.Profile) []string { var fns []string for _, fn := range p.Function { fns = append(fns, fn.Name) } return fns }